New-app checklist
The playbook in one screen. Fill in <app>, <owner>, hosts. Each box links to the step with the full template.
Ticks are saved in your browser per app name.
1. Decide
Section titled “1. Decide”- Pick
<app>, namespaces<app>-staging/<app>-prod, and the staging + prod hostnames - Database? Postgres (CNPG, section 3) or SQLite on a volume (Invoicer: one pod,
Recreate, no canary). Browser login (Keycloak client)? Note which steps apply - New server? That is Provision, not this list
2. Build & ship the image: details
Section titled “2. Build & ship the image: details”- Multi-stage
Dockerfile(distroless/static, arm64,USER 65532:65532; bundlemigrateif needed) -
.dockerignore - CI →
ghcr.io/<owner>/<app>:sha-<sha> - Package public, or plan an
imagePullSecret
3. Database (if needed): details
Section titled “3. Database (if needed): details”- CNPG
Cluster(<app>-pg) inworkloads/<app>/base/ - App reads
DB_URL/ JDBC from the auto-created<app>-pg-appSecret - Migrations if the app needs a Job (Penvoice applies schema on startup, example only)
-
backup.barmanObjectStore+ScheduledBackup; overlay-patch the S3 prefix per env
4. Deploy & reconcile: details
Section titled “4. Deploy & reconcile: details”- Copy
workloads/<example>/{base,overlays}and rename - Two list entries in
apps/workloads.yaml(staging + prod) - DNS A records → node public IP
5. Secrets: details
Section titled “5. Secrets: details”- Infisical GUI: Project
<app>, environmentsstagingandprod; type values there - Machine Identity per env;
infisical-<app>-identitySecret in each namespace - Overlay
projectId+environmentSlug; RolloutenvFromthe synced Secret -
<app>-pg-backup-credsvia kubectl. Never in Git
6. Email (if the app sends mail): details
Section titled “6. Email (if the app sends mail): details”- Notices alias
oci-<app>on theocimailbox - OCI compartment
email-<app>(insideemail); approved sender<app>@mail.visarend.systemsin it - OCI user
SMTP <App>(emailoci-<app>@…), groupemail-<app>, line added to policyemail-apps-send - SMTP credentials → Infisical
SMTP_HOST,SMTP_PORT,SMTP_USERNAME,SMTP_PASSWORD,MAIL_FROM(staging + prod) - Cloud Shell test prints
SENT; the received mail shows SPF, DKIM and DMARCpass - Row added to Reference § Email
7. Canary: details
Section titled “7. Canary: details”- Prod overlay: timed 25→50→75. Do not add ServiceMonitor / AnalysisTemplate until a metrics stack exists
8. Go live
Section titled “8. Go live”- Push this repo → Argo syncs
- First app push goes to
staging; movemainonly by fast-forward once that image is built - App
Synced/Healthy; certREADY=True -
curl https://<host>/healthzreturns200
9. Day-2
Section titled “9. Day-2”- Staging: bump
images.newTagin the staging overlay. Prod: Promote the same digest - Optional: a worked-example page for this app
Stuck? Troubleshooting. New node? Provision.