Skip to content

Environment variables

This page catalogs every GOCDNEXT_* env var consumed by the server’s config loader. The Helm chart exposes most of these via the values.yaml blocks that map 1:1 — see Helm install for the value-side names.

Core

VarDefaultNotes
GOCDNEXT_DATABASE_URL(required)Postgres DSN. Wired via Helm secret.
GOCDNEXT_HTTP_ADDR:8153HTTP listen address
GOCDNEXT_GRPC_ADDR:8154gRPC listen address (agent stream)
GOCDNEXT_PUBLIC_BASEemptyExternally-reachable base URL. Required for OAuth callbacks + webhook URLs.
GOCDNEXT_LOG_LEVELinfodebug | info | warn | error
GOCDNEXT_WEBHOOK_TOKENemptyPre-shared token for the legacy /webhook?token=… endpoint
GOCDNEXT_WEBHOOK_PUBLIC_URLemptyOverride for the URL handed to GitHub when registering a repo webhook. Defaults to GOCDNEXT_PUBLIC_BASE.

Secrets backend

VarDefaultNotes
GOCDNEXT_SECRET_KEY(required)AES-256-GCM key (64 hex chars) for project-secret encryption.
GOCDNEXT_SECRET_BACKENDdbdb | kubernetes
GOCDNEXT_SECRET_K8S_NAMESPACErelease nsNamespace for K8s-backed secrets
GOCDNEXT_SECRET_K8S_NAME_TEMPLATEgocdnext-secrets-{slug}Secret name template; {slug} = project slug

Artifacts

VarDefaultNotes
GOCDNEXT_ARTIFACTS_BACKENDfilesystemfilesystem | s3 | gcs
GOCDNEXT_ARTIFACTS_FS_ROOT/var/lib/gocdnext/artifactsFilesystem backend storage root
GOCDNEXT_ARTIFACTS_PUBLIC_BASE= public_baseBase URL artefacts are downloaded from
GOCDNEXT_ARTIFACTS_SIGN_KEY(required)HMAC key for signed download URLs
GOCDNEXT_ARTIFACTS_KEEP_LAST30Keep N most recent runs per pipeline; 0 disables
GOCDNEXT_ARTIFACTS_PROJECT_QUOTA_BYTES107374182400Per-project soft cap (100 GiB). 0 disables.
GOCDNEXT_ARTIFACTS_GLOBAL_QUOTA_BYTES0Global hard cap. 0 = disabled.
GOCDNEXT_ARTIFACTS_MAX_BODY_MB2048Per-request body cap on uploads
GOCDNEXT_ARTIFACTS_S3_BUCKETemptyS3 bucket name (when backend=s3)
GOCDNEXT_ARTIFACTS_S3_REGIONus-east-1
GOCDNEXT_ARTIFACTS_S3_ENDPOINTemptyCustom S3-compatible endpoint (MinIO, R2, etc.)
GOCDNEXT_ARTIFACTS_S3_USE_PATH_STYLEfalsetrue for MinIO and most S3-compatibles
GOCDNEXT_ARTIFACTS_S3_ENSURE_BUCKETfalseAuto-create the bucket on boot
GOCDNEXT_ARTIFACTS_S3_ACCESS_KEYemptyPlumbed via Helm secret
GOCDNEXT_ARTIFACTS_S3_SECRET_KEYemptyPlumbed via Helm secret
GOCDNEXT_ARTIFACTS_GCS_BUCKETemptyGCS bucket (when backend=gcs)
GOCDNEXT_ARTIFACTS_GCS_PROJECT_IDemptyRequired for ensure_bucket
GOCDNEXT_ARTIFACTS_GCS_ENSURE_BUCKETfalse
GOCDNEXT_ARTIFACTS_GCS_CREDENTIALS_FILEemptyService-account JSON path
GOCDNEXT_ARTIFACTS_GCS_CREDENTIALS_JSONemptyService-account JSON content (alternative to file)

Cache (per-job content cache, not log archive)

VarDefaultNotes
GOCDNEXT_CACHE_TTL_DAYS30Inactivity window before eviction
GOCDNEXT_CACHE_PROJECT_QUOTA_BYTES0Per-project cap (disabled by default)
GOCDNEXT_CACHE_GLOBAL_QUOTA_BYTES0Global cap (disabled by default)

Logs

VarDefaultNotes
GOCDNEXT_LOG_RETENTIONemptyDrop log_lines partitions older than this duration. Empty = no drop. Format: Go duration (720h, 30d).
GOCDNEXT_LOG_MONTHS_AHEAD3Months of partitions stocked ahead of “now”
GOCDNEXT_LOG_ARCHIVEautoauto | on | off. auto = on iff artefact backend wired.
GOCDNEXT_LOG_ARCHIVE_CACHE_BYTES268435456LRU cache for decoded archives. 0 = disabled. (256 MiB)

Authentication

