Skip to content

New-app checklist

The playbook in one screen. Fill in <app>, <owner>, <domain>. Each box links to the step with the full template. Work top to bottom.

Ticks are saved in your browser per app name — type the app you’re onboarding to keep its own progress.

  • Pick <app>, the namespace (also <app>), and the hostname api.<domain>
  • Does it need a database? a browser login (Keycloak client)? — note which steps apply
  • Add a multi-stage Dockerfile (distroless/static, arm64; bundle migrate if it has migrations)
  • Add .dockerignore
  • Add the GitHub Actions workflow → pushes ghcr.io/<owner>/<app>:sha-<sha>
  • Push → confirm the image + sha- tag in GHCR; make the package public (or plan a pull secret)
  • Add a CNPG Cluster (<app>-pg) in workloads/<app>/
  • App reads DB_URL from the auto-created <app>-pg-app secret’s uri key
  • Add the migrations PreSync Job (runs before the rollout)
  • (Recommended) add backup.barmanObjectStore + a ScheduledBackup
  • Create workloads/<app>/: namespace, Rollout, Service, Ingress (Traefik + cert-manager)
  • Add apps/<app>.yaml (the Argo CD Application pointing at workloads/<app>/)
  • DNS: api.<domain> → node public IP (grey cloud)
  • Create out-of-band secrets via kubectl (e.g. <app>-kc, <app>-pg-backup-creds) — never in Git
  • Add the non-secret ConfigMap (<app>-config)
  • App exposes /metrics
  • Add the ServiceMonitor (label release: kube-prom-stack)
  • Add the AnalysisTemplate (success-rate result[0] >= 0.95) + wire strategy.canary.analysis into the Rollout
  • Commit + push the gitops repo → Argo CD syncs
  • App shows Synced / Healthy; pods Running; cert READY=True
  • curl https://api.<domain>/healthz (or your liveness path) returns 200
  • Ship a change: push code → CI builds → bump the image tag in rollout.yaml → push → watch the canary (details)
  • (Optional) add a worked-example page for this app

Stuck? See Troubleshooting. Rebuilding the whole platform? See Disaster recovery.