Production checklist
What to verify before pointing real traffic at a deployment.
A condensed checklist. Each item links to the page with the full explanation.
Secrets
-
MASTER_KEYand everyENCRYPTION_KEYRINGvalue are strong, unique per environment, and live in a secret manager — not in the image, not in git, not in the Compose file's defaults.compose.local.yaml's secrets are development-only; the productiondocker-compose.ymlbase ships both empty and refuses to start until you set them. See Security. - You have a rotation plan for both, and know the leaked-secret procedure — Operations → Secrets.
Network and TLS
- Postgres and Redis connections use a public-CA certificate, or a private network without TLS. Bun's TLS implementation rejects self-signed certificates — a raw Coolify/Dokploy-exposed port commonly hits this. See Known errors.
- Only the gateway (and optionally the docs site) is exposed through your reverse proxy; Postgres and Redis stay on the internal network. See Deployment.
Health and scaling
- Liveness probe →
GET /health/live(no dependency checks — never point liveness at a dependency-aware endpoint, or a Postgres/Redis blip restarts every replica at once). - Readiness probe →
GET /health/ready(pulls an unhealthy instance from the load balancer without restarting it). - Your orchestrator gives the container at least
SHUTDOWN_TIMEOUT_MSto drain onSIGTERM. - Replicas are safe to scale horizontally; shared quotas/circuits are in Redis and maintenance work is idempotent or transactionally claimed. See Operations.
Data lifecycle
-
db:migrateruns as a one-off step before rolling out new instances (the Compose stack does this automatically via its migration job). -
OBSERVABILITY_METADATA_RETENTION_DAYS,OBSERVABILITY_PAYLOAD_RETENTION_DAYS, andRESPONSES_STATE_RETENTION_DAYSmatch your actual compliance/storage requirements. - You have a Postgres backup schedule. Redis needs none (fully rebuildable ephemeral state). See Operations → Backups.
Observability
-
OTEL_ENABLED=truewith a realOTEL_EXPORTER_OTLP_ENDPOINTif you want traces/metrics — disabled by default. - The encryption keyring is backed up and its rotation procedure is rehearsed; the gateway never emits payload bodies to OTel. See Security.
- Logs (structured JSON on stdout) are shipped to a collector.
Routing and resilience
-
PUT /admin/router-settingsreflects real choices, not silent defaults — especiallyunsupportedParameterStrategy(defaultdrop, which silently strips parameters;errormay be safer for a strict client). See Routing and Parameter policy. - Every Public Model you rely on has more than one deployment, or an explicit acceptance that it has none. See Fallbacks for pool-exhaustion behavior.
Dependencies
-
bun audit --productionis clean (CI enforces this at--audit-level=high, but re-check after adding any runtime extension dependency).
What to read next
- Upgrades — what changes between releases and how to roll one out safely.
- Operations — the full runbook behind this checklist.