Docker Compose (VPS)
One machine,
docker compose up, a reverse proxy for TLS. Right choice
for a pilot, a small client base, or anyone who doesn’t want to operate
a cluster.Kubernetes
Helm + ArgoCD GitOps, horizontal pod autoscaling per queue, a
production Vault Raft cluster. Right choice once you’re operating at a
scale where per-queue autoscaling and zero-downtime rolling deploys
earn their operational cost.
What’s identical either way
- The application images — the same
docker/api.Dockerfilebuild (API and every Celery worker queue, differing only by containercommand) runs unmodified under Compose or Kubernetes - Database migrations —
alembic upgrade head, same command, same migration files - Secrets — Vault in AppRole mode; production
Settingsvalidation refuses to boot with a dev token or a missing AppRole role ID regardless of orchestrator - Observability — the same LGTM stack (Prometheus/Grafana/Loki/Tempo) and the same alert rules; see Observability
What differs
Production settings, regardless of path
APP_ENV=production triggers strict boot-time validation
(core/config/settings.py) that fails loudly rather than degrading
silently:
app_debugandapi_docs_enabledmust befalsevault_approle_role_idmust be set;vault_dev_tokenmust be unsetredis_url/celery_broker_url/celery_result_backendmust not be localhostapi_public_base_urlmust not be localhost (breaks every OAuth callback otherwise)cors_originsmust not contain a wildcard or localhost entry