diff --git a/.github/workflows/docs-generated-sync.yml b/.github/workflows/docs-generated-sync.yml new file mode 100644 index 0000000000..99484ede29 --- /dev/null +++ b/.github/workflows/docs-generated-sync.yml @@ -0,0 +1,81 @@ +# Regenerates docs/generated after every push to main. If outputs drift, opens or +# updates PR branch chore/docs-generated-sync (peter-evans/create-pull-request). +# Also notifies convoy-website via repository_dispatch (event_type convoy_docs_sync). +# +# Cross-repo dispatch requires repository secret CONVOY_WEBSITE_DISPATCH_TOKEN on this +# repo (see docs/generated/README.md). The token must be allowed to create repository +# dispatch events on ${{ github.repository_owner }}/convoy-website (same org/user as +# this repository is assumed). +# Scope: only paths under add-paths are committed (currently docs/generated/**). +name: Sync generated docs references + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +concurrency: + group: docs-generated-sync-${{ github.repository }} + cancel-in-progress: true + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + + - name: Set up Go + uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6 + with: + go-version: "1.25.7" + + - name: Cache Go modules + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-docs-generated-${{ hashFiles('go.sum') }} + + - name: Download modules + run: go mod download + + - name: Regenerate reference artifacts + run: make docs-generated + + - name: Open or update PR when drift exists + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6 + with: + commit-message: "chore(docs): sync generated reference artifacts" + title: "chore(docs): sync generated reference artifacts" + body: | + This PR was opened automatically because `make docs-generated` produced changes under `docs/generated/` after a push to `main`. + + **What to do:** Review the diff; if it matches the config/CLI changes on `main`, merge to clear drift. + + **Branch:** `chore/docs-generated-sync` is reused and force-updated when new drift appears. + + If `make docs-generated` starts writing additional paths (for example example config files), extend the workflow `add-paths` list in `.github/workflows/docs-generated-sync.yml`. + branch: chore/docs-generated-sync + base: main + delete-branch: false + add-paths: | + docs/generated/** + + notify-convoy-website: + name: Notify convoy-website (repository_dispatch) + needs: sync + runs-on: ubuntu-latest + # Does not use GITHUB_TOKEN; dispatch uses CONVOY_WEBSITE_DISPATCH_TOKEN only. + permissions: {} + steps: + - name: Dispatch convoy_docs_sync + uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0 + with: + token: ${{ secrets.CONVOY_WEBSITE_DISPATCH_TOKEN }} + repository: ${{ github.repository_owner }}/convoy-website + event-type: convoy_docs_sync + client-payload: '{"convoy_ref":"${{ github.sha }}"}' diff --git a/Makefile b/Makefile index 7ef9f0843e..cd6082f68b 100644 --- a/Makefile +++ b/Makefile @@ -105,5 +105,11 @@ migrate_create: generate_docs: swag init --generatedTime --parseDependency --parseInternal -d api/ api/* +.PHONY: docs-generated +docs-generated: + @mkdir -p docs/generated + go run ./scripts/docs/genconfigref -output docs/generated/config-reference.json + go run ./scripts/docs/gencliref -output docs/generated/cli-reference.json + run_dependencies: docker compose -f docker-compose.dep.yml up -d diff --git a/convoy.env.example b/convoy.env.example index bd9d293c93..01a81759ca 100644 --- a/convoy.env.example +++ b/convoy.env.example @@ -1,64 +1,184 @@ -CONVOY_ENV=development -CONVOY_HOST=http://localhost:5005 -CONVOY_ROOT_PATH= - -# Root path for path-based routing behind load balancers -# Example: CONVOY_ROOT_PATH=/convoy -# This allows you to access Convoy at https://yourdomain.com/convoy +# Overrides for config loaded from JSON. Variable names match `envconfig` tags on +# `config.Configuration` (see config/config.go); `envconfig.Process` uses prefix `convoy`. -CONVOY_DB_TYPE=mongodb -CONVOY_DB_DSN=mongodb://localhost:27017/convoy +# --- Core --- +CONVOY_API_VERSION=2025-11-24 +CONVOY_ENV=oss +CONVOY_HOST=localhost:5005 +CONVOY_ROOT_PATH= +CONVOY_CUSTOM_DOMAIN_SUFFIX= +CONVOY_MAX_RESPONSE_SIZE=50 +CONVOY_CONSUMER_POOL_SIZE=100 +CONVOY_INSTANCE_INGEST_RATE=1000 +CONVOY_API_RATE_LIMIT=1000 +CONVOY_WORKER_EXECUTION_MODE=default +CONVOY_MAX_RETRY_SECONDS=0 +CONVOY_ENABLE_FEATURE_FLAG= +CONVOY_ENABLE_PROFILING=false +CONVOY_LICENSE_KEY= +CONVOY_LICENSE_SERVICE_HOST= +CONVOY_LICENSE_SERVICE_VALIDATE_ENDPOINT= +CONVOY_LICENSE_SERVICE_TIMEOUT=0s +CONVOY_LICENSE_SERVICE_RETRY_COUNT=0 -CONVOY_SENTRY_DSN= -CONVOY_SENTRY_SAMPLE_RATE=0.1 -CONVOY_SENTRY_DEBUG=false +# --- HTTP server (tags SSL, PORT, etc.; no CONVOY_ prefix) --- +SSL=false +PORT=5005 +WORKER_PORT=5006 +AGENT_PORT=5008 +INGEST_PORT=5009 +SOCKET_PORT=0 +DOMAIN_PORT=0 +HTTP_PROXY= +CONVOY_SSL_CERT_FILE= +CONVOY_SSL_KEY_FILE= -CONVOY_MUTIPLE_TENANTS=false +# --- Database (Postgres) --- +CONVOY_DB_TYPE=postgres +CONVOY_DB_SCHEME=postgres +CONVOY_DB_HOST=localhost +CONVOY_DB_USERNAME=postgres +CONVOY_DB_PASSWORD=postgres +CONVOY_DB_DATABASE=convoy +CONVOY_DB_OPTIONS=sslmode=disable&connect_timeout=30 +CONVOY_DB_PORT=5432 +CONVOY_DB_DSN= +CONVOY_DB_MAX_OPEN_CONN=0 +CONVOY_DB_MAX_IDLE_CONN=0 +CONVOY_DB_CONN_MAX_LIFETIME=3600 +# JSON array of database objects; only used with read-replica feature where supported +CONVOY_DB_READ_REPLICAS= -CONVOY_LIMITER_PROVIDER=redis -CONVOY_CACHE_PROVIDER=redis -CONVOY_QUEUE_PROVIDER=redis -CONVOY_REDIS_DSN=redis://localhost:6379 +# --- Redis --- +CONVOY_REDIS_SCHEME=redis +CONVOY_REDIS_HOST=localhost +CONVOY_REDIS_USERNAME= +CONVOY_REDIS_PASSWORD= +CONVOY_REDIS_DATABASE= +CONVOY_REDIS_PORT=6379 +CONVOY_REDIS_CLUSTER_ADDRESSES= +CONVOY_REDIS_SENTINEL_MASTER_NAME= CONVOY_REDIS_SENTINEL_USERNAME= CONVOY_REDIS_SENTINEL_PASSWORD= +CONVOY_REDIS_TLS_SKIP_VERIFY=false +CONVOY_REDIS_TLS_CERT_FILE= +CONVOY_REDIS_TLS_KEY_FILE= +CONVOY_REDIS_TLS_CA_CERT_FILE= -CONVOY_LOGGER_LEVEL=info -CONVOY_LOGGER_PROVIDER=console +# --- Prometheus (queue / Asynq metrics address) --- +CONVOY_PROM_DSN= -SSL=false -PORT=5005 -WORKER_PORT=5006 -CONVOY_SSL_KEY_FILE= -CONVOY_SSL_CERT_FILE= - -CONVOY_STRATEGY_TYPE=default -CONVOY_SIGNATURE_HASH=SHA512 -CONVOY_DISABLE_ENDPOINT=false -CONVOY_SIGNATURE_HEADER=X-Convoy-Signature -CONVOY_INTERVAL_SECONDS=10 -CONVOY_RETRY_LIMIT=10 - -CONVOY_SMTP_PROVIDER=sendgrid -CONVOY_SMTP_URL=smtp.sendgrid.net -CONVOY_SMTP_USERNAME=sendgrid-username -CONVOY_SMTP_PASSWORD=sendgrid-password -CONVOY_SMTP_FROM=support@frain.dev -CONVOY_SMTP_PORT=2525 -CONVOY_SMTP_REPLY_TO=support@frain.dev - -CONVOY_NEWRELIC_APP_NAME= -CONVOY_NEWRELIC_LICENSE_KEY= -CONVOY_NEWRELIC_CONFIG_ENABLED=false -CONVOY_NEWRELIC_DISTRIBUTED_TRACER_ENABLED=false - -CONVOY_REQUIRE_AUTH=false -CONVOY_BASIC_AUTH_CONFIG="[{\"username\": \"some-admin\",\"password\": \"some-password\",\"role\": {\"type\": \"super_user\",\"groups\": []}}]" -CONVOY_API_KEY_CONFIG="[{\"api_key\":\"ABC1234\",\"role\":{\"type\":\"admin\",\"groups\":[\"group-uid-1\",\"group-uid-2\"],\"apps\":[\"apps-uid-1\",\"apps-uid-2\"]}}]" +# --- Logger --- +CONVOY_LOGGER_LEVEL=error +# --- Auth realms --- +CONVOY_SIGNUP_ENABLED=true CONVOY_NATIVE_REALM_ENABLED=true - +CONVOY_PORTAL_REALM_ENABLED=true CONVOY_JWT_REALM_ENABLED=true CONVOY_JWT_SECRET= -CONVOY_JWT_EXPIRY= +CONVOY_JWT_EXPIRY=3600 CONVOY_JWT_REFRESH_SECRET= -CONVOY_JWT_REFRESH_EXPIRY= \ No newline at end of file +CONVOY_JWT_REFRESH_EXPIRY=86400 +CONVOY_GOOGLE_OAUTH_ENABLED=false +CONVOY_GOOGLE_OAUTH_CLIENT_ID= +CONVOY_GOOGLE_OAUTH_REDIRECT_URL= +CONVOY_SSO_ENABLED=false +CONVOY_SSO_REDIRECT_URL= +# JSON arrays; file realm for dashboard basic / API key auth +CONVOY_BASIC_AUTH_CONFIG= +CONVOY_API_KEY_CONFIG= + +# --- SMTP --- +CONVOY_SMTP_SSL=false +CONVOY_SMTP_PROVIDER= +CONVOY_SMTP_URL= +CONVOY_SMTP_PORT=587 +CONVOY_SMTP_USERNAME= +CONVOY_SMTP_PASSWORD= +CONVOY_SMTP_FROM= +CONVOY_SMTP_REPLY_TO= + +# --- Tracing --- +CONVOY_TRACER_PROVIDER= +CONVOY_OTEL_SAMPLE_RATE=1 +CONVOY_OTEL_COLLECTOR_URL= +CONVOY_OTEL_INSECURE_SKIP_VERIFY=true +CONVOY_OTEL_AUTH_HEADER_NAME= +CONVOY_OTEL_AUTH_HEADER_VALUE= +CONVOY_SENTRY_DSN= +CONVOY_SENTRY_SAMPLE_RATE=0 +CONVOY_SENTRY_DEBUG=false +CONVOY_SENTRY_ENVIRONMENT= +CONVOY_DATADOG_AGENT_URL= + +# --- Retention & circuit breaker --- +CONVOY_RETENTION_POLICY=720h +CONVOY_RETENTION_POLICY_ENABLED=false +CONVOY_CIRCUIT_BREAKER_SAMPLE_RATE=30 +CONVOY_CIRCUIT_BREAKER_ERROR_TIMEOUT=30 +CONVOY_CIRCUIT_BREAKER_FAILURE_THRESHOLD=70 +CONVOY_CIRCUIT_BREAKER_SUCCESS_THRESHOLD=5 +CONVOY_CIRCUIT_BREAKER_MINIMUM_REQUEST_COUNT=10 +CONVOY_CIRCUIT_BREAKER_OBSERVABILITY_WINDOW=5 +CONVOY_CIRCUIT_BREAKER_CONSECUTIVE_FAILURE_THRESHOLD=10 +CONVOY_CIRCUIT_BREAKER_SKIP_SLEEP=false + +# --- Analytics & storage --- +CONVOY_ANALYTICS_ENABLED=true +CONVOY_STORAGE_POLICY_TYPE=on-prem +CONVOY_STORAGE_AWS_PREFIX= +CONVOY_STORAGE_AWS_BUCKET= +CONVOY_STORAGE_AWS_ACCESS_KEY= +CONVOY_STORAGE_AWS_SECRET_KEY= +CONVOY_STORAGE_AWS_REGION= +CONVOY_STORAGE_AWS_SESSION_TOKEN= +CONVOY_STORAGE_AWS_ENDPOINT= +CONVOY_STORAGE_PREM_PATH= + +# --- Metrics (Prometheus backend when enabled) --- +CONVOY_METRICS_ENABLED=false +CONVOY_METRICS_BACKEND=prometheus +CONVOY_METRICS_SAMPLE_TIME=5 +CONVOY_METRICS_QUERY_TIMEOUT=30 +CONVOY_METRICS_MATERIALIZED_VIEW_REFRESH_INTERVAL=2 + +# --- Pyroscope --- +CONVOY_ENABLE_PYROSCOPE_PROFILING=false +CONVOY_PYROSCOPE_URL= +CONVOY_PYROSCOPE_USERNAME= +CONVOY_PYROSCOPE_PASSWORD= +CONVOY_PYROSCOPE_PROFILE_ID= + +# --- Dispatcher outbound (CIDR lists comma-separated for slices) --- +CONVOY_DISPATCHER_INSECURE_SKIP_VERIFY=false +CONVOY_DISPATCHER_ALLOW_LIST=0.0.0.0/0,::/0 +CONVOY_DISPATCHER_BLOCK_LIST=127.0.0.0/8,::1/128 +CONVOY_DISPATCHER_CACERT_PATH= +CONVOY_DISPATCHER_CACERT_STRING= +CONVOY_DISPATCHER_PING_METHODS=HEAD,GET,POST +CONVOY_DISPATCHER_SKIP_PING_VALIDATION=false + +# --- SSO service (Convoy Cloud / Overwatch integration) --- +CONVOY_SSO_SERVICE_HOST=https://overwatch.getconvoy.cloud +CONVOY_SSO_SERVICE_REDIRECT_PATH=/sso/redirect +CONVOY_SSO_SERVICE_TOKEN_PATH=/sso/token +CONVOY_SSO_SERVICE_ADMIN_PORTAL_PATH=/sso/admin-portal +CONVOY_SSO_SERVICE_TIMEOUT=10s +CONVOY_SSO_SERVICE_RETRY_COUNT=3 + +# --- Billing --- +CONVOY_BILLING_ENABLED=false +CONVOY_BILLING_URL= +CONVOY_BILLING_API_KEY= +CONVOY_BILLING_ORGANISATION_HOST= +CONVOY_PAYMENT_PROVIDER_TYPE= +CONVOY_PAYMENT_PROVIDER_PUBLISHABLE_KEY= + +# --- HCP Vault (optional secrets) --- +CONVOY_HCP_CLIENT_ID= +CONVOY_HCP_CLIENT_SECRET= +CONVOY_HCP_ORG_ID= +CONVOY_HCP_PROJECT_ID= +CONVOY_HCP_APP_NAME= +CONVOY_HCP_SECRET_NAME= diff --git a/convoy.json.example b/convoy.json.example index f3dce28b56..3fb45d463b 100644 --- a/convoy.json.example +++ b/convoy.json.example @@ -1,5 +1,10 @@ { + "api_version": "2025-11-24", "auth": { + "file": { + "basic": [], + "api_key": [] + }, "native": { "enabled": true }, @@ -10,106 +15,201 @@ "refresh_secret": "", "refresh_expiry": 86400 }, + "portal": { + "enabled": true + }, + "google_oauth": { + "enabled": false, + "client_id": "", + "redirect_url": "" + }, + "sso": { + "enabled": false, + "redirect_url": "" + }, "is_signup_enabled": true }, "database": { "type": "postgres", "scheme": "postgres", - "host": "", - "username": "", - "password": "", - "database": "", - "options": "sslmode=disable", + "host": "localhost", + "username": "postgres", + "password": "postgres", + "database": "convoy", + "options": "sslmode=disable&connect_timeout=30", "port": 5432, - "max_open_conn": 100, - "max_idle_conn": 10, - "conn_max_lifetime": 3600 + "dsn": "", + "max_open_conn": 0, + "max_idle_conn": 0, + "conn_max_lifetime": 3600, + "read_replicas": [] }, "redis": { "scheme": "redis", - "host": "", - "username": "", - "password": "", - "database": "0", + "host": "localhost", + "username": "", + "password": "", + "database": "", "port": 6379, - "addresses": "" + "addresses": "", + "master_name": "", + "sentinel_username": "", + "sentinel_password": "", + "tls_skip_verify": false, + "tls_cert_file": "", + "tls_key_file": "", + "tls_ca_cert_file": "" }, "prometheus": { - "dsn": "" + "dsn": "" }, "server": { "http": { - "ssl": true, - "ssl_cert_file": "", - "ssl_key_file": "", + "ssl": false, + "ssl_cert_file": "", + "ssl_key_file": "", "port": 5005, - "ingest_port": 5006, - "worker_port": 5007, - "socket_port": 5008, - "domain_port": 5009, - "proxy": "" + "worker_port": 5006, + "agent_port": 5008, + "ingest_port": 5009, + "socket_port": 0, + "domain_port": 0, + "proxy": "" } }, - "max_response_size": 102400, + "max_response_size": 50, "smtp": { - "ssl": true, - "provider": "", - "url": "", + "ssl": false, + "provider": "", + "url": "", "port": 587, - "username": "", - "password": "", - "from": "", - "reply-to": "" + "username": "", + "password": "", + "from": "", + "reply-to": "" }, - "env": "production", + "env": "oss", "logger": { - "level": "info" + "level": "error" }, "tracer": { - "type": "new_relic", - "new_relic": { - "app_name": "", - "license_key": "", - "config_enabled": true, - "distributed_tracer_enabled": true + "type": "", + "otel": { + "otel_auth": { + "header_name": "", + "header_value": "" + }, + "sample_rate": 1.0, + "collector_url": "", + "insecure_skip_verify": true + }, + "sentry": { + "dsn": "", + "sample_rate": 0, + "debug": false, + "environment": "" + }, + "datadog": { + "agent_url": "" } }, - "host": "", + "host": "localhost:5005", "root_path": "", - "custom_domain_suffix": "", - "feature_flag": "experimental", + "custom_domain_suffix": "", + "enable_feature_flag": [], + "pyroscope": { + "enabled": false, + "url": "", + "username": "", + "password": "", + "profile_id": "" + }, + "retention_policy": { + "policy": "720h", + "enabled": false + }, + "circuit_breaker": { + "sample_rate": 30, + "error_timeout": 30, + "failure_threshold": 70, + "success_threshold": 5, + "minimum_request_count": 10, + "observability_window": 5, + "consecutive_failure_threshold": 10, + "skip_sleep": false + }, "analytics": { "enabled": true }, "storage_policy": { - "type": "s3 | on_prem", + "type": "on-prem", "s3": { - "prefix": "", - "bucket": "", - "access_key": "", - "secret_key": "", - "region": "", - "session_token": "", - "endpoint": "" + "prefix": "", + "bucket": "", + "access_key": "", + "secret_key": "", + "region": "", + "session_token": "", + "endpoint": "" }, "on_prem": { - "path": "" + "path": "" } }, - "consumer_pool_size": 200, + "consumer_pool_size": 100, + "enable_profiling": false, "metrics": { - "metrics_backend": "prometheus", - "prometheus_metrics": { - "sample_time": 5, - "query_timeout": 30, - "materialized_view_refresh_interval": 2 - } + "enabled": false, + "metrics_backend": "prometheus", + "prometheus_metrics": { + "sample_time": 5, + "query_timeout": 30, + "materialized_view_refresh_interval": 2 + } + }, + "instance_ingest_rate": 1000, + "api_rate_limit": 1000, + "worker_execution_mode": "default", + "license_key": "", + "license_service": { + "host": "", + "validate_path": "", + "timeout": 0, + "retry_count": 0 }, "sso_service": { "host": "https://overwatch.getconvoy.cloud", "redirect_path": "/sso/redirect", "token_path": "/sso/token", + "admin_portal_path": "/sso/admin-portal", "timeout": "10s", "retry_count": 3 + }, + "dispatcher": { + "insecure_skip_verify": false, + "allow_list": ["0.0.0.0/0", "::/0"], + "block_list": ["127.0.0.0/8", "::1/128"], + "ca_cert_path": "", + "ca_cert_string": "", + "ping_methods": ["HEAD", "GET", "POST"], + "skip_ping_validation": false + }, + "hcp_vault": { + "client_id": "", + "client_secret": "", + "org_id": "", + "project_id": "", + "app_name": "", + "secret_name": "" + }, + "billing": { + "enabled": false, + "url": "", + "api_key": "", + "organisation_host": "", + "payment_provider": { + "type": "", + "publishable_key": "" + } } } diff --git a/docs/generated/README.md b/docs/generated/README.md new file mode 100644 index 0000000000..96e0cec0d6 --- /dev/null +++ b/docs/generated/README.md @@ -0,0 +1,43 @@ +# Generated reference artifacts + +These files are generated from the Convoy source tree so documentation can diff against a stable snapshot. + +| File | Generator | +|------|-----------| +| `config-reference.json` | `scripts/docs/genconfigref`: walks `config.Configuration` struct tags (`json`, `envconfig`) and reads defaults from `config.DefaultConfiguration`. | +| `cli-reference.json` | `scripts/docs/gencliref`: builds a Cobra tree (root persistent flags aligned with `cmd/main.go`, plus `server`, `agent`, `migrate`, and `config` subcommands) and exports commands, help strings, and flags. | + +## Regenerate + +From the repository root: + +```bash +make docs-generated +``` + +Or directly: + +```bash +go run ./scripts/docs/genconfigref -output docs/generated/config-reference.json +go run ./scripts/docs/gencliref -output docs/generated/cli-reference.json +``` + +## Drift checks + +After changing `config/config.go`, env tags, defaults, CLI flags in `cmd/main.go`, or Cobra commands under `cmd/server`, `cmd/agent`, `cmd/migrate`, or `cmd/config`, regenerate and commit. In review or CI, run `make docs-generated` and assert a clean `git diff` for `docs/generated/`. + +## CI sync (main) + +On each push to `main`, the workflow [docs-generated-sync.yml](../../.github/workflows/docs-generated-sync.yml) runs `make docs-generated`. If `docs/generated/` changes, it opens or updates pull request branch `chore/docs-generated-sync` against `main` (only files under `docs/generated/` are included). That job uses the default `GITHUB_TOKEN` with `contents` and `pull-requests` write permission. + +### Notify convoy-website (cross-repo) + +A second job (`needs: sync`) runs only after the sync job succeeds. It sends `repository_dispatch` to `${GITHUB_REPOSITORY_OWNER}/convoy-website` with `event_type` `convoy_docs_sync` and `client_payload.convoy_ref` set to the push commit SHA (`github.sha`), so the website repo can check out that ref. + +**Repository secret (required on the Convoy server repo):** `CONVOY_WEBSITE_DISPATCH_TOKEN`: a personal access token (classic: `repo` scope, or fine-grained: **Contents** write on `convoy-website`) allowed to call the GitHub API and create a repository dispatch on the target repo. Add it under **Settings → Secrets and variables → Actions** on this repository. + +If the sync job fails, the dispatch job is skipped. If the secret is missing or the token lacks access to `convoy-website`, the dispatch job fails after sync completes successfully. + +## Maintaining `gencliref` + +Root-level persistent flags are duplicated in `scripts/docs/gencliref/main.go` so the generator does not run `cmd/main.go` (that would run bootstrap hooks). When you add or change global CLI flags, update that block to match `cmd/main.go`. diff --git a/docs/generated/cli-reference.json b/docs/generated/cli-reference.json new file mode 100644 index 0000000000..55359b7d62 --- /dev/null +++ b/docs/generated/cli-reference.json @@ -0,0 +1,4388 @@ +{ + "source": "cobra tree: scripts/docs/gencliref (mirrors cmd/main.go root flags + server|agent|migrate|config)", + "commands": [ + { + "path": [], + "use": "Convoy", + "short": "High Performance Webhooks Gateway", + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "root_persistent" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "root_persistent" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type" + ] + }, + { + "path": [ + "agent" + ], + "use": "agent", + "short": "Start agent instance", + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "consumers", + "usage": "Size of the consumers pool.", + "default": "-1", + "def_value": "-1", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "interval", + "usage": "the time interval, measured in seconds to update the in-memory store from the database", + "default": "10", + "def_value": "10", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "mode", + "usage": "Execution Mode (one of events, retry and default)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "port", + "usage": "Agent port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "smtp-from", + "usage": "Sender email address", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-password", + "usage": "SMTP authentication password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-port", + "usage": "SMTP Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-provider", + "usage": "SMTP provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-reply-to", + "usage": "Email address to reply to", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-ssl", + "usage": "Enable SMTP SSL", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-url", + "usage": "SMTP provider URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "smtp-username", + "usage": "SMTP authentication username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type", + "consumers", + "interval", + "mode", + "port", + "smtp-from", + "smtp-password", + "smtp-port", + "smtp-provider", + "smtp-reply-to", + "smtp-ssl", + "smtp-url", + "smtp-username" + ] + }, + { + "path": [ + "config" + ], + "use": "config", + "short": "config outputs your instances computed configuration", + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type" + ] + }, + { + "path": [ + "migrate" + ], + "use": "migrate", + "short": "Convoy migrations", + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type" + ] + }, + { + "path": [ + "migrate", + "create" + ], + "use": "create", + "short": "creates a new migration file", + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type" + ] + }, + { + "path": [ + "migrate", + "down" + ], + "use": "down", + "short": "Rollback migrations", + "aliases": [ + "migrate-down" + ], + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max", + "usage": "The maximum number of migrations to rollback", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type", + "max" + ] + }, + { + "path": [ + "migrate", + "up" + ], + "use": "up", + "short": "Run all pending migrations", + "aliases": [ + "migrate-up" + ], + "flags": [ + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type" + ] + }, + { + "path": [ + "server" + ], + "use": "server", + "short": "Start the HTTP server", + "aliases": [ + "serve", + "s" + ], + "flags": [ + { + "name": "api-auth", + "usage": "API-Key authentication credentials", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "api-rate-limit", + "usage": "API rate limit", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "basic-auth", + "usage": "Basic authentication credentials", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "billing-api-key", + "usage": "Billing service API key (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "billing-url", + "usage": "Billing service URL (required when billing is enabled)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "cache", + "usage": "Cache Provider (\"redis\" or \"in-memory\")", + "default": "redis", + "def_value": "redis", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "config", + "usage": "Configuration file for convoy", + "default": "./convoy.json", + "def_value": "./convoy.json", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "datadog-agent-url", + "usage": "Datadog agent URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-database", + "usage": "Database Database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-host", + "usage": "Database Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-options", + "usage": "Database Options", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-password", + "usage": "Database Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-port", + "usage": "Database Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-scheme", + "usage": "Database Scheme", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-type", + "usage": "Database provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "db-username", + "usage": "Database Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-billing", + "usage": "Enable billing functionality", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-feature-flag", + "usage": "List of feature flags to enable e.g. \"full-text-search,prometheus\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "enable-profiling", + "usage": "Enable profiling and exporting profile data to pyroscope", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "env", + "usage": "Convoy environment", + "default": "development", + "def_value": "development", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "hcp-app-name", + "usage": "HCP Vault app name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-cache-duration", + "usage": "HCP Vault key cache duration", + "default": "5m0s", + "def_value": "5m0s", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-id", + "usage": "HCP Vault client ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-client-secret", + "usage": "HCP Vault client secret", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-org-id", + "usage": "HCP Vault organization ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-project-id", + "usage": "HCP Vault project ID", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "hcp-secret-name", + "usage": "HCP Vault secret name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "host", + "usage": "Host - The application host name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "instance-ingest-rate", + "usage": "Instance ingest Rate", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-allow-list", + "usage": "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ip-block-list", + "usage": "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "license-key", + "usage": "Convoy license key", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "limiter", + "usage": "Rate limiter provider (\"redis\" or \"in-memory\")", + "default": "redis", + "def_value": "redis", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "log-level", + "usage": "Log level", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "logger", + "usage": "Logger", + "default": "info", + "def_value": "info", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "max-response-size", + "usage": "Max response size", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "max-retry-seconds", + "usage": "Max retry seconds exponential backoff", + "default": "7200", + "def_value": "7200", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-backend", + "usage": "Metrics backend e.g. prometheus. ('prometheus' feature flag required", + "default": "prometheus", + "def_value": "prometheus", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-materialized-view-refresh-interval", + "usage": "Materialized view refresh interval in minutes", + "default": "2", + "def_value": "2", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-query-timeout", + "usage": "Prometheus metrics query timeout in seconds", + "default": "30", + "def_value": "30", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "metrics-prometheus-sample-time", + "usage": "Prometheus metrics sample time", + "default": "5", + "def_value": "5", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "native", + "usage": "Enable native-realm authentication", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "otel-auth-header-name", + "usage": "OTel backend auth header name", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-auth-header-value", + "usage": "OTel backend auth header value", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-collector-url", + "usage": "OTel collector URL", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "otel-sample-rate", + "usage": "OTel tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "port", + "usage": "Server port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "promaddr", + "usage": "Prometheus dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "proxy", + "usage": "HTTP Proxy", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "read-replicas-dsn", + "usage": "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db", + "default": "[]", + "def_value": "[]", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-addresses", + "usage": "Redis addresses (comma-separated, for cluster or sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-database", + "usage": "Redis database", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-host", + "usage": "Redis Host", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-password", + "usage": "Redis Password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-port", + "usage": "Redis Port", + "default": "0", + "def_value": "0", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-scheme", + "usage": "Redis Scheme (redis, redis-sentinel, rediss)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-master-name", + "usage": "Redis Sentinel master name (required when scheme is redis-sentinel)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-password", + "usage": "Redis Sentinel password", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-sentinel-username", + "usage": "Redis Sentinel username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-type", + "usage": "Redis provider", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "redis-username", + "usage": "Redis Username", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy", + "usage": "Retention Policy Duration", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "retention-policy-enabled", + "usage": "Retention Policy Enabled", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "root-path", + "usage": "Root path for routing behind load balancers (e.g., /convoy)", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-debug", + "usage": "Enable Sentry debug logging", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-dsn", + "usage": "Sentry backend dsn", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "sentry-sample-rate", + "usage": "Sentry tracing sample rate", + "default": "1", + "def_value": "1", + "hidden": false, + "flag_scope": "inherited" + }, + { + "name": "ssl", + "usage": "Configure SSL", + "default": "false", + "def_value": "false", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "ssl-cert-file", + "usage": "SSL certificate file", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "ssl-key-file", + "usage": "SSL key file", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "local" + }, + { + "name": "tracer-type", + "usage": "Tracer backend, e.g. sentry, datadog or otel", + "default": "", + "def_value": "", + "hidden": false, + "flag_scope": "inherited" + } + ], + "flag_order": [ + "api-rate-limit", + "billing-api-key", + "billing-url", + "config", + "datadog-agent-url", + "db-database", + "db-host", + "db-options", + "db-password", + "db-port", + "db-scheme", + "db-type", + "db-username", + "enable-billing", + "enable-feature-flag", + "enable-profiling", + "hcp-app-name", + "hcp-cache-duration", + "hcp-client-id", + "hcp-client-secret", + "hcp-org-id", + "hcp-project-id", + "hcp-secret-name", + "instance-ingest-rate", + "ip-allow-list", + "ip-block-list", + "license-key", + "log-level", + "max-retry-seconds", + "metrics-backend", + "metrics-prometheus-materialized-view-refresh-interval", + "metrics-prometheus-query-timeout", + "metrics-prometheus-sample-time", + "otel-auth-header-name", + "otel-auth-header-value", + "otel-collector-url", + "otel-sample-rate", + "read-replicas-dsn", + "redis-addresses", + "redis-database", + "redis-host", + "redis-password", + "redis-port", + "redis-scheme", + "redis-sentinel-master-name", + "redis-sentinel-password", + "redis-sentinel-username", + "redis-type", + "redis-username", + "retention-policy", + "retention-policy-enabled", + "root-path", + "sentry-debug", + "sentry-dsn", + "sentry-sample-rate", + "tracer-type", + "api-auth", + "basic-auth", + "cache", + "env", + "host", + "limiter", + "logger", + "max-response-size", + "native", + "port", + "promaddr", + "proxy", + "ssl", + "ssl-cert-file", + "ssl-key-file" + ] + } + ] +} diff --git a/docs/generated/config-reference.json b/docs/generated/config-reference.json new file mode 100644 index 0000000000..90b8544212 --- /dev/null +++ b/docs/generated/config-reference.json @@ -0,0 +1,899 @@ +{ + "source": "github.com/frain-dev/convoy/config.DefaultConfiguration", + "entries": [ + { + "json_path": "server.http.agent_port", + "env_var": "AGENT_PORT", + "go_type": "uint32", + "default": "5008" + }, + { + "json_path": "analytics.enabled", + "env_var": "CONVOY_ANALYTICS_ENABLED", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "auth.file.api_key", + "env_var": "CONVOY_API_KEY_CONFIG", + "go_type": "config.APIKeyAuthConfig", + "default": "null" + }, + { + "json_path": "api_rate_limit", + "env_var": "CONVOY_API_RATE_LIMIT", + "go_type": "int", + "default": "1000" + }, + { + "json_path": "api_version", + "env_var": "CONVOY_API_VERSION", + "go_type": "string", + "default": "2025-11-24" + }, + { + "json_path": "auth.file.basic", + "env_var": "CONVOY_BASIC_AUTH_CONFIG", + "go_type": "config.BasicAuthConfig", + "default": "null" + }, + { + "json_path": "billing.api_key", + "env_var": "CONVOY_BILLING_API_KEY", + "go_type": "string", + "default": "" + }, + { + "json_path": "billing.enabled", + "env_var": "CONVOY_BILLING_ENABLED", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "billing.organisation_host", + "env_var": "CONVOY_BILLING_ORGANISATION_HOST", + "go_type": "string", + "default": "" + }, + { + "json_path": "billing.url", + "env_var": "CONVOY_BILLING_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "circuit_breaker.consecutive_failure_threshold", + "env_var": "CONVOY_CIRCUIT_BREAKER_CONSECUTIVE_FAILURE_THRESHOLD", + "go_type": "uint64", + "default": "10" + }, + { + "json_path": "circuit_breaker.error_timeout", + "env_var": "CONVOY_CIRCUIT_BREAKER_ERROR_TIMEOUT", + "go_type": "uint64", + "default": "30" + }, + { + "json_path": "circuit_breaker.failure_threshold", + "env_var": "CONVOY_CIRCUIT_BREAKER_FAILURE_THRESHOLD", + "go_type": "uint64", + "default": "70" + }, + { + "json_path": "circuit_breaker.minimum_request_count", + "env_var": "CONVOY_CIRCUIT_BREAKER_MINIMUM_REQUEST_COUNT", + "go_type": "uint64", + "default": "10" + }, + { + "json_path": "circuit_breaker.observability_window", + "env_var": "CONVOY_CIRCUIT_BREAKER_OBSERVABILITY_WINDOW", + "go_type": "uint64", + "default": "5" + }, + { + "json_path": "circuit_breaker.sample_rate", + "env_var": "CONVOY_CIRCUIT_BREAKER_SAMPLE_RATE", + "go_type": "uint64", + "default": "30" + }, + { + "json_path": "circuit_breaker.skip_sleep", + "env_var": "CONVOY_CIRCUIT_BREAKER_SKIP_SLEEP", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "circuit_breaker.success_threshold", + "env_var": "CONVOY_CIRCUIT_BREAKER_SUCCESS_THRESHOLD", + "go_type": "uint64", + "default": "5" + }, + { + "json_path": "consumer_pool_size", + "env_var": "CONVOY_CONSUMER_POOL_SIZE", + "go_type": "int", + "default": "100" + }, + { + "json_path": "custom_domain_suffix", + "env_var": "CONVOY_CUSTOM_DOMAIN_SUFFIX", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.datadog.agent_url", + "env_var": "CONVOY_DATADOG_AGENT_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "database.conn_max_lifetime", + "env_var": "CONVOY_DB_CONN_MAX_LIFETIME", + "go_type": "int", + "default": "3600" + }, + { + "json_path": "database.database", + "env_var": "CONVOY_DB_DATABASE", + "go_type": "string", + "default": "convoy" + }, + { + "json_path": "database.dsn", + "env_var": "CONVOY_DB_DSN", + "go_type": "string", + "default": "" + }, + { + "json_path": "database.host", + "env_var": "CONVOY_DB_HOST", + "go_type": "string", + "default": "localhost" + }, + { + "json_path": "database.max_idle_conn", + "env_var": "CONVOY_DB_MAX_IDLE_CONN", + "go_type": "int", + "default": "0" + }, + { + "json_path": "database.max_open_conn", + "env_var": "CONVOY_DB_MAX_OPEN_CONN", + "go_type": "int", + "default": "0" + }, + { + "json_path": "database.options", + "env_var": "CONVOY_DB_OPTIONS", + "go_type": "string", + "default": "sslmode=disable&connect_timeout=30" + }, + { + "json_path": "database.password", + "env_var": "CONVOY_DB_PASSWORD", + "go_type": "string", + "default": "postgres" + }, + { + "json_path": "database.port", + "env_var": "CONVOY_DB_PORT", + "go_type": "int", + "default": "5432" + }, + { + "json_path": "database.read_replicas", + "env_var": "CONVOY_DB_READ_REPLICAS", + "go_type": "config.ReadReplicaConfiguration", + "default": "null" + }, + { + "json_path": "database.scheme", + "env_var": "CONVOY_DB_SCHEME", + "go_type": "string", + "default": "postgres" + }, + { + "json_path": "database.type", + "env_var": "CONVOY_DB_TYPE", + "go_type": "config.DatabaseProvider", + "default": "postgres" + }, + { + "json_path": "database.username", + "env_var": "CONVOY_DB_USERNAME", + "go_type": "string", + "default": "postgres" + }, + { + "json_path": "dispatcher.allow_list", + "env_var": "CONVOY_DISPATCHER_ALLOW_LIST", + "go_type": "[]string", + "default": "[\"0.0.0.0/0\",\"::/0\"]" + }, + { + "json_path": "dispatcher.block_list", + "env_var": "CONVOY_DISPATCHER_BLOCK_LIST", + "go_type": "[]string", + "default": "[\"127.0.0.0/8\",\"::1/128\"]" + }, + { + "json_path": "dispatcher.ca_cert_path", + "env_var": "CONVOY_DISPATCHER_CACERT_PATH", + "go_type": "string", + "default": "" + }, + { + "json_path": "dispatcher.ca_cert_string", + "env_var": "CONVOY_DISPATCHER_CACERT_STRING", + "go_type": "string", + "default": "" + }, + { + "json_path": "dispatcher.insecure_skip_verify", + "env_var": "CONVOY_DISPATCHER_INSECURE_SKIP_VERIFY", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "dispatcher.ping_methods", + "env_var": "CONVOY_DISPATCHER_PING_METHODS", + "go_type": "[]string", + "default": "[\"HEAD\",\"GET\",\"POST\"]" + }, + { + "json_path": "dispatcher.skip_ping_validation", + "env_var": "CONVOY_DISPATCHER_SKIP_PING_VALIDATION", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "enable_feature_flag", + "env_var": "CONVOY_ENABLE_FEATURE_FLAG", + "go_type": "[]string", + "default": "null" + }, + { + "json_path": "enable_profiling", + "env_var": "CONVOY_ENABLE_PROFILING", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "pyroscope.enabled", + "env_var": "CONVOY_ENABLE_PYROSCOPE_PROFILING", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "env", + "env_var": "CONVOY_ENV", + "go_type": "string", + "default": "oss" + }, + { + "json_path": "auth.google_oauth.client_id", + "env_var": "CONVOY_GOOGLE_OAUTH_CLIENT_ID", + "go_type": "string", + "default": "" + }, + { + "json_path": "auth.google_oauth.enabled", + "env_var": "CONVOY_GOOGLE_OAUTH_ENABLED", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "auth.google_oauth.redirect_url", + "env_var": "CONVOY_GOOGLE_OAUTH_REDIRECT_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.app_name", + "env_var": "CONVOY_HCP_APP_NAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.client_id", + "env_var": "CONVOY_HCP_CLIENT_ID", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.client_secret", + "env_var": "CONVOY_HCP_CLIENT_SECRET", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.org_id", + "env_var": "CONVOY_HCP_ORG_ID", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.project_id", + "env_var": "CONVOY_HCP_PROJECT_ID", + "go_type": "string", + "default": "" + }, + { + "json_path": "hcp_vault.secret_name", + "env_var": "CONVOY_HCP_SECRET_NAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "host", + "env_var": "CONVOY_HOST", + "go_type": "string", + "default": "localhost:5005" + }, + { + "json_path": "instance_ingest_rate", + "env_var": "CONVOY_INSTANCE_INGEST_RATE", + "go_type": "int", + "default": "1000" + }, + { + "json_path": "auth.jwt.expiry", + "env_var": "CONVOY_JWT_EXPIRY", + "go_type": "int", + "default": "0" + }, + { + "json_path": "auth.jwt.enabled", + "env_var": "CONVOY_JWT_REALM_ENABLED", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "auth.jwt.refresh_expiry", + "env_var": "CONVOY_JWT_REFRESH_EXPIRY", + "go_type": "int", + "default": "0" + }, + { + "json_path": "auth.jwt.refresh_secret", + "env_var": "CONVOY_JWT_REFRESH_SECRET", + "go_type": "string", + "default": "" + }, + { + "json_path": "auth.jwt.secret", + "env_var": "CONVOY_JWT_SECRET", + "go_type": "string", + "default": "" + }, + { + "json_path": "license_key", + "env_var": "CONVOY_LICENSE_KEY", + "go_type": "string", + "default": "" + }, + { + "json_path": "license_service", + "env_var": "CONVOY_LICENSE_SERVICE", + "go_type": "config.LicenseServiceConfiguration", + "default": "{\"host\":\"\",\"validate_path\":\"\",\"timeout\":0,\"retry_count\":0}" + }, + { + "json_path": "license_service.host", + "env_var": "CONVOY_LICENSE_SERVICE_HOST", + "go_type": "string", + "default": "" + }, + { + "json_path": "license_service.retry_count", + "env_var": "CONVOY_LICENSE_SERVICE_RETRY_COUNT", + "go_type": "int", + "default": "0" + }, + { + "json_path": "license_service.timeout", + "env_var": "CONVOY_LICENSE_SERVICE_TIMEOUT", + "go_type": "time.Duration", + "default": "0s" + }, + { + "json_path": "license_service.validate_path", + "env_var": "CONVOY_LICENSE_SERVICE_VALIDATE_ENDPOINT", + "go_type": "string", + "default": "" + }, + { + "json_path": "logger.level", + "env_var": "CONVOY_LOGGER_LEVEL", + "go_type": "string", + "default": "error" + }, + { + "json_path": "max_response_size", + "env_var": "CONVOY_MAX_RESPONSE_SIZE", + "go_type": "uint64", + "default": "50" + }, + { + "json_path": "max_retry_seconds", + "env_var": "CONVOY_MAX_RETRY_SECONDS", + "go_type": "uint64", + "default": "0" + }, + { + "json_path": "metrics", + "env_var": "CONVOY_METRICS", + "go_type": "config.MetricsConfiguration", + "default": "{\"enabled\":false,\"metrics_backend\":\"prometheus\",\"prometheus_metrics\":{\"sample_time\":5,\"query_timeout\":30,\"materialized_view_refresh_interval\":2}}" + }, + { + "json_path": "metrics.metrics_backend", + "env_var": "CONVOY_METRICS_BACKEND", + "go_type": "config.MetricsBackend", + "default": "prometheus" + }, + { + "json_path": "metrics.enabled", + "env_var": "CONVOY_METRICS_ENABLED", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "metrics.prometheus_metrics.materialized_view_refresh_interval", + "env_var": "CONVOY_METRICS_MATERIALIZED_VIEW_REFRESH_INTERVAL", + "go_type": "uint64", + "default": "2" + }, + { + "json_path": "metrics.prometheus_metrics.query_timeout", + "env_var": "CONVOY_METRICS_QUERY_TIMEOUT", + "go_type": "uint64", + "default": "30" + }, + { + "json_path": "metrics.prometheus_metrics.sample_time", + "env_var": "CONVOY_METRICS_SAMPLE_TIME", + "go_type": "uint64", + "default": "5" + }, + { + "json_path": "auth.native.enabled", + "env_var": "CONVOY_NATIVE_REALM_ENABLED", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "tracer.otel.otel_auth.header_name", + "env_var": "CONVOY_OTEL_AUTH_HEADER_NAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.otel.otel_auth.header_value", + "env_var": "CONVOY_OTEL_AUTH_HEADER_VALUE", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.otel.collector_url", + "env_var": "CONVOY_OTEL_COLLECTOR_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.otel.insecure_skip_verify", + "env_var": "CONVOY_OTEL_INSECURE_SKIP_VERIFY", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "tracer.otel.sample_rate", + "env_var": "CONVOY_OTEL_SAMPLE_RATE", + "go_type": "float64", + "default": "1" + }, + { + "json_path": "billing.payment_provider.publishable_key", + "env_var": "CONVOY_PAYMENT_PROVIDER_PUBLISHABLE_KEY", + "go_type": "string", + "default": "" + }, + { + "json_path": "billing.payment_provider.type", + "env_var": "CONVOY_PAYMENT_PROVIDER_TYPE", + "go_type": "string", + "default": "" + }, + { + "json_path": "auth.portal.enabled", + "env_var": "CONVOY_PORTAL_REALM_ENABLED", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "prometheus.dsn", + "env_var": "CONVOY_PROM_DSN", + "go_type": "string", + "default": "" + }, + { + "json_path": "pyroscope.password", + "env_var": "CONVOY_PYROSCOPE_PASSWORD", + "go_type": "string", + "default": "" + }, + { + "json_path": "pyroscope.profile_id", + "env_var": "CONVOY_PYROSCOPE_PROFILE_ID", + "go_type": "string", + "default": "" + }, + { + "json_path": "pyroscope.url", + "env_var": "CONVOY_PYROSCOPE_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "pyroscope.username", + "env_var": "CONVOY_PYROSCOPE_USERNAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.addresses", + "env_var": "CONVOY_REDIS_CLUSTER_ADDRESSES", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.database", + "env_var": "CONVOY_REDIS_DATABASE", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.host", + "env_var": "CONVOY_REDIS_HOST", + "go_type": "string", + "default": "localhost" + }, + { + "json_path": "redis.password", + "env_var": "CONVOY_REDIS_PASSWORD", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.port", + "env_var": "CONVOY_REDIS_PORT", + "go_type": "int", + "default": "6379" + }, + { + "json_path": "redis.scheme", + "env_var": "CONVOY_REDIS_SCHEME", + "go_type": "string", + "default": "redis" + }, + { + "json_path": "redis.master_name", + "env_var": "CONVOY_REDIS_SENTINEL_MASTER_NAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.sentinel_password", + "env_var": "CONVOY_REDIS_SENTINEL_PASSWORD", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.sentinel_username", + "env_var": "CONVOY_REDIS_SENTINEL_USERNAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.tls_ca_cert_file", + "env_var": "CONVOY_REDIS_TLS_CA_CERT_FILE", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.tls_cert_file", + "env_var": "CONVOY_REDIS_TLS_CERT_FILE", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.tls_key_file", + "env_var": "CONVOY_REDIS_TLS_KEY_FILE", + "go_type": "string", + "default": "" + }, + { + "json_path": "redis.tls_skip_verify", + "env_var": "CONVOY_REDIS_TLS_SKIP_VERIFY", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "redis.username", + "env_var": "CONVOY_REDIS_USERNAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "retention_policy.policy", + "env_var": "CONVOY_RETENTION_POLICY", + "go_type": "string", + "default": "720h" + }, + { + "json_path": "retention_policy.enabled", + "env_var": "CONVOY_RETENTION_POLICY_ENABLED", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "root_path", + "env_var": "CONVOY_ROOT_PATH", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.sentry.debug", + "env_var": "CONVOY_SENTRY_DEBUG", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "tracer.sentry.dsn", + "env_var": "CONVOY_SENTRY_DSN", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.sentry.environment", + "env_var": "CONVOY_SENTRY_ENVIRONMENT", + "go_type": "string", + "default": "" + }, + { + "json_path": "tracer.sentry.sample_rate", + "env_var": "CONVOY_SENTRY_SAMPLE_RATE", + "go_type": "float64", + "default": "0" + }, + { + "json_path": "auth.is_signup_enabled", + "env_var": "CONVOY_SIGNUP_ENABLED", + "go_type": "bool", + "default": "true" + }, + { + "json_path": "smtp.from", + "env_var": "CONVOY_SMTP_FROM", + "go_type": "string", + "default": "" + }, + { + "json_path": "smtp.password", + "env_var": "CONVOY_SMTP_PASSWORD", + "go_type": "string", + "default": "" + }, + { + "json_path": "smtp.port", + "env_var": "CONVOY_SMTP_PORT", + "go_type": "uint32", + "default": "0" + }, + { + "json_path": "smtp.provider", + "env_var": "CONVOY_SMTP_PROVIDER", + "go_type": "string", + "default": "" + }, + { + "json_path": "smtp.reply-to", + "env_var": "CONVOY_SMTP_REPLY_TO", + "go_type": "string", + "default": "" + }, + { + "json_path": "smtp.ssl", + "env_var": "CONVOY_SMTP_SSL", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "smtp.url", + "env_var": "CONVOY_SMTP_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "smtp.username", + "env_var": "CONVOY_SMTP_USERNAME", + "go_type": "string", + "default": "" + }, + { + "json_path": "server.http.ssl_cert_file", + "env_var": "CONVOY_SSL_CERT_FILE", + "go_type": "string", + "default": "" + }, + { + "json_path": "server.http.ssl_key_file", + "env_var": "CONVOY_SSL_KEY_FILE", + "go_type": "string", + "default": "" + }, + { + "json_path": "auth.sso.enabled", + "env_var": "CONVOY_SSO_ENABLED", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "auth.sso.redirect_url", + "env_var": "CONVOY_SSO_REDIRECT_URL", + "go_type": "string", + "default": "" + }, + { + "json_path": "sso_service", + "env_var": "CONVOY_SSO_SERVICE", + "go_type": "config.SSOServiceConfiguration", + "default": "{\"host\":\"https://overwatch.getconvoy.cloud\",\"redirect_path\":\"/sso/redirect\",\"token_path\":\"/sso/token\",\"admin_portal_path\":\"/sso/admin-portal\",\"timeout\":\"\",\"retry_count\":3}" + }, + { + "json_path": "sso_service.admin_portal_path", + "env_var": "CONVOY_SSO_SERVICE_ADMIN_PORTAL_PATH", + "go_type": "string", + "default": "/sso/admin-portal" + }, + { + "json_path": "sso_service.host", + "env_var": "CONVOY_SSO_SERVICE_HOST", + "go_type": "string", + "default": "https://overwatch.getconvoy.cloud" + }, + { + "json_path": "sso_service.redirect_path", + "env_var": "CONVOY_SSO_SERVICE_REDIRECT_PATH", + "go_type": "string", + "default": "/sso/redirect" + }, + { + "json_path": "sso_service.retry_count", + "env_var": "CONVOY_SSO_SERVICE_RETRY_COUNT", + "go_type": "int", + "default": "3" + }, + { + "json_path": "sso_service.timeout", + "env_var": "CONVOY_SSO_SERVICE_TIMEOUT", + "go_type": "time.Duration", + "default": "10s" + }, + { + "json_path": "sso_service.token_path", + "env_var": "CONVOY_SSO_SERVICE_TOKEN_PATH", + "go_type": "string", + "default": "/sso/token" + }, + { + "json_path": "storage_policy.s3.access_key", + "env_var": "CONVOY_STORAGE_AWS_ACCESS_KEY", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.bucket", + "env_var": "CONVOY_STORAGE_AWS_BUCKET", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.endpoint", + "env_var": "CONVOY_STORAGE_AWS_ENDPOINT", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.prefix", + "env_var": "CONVOY_STORAGE_AWS_PREFIX", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.region", + "env_var": "CONVOY_STORAGE_AWS_REGION", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.secret_key", + "env_var": "CONVOY_STORAGE_AWS_SECRET_KEY", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.s3.session_token", + "env_var": "CONVOY_STORAGE_AWS_SESSION_TOKEN", + "go_type": "string", + "default": "" + }, + { + "json_path": "storage_policy.type", + "env_var": "CONVOY_STORAGE_POLICY_TYPE", + "go_type": "string", + "default": "on-prem" + }, + { + "json_path": "storage_policy.on_prem.path", + "env_var": "CONVOY_STORAGE_PREM_PATH", + "go_type": "string", + "default": "/var/convoy/export" + }, + { + "json_path": "tracer.type", + "env_var": "CONVOY_TRACER_PROVIDER", + "go_type": "config.TracerProvider", + "default": "" + }, + { + "json_path": "worker_execution_mode", + "env_var": "CONVOY_WORKER_EXECUTION_MODE", + "go_type": "config.ExecutionMode", + "default": "default" + }, + { + "json_path": "server.http.domain_port", + "env_var": "DOMAIN_PORT", + "go_type": "uint32", + "default": "0" + }, + { + "json_path": "server.http.proxy", + "env_var": "HTTP_PROXY", + "go_type": "string", + "default": "" + }, + { + "json_path": "server.http.ingest_port", + "env_var": "INGEST_PORT", + "go_type": "uint32", + "default": "5009" + }, + { + "json_path": "server.http.port", + "env_var": "PORT", + "go_type": "uint32", + "default": "5005" + }, + { + "json_path": "server.http.socket_port", + "env_var": "SOCKET_PORT", + "go_type": "uint32", + "default": "0" + }, + { + "json_path": "server.http.ssl", + "env_var": "SSL", + "go_type": "bool", + "default": "false" + }, + { + "json_path": "server.http.worker_port", + "env_var": "WORKER_PORT", + "go_type": "uint32", + "default": "5006" + } + ] +} diff --git a/scripts/docs/gencliref/main.go b/scripts/docs/gencliref/main.go new file mode 100644 index 0000000000..1136f5991c --- /dev/null +++ b/scripts/docs/gencliref/main.go @@ -0,0 +1,321 @@ +// Command gencliref builds a minimal Cobra tree matching the production root (persistent flags +// plus server, agent, migrate, config subcommands) without PreRun hooks, then emits JSON with +// command paths, help text, and flags. Kept in sync manually with cmd/main.go flag registration. +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "os" + "sort" + "strings" + "time" + + "github.com/frain-dev/convoy" + "github.com/frain-dev/convoy/cmd/agent" + configCmd "github.com/frain-dev/convoy/cmd/config" + "github.com/frain-dev/convoy/cmd/migrate" + "github.com/frain-dev/convoy/cmd/server" + "github.com/frain-dev/convoy/config" + "github.com/frain-dev/convoy/internal/pkg/cli" + "github.com/spf13/cobra" + flagset "github.com/spf13/pflag" +) + +type flagEntry struct { + Name string `json:"name"` + Shorthand string `json:"shorthand,omitempty"` + Usage string `json:"usage"` + Default string `json:"default"` + DefValue string `json:"def_value"` + Hidden bool `json:"hidden"` + FlagScope string `json:"flag_scope"` // root_persistent | inherited | local + Deprecated string `json:"deprecated,omitempty"` + Annotations string `json:"annotations,omitempty"` +} + +type commandEntry struct { + Path []string `json:"path"` + Use string `json:"use"` + Short string `json:"short"` + Long string `json:"long,omitempty"` + Aliases []string `json:"aliases,omitempty"` + Flags []flagEntry `json:"flags"` + FlagOrder []string `json:"flag_order"` +} + +type outputDoc struct { + Source string `json:"source"` + Commands []commandEntry `json:"commands"` +} + +func main() { + outPath := flag.String("output", "", "write JSON to this path (default: stdout)") + flag.Parse() + + root := buildRootCommand() + var commands []commandEntry + walkCommands(root, nil, &commands) + + sort.Slice(commands, func(i, j int) bool { + return pathKey(commands[i].Path) < pathKey(commands[j].Path) + }) + + doc := outputDoc{ + Source: "cobra tree: scripts/docs/gencliref (mirrors cmd/main.go root flags + server|agent|migrate|config)", + Commands: commands, + } + + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + if err := enc.Encode(doc); err != nil { + fmt.Fprintf(os.Stderr, "encode: %v\n", err) + os.Exit(1) + } + data := bytes.TrimSpace(buf.Bytes()) + if *outPath != "" { + if err := os.WriteFile(*outPath, append(data, '\n'), 0o644); err != nil { + fmt.Fprintf(os.Stderr, "write %s: %v\n", *outPath, err) + os.Exit(1) + } + return + } + os.Stdout.Write(append(data, '\n')) +} + +func pathKey(p []string) string { + return strings.Join(p, "\x00") +} + +func buildRootCommand() *cobra.Command { + app := &cli.App{Version: convoy.GetVersion()} + + root := &cobra.Command{ + Use: "Convoy", + Short: "High Performance Webhooks Gateway", + Version: app.Version, + } + + // --- Mirror cmd/main.go persistent/root flags (lines ~44–198) --- + var dbPort int + var dbType string + var dbHost string + var dbScheme string + var dbUsername string + var dbPassword string + var dbDatabase string + var dbReadReplicasDSN []string + var fflag []string + var ipAllowList []string + var ipBLockList []string + var enableProfiling bool + var redisPort int + var redisHost string + var redisType string + var redisScheme string + var redisUsername string + var redisPassword string + var redisDatabase string + var redisSentinelMasterName string + var redisSentinelUsername string + var redisSentinelPassword string + var redisAddresses string + var tracerType string + var sentryDSN string + var sentrySampleRate float64 + var sentryDebug bool + var otelSampleRate float64 + var otelCollectorURL string + var otelAuthHeaderName string + var otelAuthHeaderValue string + var dataDogAgentUrl string + var metricsBackend string + var prometheusMetricsSampleTime uint64 + var prometheusMetricsQueryTimeout uint64 + var prometheusMetricsMaterializedViewRefreshInterval uint64 + var retentionPolicy string + var retentionPolicyEnabled bool + var maxRetrySeconds uint64 + var instanceIngestRate int + var apiRateLimit int + var licenseKey string + var logLevel string + var rootPath string + var configFile string + var enableBilling bool + var billingURL string + var billingAPIKey string + + fs := root.PersistentFlags() + fs.StringVar(&configFile, "config", "./convoy.json", "Configuration file for convoy") + fs.StringVar(&licenseKey, "license-key", "", "Convoy license key") + fs.StringVar(&logLevel, "log-level", "", "Log level") + fs.StringVar(&rootPath, "root-path", "", "Root path for routing behind load balancers (e.g., /convoy)") + fs.BoolVar(&enableBilling, "enable-billing", false, "Enable billing functionality") + fs.StringVar(&billingURL, "billing-url", "", "Billing service URL (required when billing is enabled)") + fs.StringVar(&billingAPIKey, "billing-api-key", "", "Billing service API key (required when billing is enabled)") + fs.StringVar(&dbHost, "db-host", "", "Database Host") + fs.StringVar(&dbType, "db-type", "", "Database provider") + fs.StringVar(&dbScheme, "db-scheme", "", "Database Scheme") + fs.StringVar(&dbUsername, "db-username", "", "Database Username") + fs.StringVar(&dbPassword, "db-password", "", "Database Password") + fs.StringVar(&dbDatabase, "db-database", "", "Database Database") + fs.StringVar(&dbDatabase, "db-options", "", "Database Options") + fs.IntVar(&dbPort, "db-port", 0, "Database Port") + fs.BoolVar(&enableProfiling, "enable-profiling", false, "Enable profiling and exporting profile data to pyroscope") + fs.StringSliceVar(&dbReadReplicasDSN, "read-replicas-dsn", []string{}, "Comma-separated list of read replica DSNs e.g. postgres://convoy:convoy@host1:5436/db,postgres://convoy:convoy@host2:5437/db") + fs.StringVar(&redisHost, "redis-host", "", "Redis Host") + fs.StringVar(&redisType, "redis-type", "", "Redis provider") + fs.StringVar(&redisScheme, "redis-scheme", "", fmt.Sprintf("Redis Scheme (%s, %s, %s)", config.RedisScheme, config.RedisSentinelScheme, config.RedisSecureScheme)) + fs.StringVar(&redisUsername, "redis-username", "", "Redis Username") + fs.StringVar(&redisPassword, "redis-password", "", "Redis Password") + fs.StringVar(&redisDatabase, "redis-database", "", "Redis database") + fs.IntVar(&redisPort, "redis-port", 0, "Redis Port") + fs.StringVar(&redisSentinelMasterName, "redis-sentinel-master-name", "", "Redis Sentinel master name (required when scheme is redis-sentinel)") + fs.StringVar(&redisSentinelUsername, "redis-sentinel-username", "", "Redis Sentinel username") + fs.StringVar(&redisSentinelPassword, "redis-sentinel-password", "", "Redis Sentinel password") + fs.StringVar(&redisAddresses, "redis-addresses", "", "Redis addresses (comma-separated, for cluster or sentinel)") + fs.StringSliceVar(&fflag, "enable-feature-flag", []string{}, "List of feature flags to enable e.g. \"full-text-search,prometheus\"") + fs.StringSliceVar(&ipAllowList, "ip-allow-list", []string{}, "List of IPs CIDRs to allow e.g. \" 0.0.0.0/0,127.0.0.0/8\"") + fs.StringSliceVar(&ipBLockList, "ip-block-list", []string{}, "List of IPs CIDRs to block e.g. \" 0.0.0.0/0,127.0.0.0/8\"") + fs.IntVar(&instanceIngestRate, "instance-ingest-rate", 0, "Instance ingest Rate") + fs.IntVar(&apiRateLimit, "api-rate-limit", 0, "API rate limit") + fs.StringVar(&tracerType, "tracer-type", "", "Tracer backend, e.g. sentry, datadog or otel") + fs.StringVar(&sentryDSN, "sentry-dsn", "", "Sentry backend dsn") + fs.Float64Var(&sentrySampleRate, "sentry-sample-rate", 1.0, "Sentry tracing sample rate") + fs.BoolVar(&sentryDebug, "sentry-debug", false, "Enable Sentry debug logging") + fs.Float64Var(&otelSampleRate, "otel-sample-rate", 1.0, "OTel tracing sample rate") + fs.StringVar(&otelCollectorURL, "otel-collector-url", "", "OTel collector URL") + fs.StringVar(&otelAuthHeaderName, "otel-auth-header-name", "", "OTel backend auth header name") + fs.StringVar(&otelAuthHeaderValue, "otel-auth-header-value", "", "OTel backend auth header value") + fs.StringVar(&dataDogAgentUrl, "datadog-agent-url", "", "Datadog agent URL") + fs.StringVar(&metricsBackend, "metrics-backend", "prometheus", "Metrics backend e.g. prometheus. ('prometheus' feature flag required") + fs.Uint64Var(&prometheusMetricsSampleTime, "metrics-prometheus-sample-time", 5, "Prometheus metrics sample time") + fs.Uint64Var(&prometheusMetricsQueryTimeout, "metrics-prometheus-query-timeout", 30, "Prometheus metrics query timeout in seconds") + fs.Uint64Var(&prometheusMetricsMaterializedViewRefreshInterval, "metrics-prometheus-materialized-view-refresh-interval", 2, "Materialized view refresh interval in minutes") + fs.StringVar(&retentionPolicy, "retention-policy", "", "Retention Policy Duration") + fs.BoolVar(&retentionPolicyEnabled, "retention-policy-enabled", false, "Retention Policy Enabled") + fs.Uint64Var(&maxRetrySeconds, "max-retry-seconds", 7200, "Max retry seconds exponential backoff") + + fs.String("hcp-client-id", "", "HCP Vault client ID") + fs.String("hcp-client-secret", "", "HCP Vault client secret") + fs.String("hcp-org-id", "", "HCP Vault organization ID") + fs.String("hcp-project-id", "", "HCP Vault project ID") + fs.String("hcp-app-name", "", "HCP Vault app name") + fs.String("hcp-secret-name", "", "HCP Vault secret name") + fs.Duration("hcp-cache-duration", 5*time.Minute, "HCP Vault key cache duration") + + root.AddCommand(server.AddServerCommand(app)) + root.AddCommand(migrate.AddMigrateCommand(app)) + root.AddCommand(configCmd.AddConfigCommand()) + root.AddCommand(agent.AddAgentCommand(app)) + + return root +} + +func walkCommands(cmd *cobra.Command, path []string, out *[]commandEntry) { + p := append(append([]string(nil), path...), cmd.Name()) + if cmd == cmd.Root() && len(path) == 0 { + p = nil + } + + pathCopy := append([]string(nil), p...) + if pathCopy == nil { + pathCopy = []string{} + } + *out = append(*out, commandEntry{ + Path: pathCopy, + Use: strings.TrimSpace(cmd.Use), + Short: strings.TrimSpace(cmd.Short), + Long: strings.TrimSpace(cmd.Long), + Aliases: append([]string(nil), cmd.Aliases...), + Flags: collectFlags(cmd), + FlagOrder: flagNamesInOrder(cmd), + }) + + for _, sub := range cmd.Commands() { + if strings.EqualFold(sub.Name(), "help") || sub.Name() == "completion" { + continue + } + walkCommands(sub, p, out) + } +} + +func flagNamesInOrder(cmd *cobra.Command) []string { + root := cmd.Root() + seen := map[string]struct{}{} + var names []string + add := func(fs *flagset.FlagSet) { + fs.VisitAll(func(f *flagset.Flag) { + if _, ok := seen[f.Name]; ok { + return + } + seen[f.Name] = struct{}{} + names = append(names, f.Name) + }) + } + if cmd == root { + add(cmd.PersistentFlags()) + } else { + add(root.PersistentFlags()) + add(cmd.LocalFlags()) + } + return names +} + +func collectFlags(cmd *cobra.Command) []flagEntry { + root := cmd.Root() + byName := map[string]flagEntry{} + var order []string + + visit := func(fs *flagset.FlagSet) { + fs.VisitAll(func(f *flagset.Flag) { + if _, ok := byName[f.Name]; ok { + return + } + onRootPersistent := root.PersistentFlags().Lookup(f.Name) != nil + var scope string + switch { + case cmd == root: + scope = "root_persistent" + case onRootPersistent: + scope = "inherited" + default: + scope = "local" + } + e := flagEntry{ + Name: f.Name, + Shorthand: f.Shorthand, + Usage: f.Usage, + Default: f.DefValue, + DefValue: f.DefValue, + Hidden: f.Hidden, + FlagScope: scope, + Deprecated: f.Deprecated, + } + if f.Annotations != nil { + e.Annotations = fmt.Sprintf("%v", f.Annotations) + } + byName[f.Name] = e + order = append(order, f.Name) + }) + } + + if cmd == root { + visit(cmd.PersistentFlags()) + } else { + visit(root.PersistentFlags()) + visit(cmd.LocalFlags()) + } + + list := make([]flagEntry, 0, len(byName)) + for _, n := range order { + list = append(list, byName[n]) + } + sort.Slice(list, func(i, j int) bool { return list[i].Name < list[j].Name }) + return list +} diff --git a/scripts/docs/genconfigref/main.go b/scripts/docs/genconfigref/main.go new file mode 100644 index 0000000000..ef7c3bf047 --- /dev/null +++ b/scripts/docs/genconfigref/main.go @@ -0,0 +1,205 @@ +// Command genconfigref walks config.Configuration (struct tags + config.DefaultConfiguration) +// and writes a deterministic JSON reference of JSON key paths, env vars, and defaults. +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "os" + "reflect" + "sort" + "strings" + "time" + "unicode" + + "github.com/frain-dev/convoy/config" +) + +type entry struct { + JSONPath string `json:"json_path"` + EnvVar string `json:"env_var"` + GoType string `json:"go_type"` + Default string `json:"default"` +} + +type outputDoc struct { + Source string `json:"source"` + Entries []entry `json:"entries"` +} + +func main() { + outPath := flag.String("output", "", "write JSON to this path (default: stdout)") + flag.Parse() + + var entries []entry + walkStruct(reflect.TypeOf(config.Configuration{}), reflect.ValueOf(config.DefaultConfiguration), "", &entries) + + sort.Slice(entries, func(i, j int) bool { + if entries[i].EnvVar != entries[j].EnvVar { + return entries[i].EnvVar < entries[j].EnvVar + } + return entries[i].JSONPath < entries[j].JSONPath + }) + + doc := outputDoc{ + Source: "github.com/frain-dev/convoy/config.DefaultConfiguration", + Entries: entries, + } + + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + enc.SetIndent("", " ") + if err := enc.Encode(doc); err != nil { + fmt.Fprintf(os.Stderr, "encode: %v\n", err) + os.Exit(1) + } + + data := bytes.TrimSpace(buf.Bytes()) + if *outPath != "" { + if err := os.WriteFile(*outPath, append(data, '\n'), 0o644); err != nil { + fmt.Fprintf(os.Stderr, "write %s: %v\n", *outPath, err) + os.Exit(1) + } + return + } + os.Stdout.Write(append(data, '\n')) +} + +func walkStruct(typ reflect.Type, val reflect.Value, pathPrefix string, out *[]entry) { + typ, val = deref(typ, val) + if typ.Kind() != reflect.Struct { + return + } + if typ == reflect.TypeOf(time.Time{}) { + return + } + + for i := 0; i < typ.NumField(); i++ { + sf := typ.Field(i) + if sf.PkgPath != "" { + continue + } + seg := jsonPathSegment(typ, sf) + if seg == "" { + continue + } + fieldPath := seg + if pathPrefix != "" { + fieldPath = pathPrefix + "." + seg + } + + fv := val.Field(i) + ft := sf.Type + env := strings.TrimSpace(sf.Tag.Get("envconfig")) + if env == "-" { + env = "" + } + + ftd, fvd := deref(ft, fv) + + if env != "" { + *out = append(*out, entry{ + JSONPath: fieldPath, + EnvVar: env, + GoType: ft.String(), + Default: formatDefault(fvd, ftd), + }) + } + + switch ftd.Kind() { + case reflect.Struct: + if ftd != reflect.TypeOf(time.Time{}) { + walkStruct(ftd, fvd, fieldPath, out) + } + case reflect.Slice, reflect.Array: + // env-backed slices are documented as a single row; do not descend + default: + } + } +} + +func deref(typ reflect.Type, val reflect.Value) (reflect.Type, reflect.Value) { + for typ.Kind() == reflect.Pointer { + typ = typ.Elem() + if val.Kind() == reflect.Pointer { + if val.IsNil() { + val = reflect.Zero(typ) + } else { + val = val.Elem() + } + } + } + return typ, val +} + +func jsonPathSegment(structType reflect.Type, sf reflect.StructField) string { + j := strings.Split(sf.Tag.Get("json"), ",")[0] + switch j { + case "-": + if s := siblingStrJSONSegment(structType, sf); s != "" { + return s + } + return camelToSnakePath(sf.Name) + case "": + return camelToSnakePath(sf.Name) + default: + return j + } +} + +func siblingStrJSONSegment(structType reflect.Type, sf reflect.StructField) string { + strName := sf.Name + "Str" + f, ok := structType.FieldByName(strName) + if !ok { + return "" + } + jj := strings.Split(f.Tag.Get("json"), ",")[0] + if jj == "" || jj == "-" { + return "" + } + return jj +} + +func camelToSnakePath(name string) string { + var b strings.Builder + for i, r := range name { + if i > 0 && unicode.IsUpper(r) { + b.WriteByte('_') + } + b.WriteRune(unicode.ToLower(r)) + } + return b.String() +} + +func formatDefault(v reflect.Value, t reflect.Type) string { + if !v.IsValid() { + return "" + } + switch t.Kind() { + case reflect.String: + return v.String() + case reflect.Bool: + if v.Bool() { + return "true" + } + return "false" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if t.PkgPath() == "time" && t.Name() == "Duration" { + return time.Duration(v.Int()).String() + } + return fmt.Sprintf("%d", v.Int()) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return fmt.Sprintf("%d", v.Uint()) + case reflect.Float32, reflect.Float64: + return fmt.Sprintf("%g", v.Float()) + default: + b, err := json.Marshal(v.Interface()) + if err != nil { + return fmt.Sprintf("%v", v.Interface()) + } + return string(b) + } +} diff --git a/scripts/docs/generate.sh b/scripts/docs/generate.sh new file mode 100755 index 0000000000..475578fa4f --- /dev/null +++ b/scripts/docs/generate.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/../.." +exec make docs-generated