VarDefaultNotes
GOCDNEXT_AUTH_ENABLEDfalseMaster switch. false keeps every route open.
GOCDNEXT_AUTH_ADMIN_EMAILSemptyComma-separated list. First-login users on this list become admin.
GOCDNEXT_AUTH_ALLOWED_DOMAINSemptyComma-separated. Logins from other domains are rejected.
GOCDNEXT_AUTH_GITHUB_CLIENT_IDemptyOAuth app client id
GOCDNEXT_AUTH_GITHUB_CLIENT_SECRETemptyWired via Helm secret
GOCDNEXT_AUTH_GITHUB_API_BASEemptyOverride for GitHub Enterprise (https://github.example.com/api/v3)
GOCDNEXT_AUTH_GOOGLE_CLIENT_IDempty
GOCDNEXT_AUTH_GOOGLE_CLIENT_SECRETempty
GOCDNEXT_AUTH_GOOGLE_ISSUERhttps://accounts.google.comOIDC issuer URL
GOCDNEXT_AUTH_KEYCLOAK_CLIENT_IDempty
GOCDNEXT_AUTH_KEYCLOAK_CLIENT_SECRETempty
GOCDNEXT_AUTH_KEYCLOAK_ISSUERemptyhttps://kc.example.com/realms/<name>
GOCDNEXT_AUTH_OIDC_CLIENT_IDemptyGeneric OIDC fallback
GOCDNEXT_AUTH_OIDC_CLIENT_SECRETempty
GOCDNEXT_AUTH_OIDC_ISSUERemptyhttps://idp.example.com
GOCDNEXT_AUTH_OIDC_NAMEemptyDisplay name on the login button

GitHub App (for higher rate limits + Checks API)

VarDefaultNotes
GOCDNEXT_GITHUB_APP_IDemptyApp ID
GOCDNEXT_GITHUB_APP_PRIVATE_KEYemptyInline PEM (alternative to file)
GOCDNEXT_GITHUB_APP_PRIVATE_KEY_FILEemptyPEM file path; mounted from a Helm secret
GOCDNEXT_GITHUB_APP_API_BASEhttps://api.github.comOverride for GHE

Plugin catalog

VarDefaultNotes
GOCDNEXT_PLUGIN_CATALOG_DIR/etc/gocdnext/plugins (set in Dockerfile)Colon-separated path list. The chart appends /etc/gocdnext/extra-plugins when extraPlugins: is non-empty.

Runner profiles

VarDefaultNotes
GOCDNEXT_RUNNER_PROFILES_FILEemptyYAML the chart mounts via ConfigMap; server upserts entries on boot

Agent (separate binary, not server)

The agent’s binary reads its own env. Most operators set these via the chart’s agent: values block.

VarDefaultNotes
GOCDNEXT_SERVER_ADDR(required)gRPC endpoint (server.example.com:8154)
GOCDNEXT_AGENT_NAME(required)Unique per agent — must match a registered name on the server
GOCDNEXT_AGENT_TOKEN(required)Pre-provisioned auth token
GOCDNEXT_AGENT_TAGSemptyComma-separated. Used to route jobs (agent.tags: in YAML).
GOCDNEXT_AGENT_CAPACITY2Max concurrent jobs
GOCDNEXT_AGENT_ENGINEdockerdocker | kubernetes | shell
GOCDNEXT_DOCKER_SOCKET/var/run/docker.sock(engine=docker)
GOCDNEXT_DOCKER_PULL_POLICYemptyalways | missing | never. Empty = docker default (missing).
GOCDNEXT_DOCKER_STRICTfalseReject image: references not in the plugin catalog
GOCDNEXT_DOCKER_EXTRA_ARGSemptyExtra args appended to every docker run (--init, etc.)
GOCDNEXT_K8S_NAMESPACEempty(engine=kubernetes) Namespace where job Pods spawn
GOCDNEXT_K8S_KUBECONFIGemptyPath to kubeconfig; empty = in-cluster service account
GOCDNEXT_K8S_WORKSPACE_MODEisolatedisolated (per-job ephemeral PVC, default since v0.5.0) or shared (legacy RWM PVC owned by the agent StatefulSet). See Kubernetes runtime.
GOCDNEXT_K8S_WORKSPACE_PATHempty(mode=shared) Mount path the agent + spawned job pods agree on. Required when mode=shared; ignored in isolated.
GOCDNEXT_K8S_WORKSPACE_PVCempty(mode=shared) PVC name the agent + jobs share. Set by the chart to the StatefulSet’s volumeClaimTemplate.
GOCDNEXT_K8S_WORKSPACE_STORAGE_CLASSempty(mode=isolated) Storage class for the per-job ephemeral PVC. Empty = cluster default.
GOCDNEXT_K8S_WORKSPACE_SIZE20Gi(mode=isolated) Resource request for the ephemeral PVC.
GOCDNEXT_K8S_AGENT_IMAGEempty(mode=isolated, required) The agent image reference used by the prep init container — it re-execs itself inside the pod to clone materials. Wire to the same image you deploy the agent from.

Observability

VarDefaultNotes
GOCDNEXT_OTEL_EXPORTER_OTLP_ENDPOINTemptyOTLP traces endpoint. Empty = disabled.
GOCDNEXT_PROMETHEUS_ENABLEDtrueExpose /metrics on the HTTP listener

The OTel SDK reads the standard OTEL_* vars too — anything those control is also controllable via plain OTEL_RESOURCE_ATTRIBUTES, OTEL_SERVICE_NAME, etc.