This checklist ensures all required services and secrets are properly configured for production deployment.
- Fly.io CLI installed and authenticated
- Production domain configured
- SSL/TLS certificates configured (handled by Fly.io automatically)
- PostgreSQL database created on Fly.io or managed service
- Database migrations run successfully
-
DATABASE_URLsecret set in production -
DATABASE_SSL=trueconfigured - Connection pooling configured (if high traffic expected)
- WorkOS account created
- Production OAuth application configured
-
WORKOS_API_KEYsecret set (use live key, not test) -
WORKOS_CLIENT_IDsecret set -
WORKOS_COOKIE_PASSWORDgenerated and set (min 32 characters) -
WORKOS_REDIRECT_URIset to production callback URL (https://) -
ADMIN_EMAILSconfigured with authorized admin email addresses
- Stripe account in production mode
-
STRIPE_SECRET_KEYset (sk_live_...) -
STRIPE_PUBLISHABLE_KEYset (pk_live_...) -
STRIPE_PRICING_TABLE_IDconfigured - Webhook endpoint configured in Stripe dashboard
-
STRIPE_WEBHOOK_SECRETset from Stripe webhook settings - Test webhook delivery working
Run this command to set all secrets in Fly.io:
# Required secrets
fly secrets set \
DATABASE_URL="postgresql://user:pass@host:5432/db" \
WORKOS_API_KEY="sk_live_..." \
WORKOS_CLIENT_ID="client_..." \
WORKOS_COOKIE_PASSWORD="<32-char-random-string>" \
WORKOS_REDIRECT_URI="https://yourdomain.com/auth/callback" \
ADMIN_EMAILS="admin@example.com,owner@example.com" \
--app adcp-docs
# Billing secrets (if using Stripe)
fly secrets set \
STRIPE_SECRET_KEY="sk_live_..." \
STRIPE_PUBLISHABLE_KEY="pk_live_..." \
STRIPE_PRICING_TABLE_ID="prctbl_..." \
STRIPE_WEBHOOK_SECRET="whsec_..." \
--app adcp-docs-
Build and deploy:
fly deploy --app adcp-docs
-
Run database migrations:
fly ssh console --app adcp-docs # Inside the container: cd /app && node dist/db/migrate.js
-
Verify health:
fly status --app adcp-docs fly logs --app adcp-docs
-
Test critical paths:
- Homepage loads
-
/api/healthreturns 200 - Authentication flow works (login/logout)
- Dashboard loads for authenticated users
- Stripe webhooks receive events
- Analytics dashboard loads at /admin/analytics
- Admin endpoints require proper authentication
- Configure log aggregation (Fly.io logs or external service)
- Set up uptime monitoring
- Configure alerts for critical errors
- Monitor database connection pool usage
- Track Stripe webhook failures
- All secrets use production values (no test keys)
- HTTPS enforced for all endpoints
- Secure cookies enabled (NODE_ENV=production)
- Admin endpoints require authentication
- Database uses SSL connections
- No secrets committed to git
- Test complete user registration flow
- Test subscription purchase flow
- Verify webhook processing
- Check analytics data updates
- Monitor error rates for 24 hours
- Document any production-specific configuration
If deployment fails:
# List deployments
fly releases --app adcp-docs
# Rollback to previous version
fly releases rollback <version> --app adcp-docs