Skip to content

Configuration

Reference for every Helm values key and Kubernetes secret the forginate chart consumes. Everything is environment-driven; override per-install with -f values-<env>.yaml.

Global values

KeyDefaultMeaning
global.environmentdevdev | prod — labels, backup object prefix
global.domain(maintainer dev domain)Public base hostname; sets PUBLIC_BASE_URL and COOKIE_DOMAIN, ingress host, TLS cert
global.appsWildcard(maintainer dev domain)Wildcard base for tenant hosted apps (*.apps.…)
global.imageRegistryghcr.io/the-pizzaRegistry prefix used by the image helper
global.imagePullPolicyIfNotPresentApplied to all service containers
global.storageClassnfs-csiPVCs for redis + minio — set to your cluster's class
global.ingressClasstraefik-internalingressClassName on the gateway Ingress — set to yours
global.certIssuerletsencrypt-productioncert-manager ClusterIssuer name

Defaults are not neutral

The shipped defaults reflect the maintainers' environment (domain, storage class, ingress class). Treat every global.* key as required in your own values file.

Component values

postgres.* (CNPG)

enabled, name (default forginate-db — the read-write Service is <name>-rw), instances, size, storageClass, image (ghcr.io/cloudnative-pg/postgresql:17.5), database (forginate), username (forginate). Bootstrap credentials come from the forginate-db-app-user secret. Superuser access is disabled.

redis.* / minio.*

redis.image (redis:7-alpine), redis.size (PVC, AOF enabled). minio.image, minio.size. MinIO is in-cluster only (no ingress); ports 9000 (API) / 9001 (console).

backup.*

enabled (default true), image (postgres:17-bookworm), schedule ("17 3 * * *"), bucket (forginate-backups), retentionDays (14). See Backups.

apiGateway.*

KeyDefaultNotes
image.repository / image.tagghcr.io/the-pizza/forginate-api-gateway / latestPin a sha-<sha> tag in production
imagePullSecret""docker-registry secret name for private GHCR
replicas1
founderGithubLoginThe-PizzaChange this. GitHub login auto-flagged as founder/admin on first sign-in
shareHostshare.forginate.comPublic share-portal hostname (SHARE_HOST)
lokiUrlhttp://loki-gateway.monitoring.svcAdmin "System Logs" tab source (port 80, not 3100)
serviceMonitor.enabledtrueRequires prometheus-operator CRDs
resources100m/192Mi req, 384Mi limit

orchestrator.*

KeyDefaultNotes
image / runnerImage / qaRunnerImageforginate-orchestrator / -factory-runner / -qa-runnerRunner images are pulled at Job-spawn time
imagePullSecret / runnerImagePullSecret""Separate: the runner secret is stamped onto Jobs in the runs namespace
runsNamespaceforginate-runs-devCreated by the chart, with RBAC + default-deny NetworkPolicy
defaultMaxDollars"0.5"Per-run cost cap (USD)
defaultRunTimeoutSeconds"3300"Wall-clock cap per run
runnerRuntimeClass""e.g. kata-qemu for VM-isolated runner pods (requires kata-deploy)
runnerNodeSelectorKey / Value""Pin runner pods to labelled sandbox nodes

chatEditor.*

enabled, image, imagePullSecret, replicas, orgConcurrency (default 3 concurrent streams per org), chatBucket (forginate-chat-attachments), autoscaling.{enabled,minReplicas,maxReplicas,targetStreamsPerPod,targetCpuUtilization} — the HPA scales on the custom chat_editor_active_streams metric plus CPU, so the custom-metric target needs a Prometheus adapter to actually fire — and serviceMonitor.enabled (default false).

observability.otlpEndpoint

Default http://alloy.monitoring.svc.cluster.local:4317. OTLP gRPC endpoint injected into every service and every runner pod. See Observability.

Secrets reference

All in the release namespace, referenced by fixed names:

SecretKeysRequired?Env vars
forginate-db-app-userusername, passwordyes (bootstrap script)CNPG initdb, backup PGUSER/PGPASSWORD
forginate-db-urlurlyesDATABASE_URL (gateway, orchestrator, chat-editor)
forginate-redispasswordyes (bootstrap script)REDIS_PASSWORDREDIS_URL
forginate-minioroot-user, root-passwordyes (bootstrap script)MINIO_ACCESS_KEY/MINIO_SECRET_KEY
forginate-jwtsecretyes (≥ 32 chars)JWT_SECRET
forginate-github-oauthclient-id, client-secretyesGITHUB_CLIENT_ID/GITHUB_CLIENT_SECRET
forginate-credential-keykeyyes (base64 32 bytes)FORGINATE_CREDENTIAL_KEY
forginate-internal-tokentokenyesINTERNAL_SERVICE_TOKEN / INTERNAL_API_TOKEN
forginate-github-appapp_id, slug, client_id, client_secret, webhook_secret, private_key.pemoptionalGITHUB_APP_*
forginate-stripepublishable_key, secret_key, webhook_secretoptionalSTRIPE_*
forginate-awsaccess-key-id, secret-access-keyoptionalAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY (orchestrator)
forginate-registry-pullusername, passwordoptionalREGISTRY_PULL_USERNAME/PASSWORD (orchestrator)

Optional means dark, not broken

Every optional secret is mounted with optional: true. The pod boots; the feature (GitHub App wizard, Stripe billing, AWS vending, private-registry mirroring) activates only once the secret exists and the pod is restarted.

Notable env vars set by the chart

Fixed in the templates (change requires a template edit, listed for debugging):

  • JWT_ISSUER=forginate, COOKIE_SECURE=true, NODE_ENV=production
  • PORT=8080, INTERNAL_PORT=8081 (gateway), PORT=8090 (chat-editor)
  • MINIO_DOCS_BUCKET=forginate-docs, MINIO_USE_SSL=false, MINIO_ENDPOINT=minio.<namespace>.svc.cluster.local
  • CHAT_EDITOR_URL=http://chat-editor.<namespace>.svc.cluster.local:8090
  • API_GATEWAY_INTERNAL_BASE=http://api-gateway-internal.<namespace>.svc.cluster.local:8081
  • RUNS_NAMESPACE mirrors orchestrator.runsNamespace in both gateway and orchestrator

Env-only knobs with sane defaults (not exposed as values keys; settable by editing the Deployment or the templates): orchestrator RUNNER_EGRESS_ALLOWLIST (comma-separated hostname allowlist for runner egress — Anthropic, OpenAI, GitHub, npm, PyPI by default), HEARTBEAT_TIMEOUT_MS, RUNNER_MAX_WALL_S (25 h Job ceiling for provider-wall waits), PROMETHEUS_URL (ops metrics queries), and gateway GITHUB_DEFAULT_SCOPES.

Forginate — build software with an AI factory.