# Production Docker Compose configuration for dk0.dev # Optimized for production deployment version: '3.8' services: portfolio: image: portfolio-app:latest container_name: portfolio-app restart: unless-stopped ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgresql://portfolio_user:portfolio_pass@postgres:5432/portfolio_db?schema=public - REDIS_URL=redis://redis:6379 - NEXT_PUBLIC_BASE_URL=https://dk0.dev - MY_EMAIL=${MY_EMAIL:-contact@dk0.dev} - MY_INFO_EMAIL=${MY_INFO_EMAIL:-info@dk0.dev} - MY_PASSWORD=${MY_PASSWORD} - MY_INFO_PASSWORD=${MY_INFO_PASSWORD} - ADMIN_BASIC_AUTH=${ADMIN_BASIC_AUTH:-admin:your_secure_password_here} - LOG_LEVEL=info volumes: - portfolio_data:/app/.next/cache networks: - portfolio_net - proxy depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: memory: 1G cpus: '1.0' reservations: memory: 512M cpus: '0.5' postgres: image: postgres:16-alpine container_name: portfolio-postgres restart: unless-stopped environment: - POSTGRES_DB=portfolio_db - POSTGRES_USER=portfolio_user - POSTGRES_PASSWORD=portfolio_pass volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro networks: - portfolio_net healthcheck: test: ["CMD-SHELL", "pg_isready -U portfolio_user -d portfolio_db"] interval: 10s timeout: 5s retries: 5 start_period: 30s deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M cpus: '0.25' redis: image: redis:7-alpine container_name: portfolio-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data networks: - portfolio_net healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 start_period: 30s deploy: resources: limits: memory: 256M cpus: '0.25' reservations: memory: 128M cpus: '0.1' volumes: portfolio_data: driver: local postgres_data: driver: local redis_data: driver: local networks: portfolio_net: driver: bridge proxy: external: true