Skip to content

Production checklist

Before deploying Goiabada to production, verify each item on this checklist.

  • HTTPS enabled - Either direct HTTPS or behind a reverse proxy with SSL termination
  • Secure cookies enabled - Set GOIABADA_AUTHSERVER_SET_COOKIE_SECURE=true and GOIABADA_ADMINCONSOLE_SET_COOKIE_SECURE=true
  • Admin password changed - Never use the default changeme password
  • Strong database password - Use a randomly generated password (16+ characters)
  • Unique session keys - Generate fresh keys, never use examples or defaults

Generate cryptographically secure session keys:

Terminal window
# Authentication key (64 bytes = 128 hex characters)
openssl rand -hex 64
# Encryption key (32 bytes = 64 hex characters)
openssl rand -hex 32
  • Ports 9090/9091 NOT exposed - These should only be accessible from localhost or your internal network
  • Only expose 443 (and optionally 80) - All traffic should go through your reverse proxy
  • Firewall configured - Block all unnecessary ports

If behind a reverse proxy (Nginx, Cloudflare, etc.):

  • Trust proxy headers enabled - Set GOIABADA_AUTHSERVER_TRUST_PROXY_HEADERS=true
  • Proxy headers configured - Ensure your proxy sends X-Forwarded-For, X-Forwarded-Proto, X-Real-IP
  • Proxy buffer size increased - OAuth generates large headers; set proxy_buffer_size 128k in Nginx
  • Production database - Use MySQL or PostgreSQL for production (not SQLite)
  • Dedicated database user - Don’t use root/admin accounts
  • Database backups configured - Regular automated backups with tested restore procedures
  • Database encryption - Enable TLS for database connections if over network
  • Valid SSL certificates - Use Let’s Encrypt or a trusted CA
  • Auto-renewal configured - Let’s Encrypt certificates expire after 90 days
Terminal window
# Test auto-renewal
sudo certbot renew --dry-run
# Verify timer is active
sudo systemctl status certbot.timer
  • Health checks configured - Monitor /health endpoints
  • Logging configured - Ensure logs are being captured
  • Alerting set up - Get notified of failures

Health check URLs:

  • Auth server: https://auth.example.com/health
  • Admin console: https://admin.example.com/health
VariableRequiredNotes
GOIABADA_AUTHSERVER_BASEURLYesPublic URL (https://auth.example.com)
GOIABADA_AUTHSERVER_SESSION_AUTHENTICATION_KEYYes64-byte hex key
GOIABADA_AUTHSERVER_SESSION_ENCRYPTION_KEYYes32-byte hex key
GOIABADA_AUTHSERVER_TRUST_PROXY_HEADERSYestrue if behind proxy
GOIABADA_AUTHSERVER_SET_COOKIE_SECUREYestrue for HTTPS
GOIABADA_DB_TYPEYesmysql, postgres, mssql, sqlite
GOIABADA_DB_PASSWORDYesStrong password
VariableRequiredNotes
GOIABADA_ADMINCONSOLE_BASEURLYesPublic URL (https://admin.example.com)
GOIABADA_ADMINCONSOLE_OAUTH_CLIENT_IDYesadmin-console-client
GOIABADA_ADMINCONSOLE_OAUTH_CLIENT_SECRETYesGenerated secret
GOIABADA_ADMINCONSOLE_SESSION_AUTHENTICATION_KEYYes64-byte hex key
GOIABADA_ADMINCONSOLE_SESSION_ENCRYPTION_KEYYes32-byte hex key
GOIABADA_ADMINCONSOLE_TRUST_PROXY_HEADERSYestrue if behind proxy
GOIABADA_ADMINCONSOLE_SET_COOKIE_SECUREYestrue for HTTPS

After deploying:

  1. Test login flow - Verify you can log in to the admin console
  2. Test OAuth flow - Create a test client and verify the full OAuth flow
  3. Enable 2FA for admin - Add extra security to the admin account
  4. Document your deployment - Record configuration for your team
  • Exposing ports 9090/9091 directly to the internet
  • Using HTTP in production
  • Not changing default passwords
  • Reusing session keys from examples
  • Not setting up SSL certificate renewal
  • Using SQLite for high-traffic production sites
  • Enabling TRUST_PROXY_HEADERS without an actual proxy