Overview
The production configuration is optimized for production deployments with multi-stage builds, resource limits, restart policies, and security best practices.Production Features
Optimized Builds
Multi-stage Docker builds for smaller images
Resource Limits
Memory limits and CPU constraints
Auto-restart
Automatic restart on failure
Security Hardened
Strong passwords and security best practices
Prerequisites
- Docker and Docker Compose installed
- PostgreSQL database configured
- GitHub OAuth app created
- Resend API key for emails
- Strong passwords generated
Environment Configuration
Create a.env file with production values:
Quick Start
Service Details
Redis
Lightweight Alpine-based Redis 7 image
Exposed to host for external connections
Persistent storage for Redis data
- Password protected (via
REDIS_PASSWORD) - AOF (Append Only File) persistence enabled
- Memory limit: 256MB with LRU eviction policy
- Health checks configured
Backend
High-performance JavaScript runtime
Configurable via
BACKEND_PORT- Production-optimized build
- tRPC API endpoints
- Depends on Redis health check
- Auto-restart on failure
Frontend
Next.js application
Configurable via
FRONTEND_PORT- Standalone build for smaller image size
- Production-optimized
- Depends on Backend service
Worker
Processes uptime checks from Redis streams
- Consumes messages from Redis streams
- Performs uptime checks
- Reports results to ClickHouse (optional)
- Auto-restart on failure
Publisher
Publishes website checks to Redis streams
- Publishes checks every 3 minutes
- Reads active websites from database
- Publishes to Redis streams for workers
Production Commands
Service Management
Monitoring
Updates and Rebuilds
Security Best Practices
Redis Password
Redis Password
Generate a secure password:Set in
.env:JWT Secret
JWT Secret
Use a cryptographically secure random string:Never use the development default (
dev-secret) in production.Environment Variables
Environment Variables
- Never commit
.envfiles to version control - Use environment-specific
.envfiles - Rotate secrets regularly
- Use secrets management for sensitive values
Network Security
Network Security
- Services are isolated in Docker networks
- Only necessary ports are exposed to host
- Consider using a reverse proxy (nginx, Traefik)
- Enable HTTPS with SSL/TLS certificates
Regular Updates
Regular Updates
- Update base images regularly for security patches
- Monitor for vulnerabilities in dependencies
- Keep Docker and Docker Compose up to date
Scaling
Scale services to handle increased load:Multiple workers will share the same consumer group, distributing load across instances.
Maintenance
Redis Data Backup
Redis Data Restore
Redis CLI Access
Migration from Cloud Redis
When migrating from cloud Redis to self-hosted:Update environment
Change
REDIS_HOST from cloud URL to redis (for Docker networking) or 127.0.0.1 (for host networking).Troubleshooting
Services Won't Start
Services Won't Start
-
Check service logs:
- Verify environment variables are set correctly
-
Check for port conflicts:
- Ensure Docker has enough resources (memory, disk space)
Redis Connection Failures
Redis Connection Failures
- Verify Redis password matches in all service configurations
-
Check Redis is healthy:
-
Test Redis connection:
High Memory Usage
High Memory Usage
-
Check Docker stats:
- Redis has a 256MB limit with LRU eviction
-
Consider increasing Redis memory limit in docker-compose.prod.yaml:
Next Steps
Environment Variables
Complete environment variable reference
Database Setup
Configure PostgreSQL and run migrations
Development Setup
Set up local development environment