ByteBite Docs
Deployment

Production Deployment

Production deployment status, requirements, and checklist.

Production Deployment

STATUS: NOT DEPLOYED

Production application infrastructure is not deployed. DNS records for getbytebite.co, api.getbytebite.co, dashboard.getbytebite.co, docs.getbytebite.co, and www.getbytebite.co already point toward 88.99.0.118, but no production application stack, database, or validated configuration exists.

Do not treat DNS existence as production being live.

What exists today

ItemStatus
Production DNS records in CloudflareConfigured (DNS-only)
Production Dokploy environmentNot created
Production PostgreSQLNot deployed
Production application containersNot deployed
Production object storage (B2)Not deployed
Production mail (SES)Not configured
Production monitoringNot deployed

Staging is the only active hosted environment. See Environments.

Expected production differences from staging

AspectStaging (current)Production (planned)
BYTEBITE_DEPLOY_ENVstaging (Coming Soon, Staging)production (indexing enabled; Coming Soon, Production). Compose defaults to staging when the variable is absent
Domains*.staging.getbytebite.co; landing apex staging.getbytebite.co (ADR-022, Coming Soon)getbytebite.co and www.getbytebite.co landing; <slug>.getbytebite.co and custom restaurant domains
Demo seedsLuigi/Mario staging hostsNone
noindexAll public appsStorefront indexable; dashboard remains noindex
Object storageNot deployedBackblaze B2 (ADR-018)
MailNot configuredAWS SES (transactional)
TLS wildcard*.staging.getbytebite.co (DNS-01)Custom-domain strategy TBD
PostgreSQLDokploy managed (staging)TBD — likely Dokploy managed
Access protectionNoneTBD (WAF, rate limiting)

Production deployment checklist

Infrastructure prerequisites

  • Production PostgreSQL backup policy defined, implemented, and tested (staging backup verified separately — see Backups)
  • Object storage (Backblaze B2) provisioned with bucket layout defined for application media
  • AWS SES configured with verified sending domain
  • Mail DNS complete (SPF, DKIM, DMARC, PTR)
  • Monitoring and alerting deployed
  • Security review completed (WAF, access controls, dot-path fixes)
  • Traefik DNS-01 / TLS strategy for production and custom domains
  • Dokploy production environment created
  • Production secrets configured in Dokploy (no staging values reused)

Application prerequisites

  • BYTEBITE_DEPLOY_ENV=production (the compose default is staging; an absent value keeps the staging heading and noindex)
  • SENTRY_DSN configured
  • Stripe credentials configured (when payments implemented)
  • No seed-staging.js run against production database
  • Migrations applied automatically by the migrate one-shot in compose.deploy.yml (same file as staging; no env gate). Confirm Exited (0) after the first production deploy. Manual fallback: node db/dist/migrate.js
  • Full Validation adapted for production domains

DNS cutover

  • Verify all production DNS records resolve correctly
  • TLS certificates issued for all production hosts
  • HTTP → HTTPS redirect verified
  • Custom restaurant domain TLS strategy implemented (if launching with custom domains)

Post-deploy validation

  • Health endpoints respond
  • No staging noindex headers on storefront
  • Tenant resolution works on production domains
  • Same-origin /api routing verified
  • Backup verification scheduled

Unresolved blockers

See Known gaps for the full register. Critical blockers:

  1. No production PostgreSQL backup policy (staging backup exists; production not deployed)
  2. No production object storage for application media
  3. No production mail (SES)
  4. No custom-domain TLS implementation
  5. No monitoring/alerting
  6. Dokploy Traefik customization survival not automated

Compose pattern

Production will likely reuse compose.deploy.yml with production environment variables and Dokploy domain configuration. The same service pattern (migrate one-shot, api, storefront, dashboard, docs) applies. PostgreSQL, Traefik, and Dokploy remain outside the compose file. The migrate one-shot is not gated by environment; production inherits automatic migrations.

On this page