Production Checklist
Run through this list before serving production traffic.
Infrastructure
- Neon database created in the right region; pooled + unpooled URLs in env.
- Supabase project + bucket created in the matching region.
-
NEXTAUTH_URLmatches the public hostname Vercel routes to. -
NEXTAUTH_SECRETis unique to this deployment (not reused from dev). -
CRON_SECRETset; verify a cron handler returns 401 without it viacurl -i .../api/cron/scheduled-publish. - Custom domain attached in Vercel; HTTPS certificate issued.
Database
-
pnpm db:push(orpnpm db:deploywith migrations) completed cleanly. -
pnpm db:seedran once to provision the admin user. - Initial admin password rotated immediately after first login.
Security
- Settings → Security tab → IP allowlist configured if your management API access should be restricted.
- Settings → API keys — preview / management keys created with
expiresAtset; no long-lived keys. - CORS origins configured per project for the management API (see Settings → CORS).
-
KRIOS_TENANT_DB_KEYset if you use V3 physical isolation. - Ensure your host sets HSTS (
Strict-Transport-Security) — the app does not set this header itself; verify withcurl -I.
Performance
- Edge cache headers verified:
curl -I .../api/delivery/projects/.../entries/...showsCache-Control: public, max-age=60. - Surrogate-Key header present.
- Cron handlers running hourly (
0 * * * *) (Vercel dashboard → Crons). - Webhook subscribers configured for cache invalidation on the consuming frontend.
Search
- Default Postgres search works for project content.
- If using Meilisearch:
SEARCH_PROVIDER=meilisearch,MEILI_HOST,MEILI_API_KEYset (functional names read by the search provider; also setMEILISEARCH_URL/MEILISEARCH_API_KEYif you want the health check to report Meilisearch);krios search reindex --project <slug>ran.
Observability
- Vercel logs forwarded to your log aggregator (Datadog, Logtail, etc.).
- Audit log queryable from the admin UI's Audit tab.
- Reports → Governance run once, no high-severity issues.
Frontend integration
- Delivery key created with
siteIdscope (andexpiresAtif appropriate). - Frontend uses
KriosClient.resolveRoute()for path resolution (handles redirects + 404 correctly). - Frontend webhook handler verifies HMAC signatures via
verifyKriosSignature. - Preview key created;
KriosPreviewOverlaywired into the layout under a feature flag.
Operational
- Backup strategy documented and verified (Neon PITR + bucket replication).
- Incident response: who gets paged on database-down? Vercel SSO setup for the on-call team?
- First Krios upgrade tested on a staging deployment before production.
- Custom field type registrations point at HTTPS-only origins.
Rollback plan
If a deploy goes bad:
- Vercel Deployments → previous → Promote to production.
- If a schema migration broke something, use Neon's PITR to roll the database back to before the migration ran.
- Check the audit log for any user-visible mutations that landed under the bad deploy; remediate (restore versions, unpublish, etc.).
Post-launch
- Browser: confirm the admin UI loads; sign in as the bootstrap admin.
- Browser: navigate to Reports and run Re-run analysis on Governance.
- CLI:
krios types list --project demoreturns the seeded types. - CLI:
krios entries list --project demo --limit 1returns at least one row. - curl: GET against the delivery API for a known entry returns 200 with the right body.