# Docker Compose Configuration for Staging Deployment # This file is used by CI/CD to deploy the application on staging servers # # Key differences from production docker-compose.prod.yml: # - Container name: mypage-staging (vs mypage-prod) # - Port mapping: 3031:3030 (vs 3030:3030) # - Network name: mypage-staging-network (vs mypage-network) # - Image tag: staging (vs latest) # # Usage: # 1. This file is automatically copied to server by CI/CD workflow # 2. Server pulls image from registry: docker compose -f docker-compose.staging.yml pull # 3. Server starts container: docker compose -f docker-compose.staging.yml up -d # # Manual deployment (if CI/CD is not available): # ssh user@staging-server # cd /opt/mypage-staging # docker compose -f docker-compose.staging.yml pull # docker compose -f docker-compose.staging.yml up -d --force-recreate version: '3.8' services: mypage: # Use pre-built image from private registry with staging tag # This image is built and pushed by the CI/CD workflow # Format: REGISTRY_URL/IMAGE_NAME:TAG image: repository.workspace:5000/mypage:staging container_name: mypage-staging # Restart policy: always restart on failure or server reboot # This ensures high availability in staging restart: always # Port mapping: host:container # Staging runs on port 3031 to avoid conflicts with production (3030) # The application will be accessible at http://SERVER_IP:3031 ports: - "3031:3030" # Staging environment variables environment: - NODE_ENV=production - NEXT_TELEMETRY_DISABLED=1 - PORT=3030 - HOSTNAME=0.0.0.0 # Add any other staging-specific environment variables here # Example: # - DATABASE_URL=postgresql://user:pass@db:5432/mypage_staging # - REDIS_URL=redis://redis:6379 # Persistent volumes for logs (optional) # Uncomment if your application writes logs volumes: - ./data/logs:/app/logs # Health check configuration # Docker monitors the application and marks it unhealthy if checks fail # If container is unhealthy, restart policy will trigger a restart healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3030/", "||", "exit", "1"] interval: 30s # Check every 30 seconds timeout: 10s # Wait up to 10 seconds for response retries: 3 # Mark unhealthy after 3 consecutive failures start_period: 40s # Grace period during container startup # Resource limits for staging # Prevents container from consuming all server resources # deploy: # resources: # limits: # cpus: '1.0' # Maximum 1 CPU core # memory: 512M # Maximum 512MB RAM # reservations: # cpus: '0.25' # Reserve at least 0.25 CPU cores # memory: 256M # Reserve at least 256MB RAM # Network configuration networks: - mypage-staging-network # Logging configuration # Prevents logs from consuming all disk space logging: driver: "json-file" options: max-size: "10m" # Maximum 10MB per log file max-file: "3" # Keep only 3 log files (30MB total) # Network definition networks: mypage-staging-network: driver: bridge # ============================================ # Staging Deployment Commands # ============================================ # # Pull latest image from registry: # docker compose -f docker-compose.staging.yml pull # # Start/update containers: # docker compose -f docker-compose.staging.yml up -d --force-recreate # # View logs: # docker compose -f docker-compose.staging.yml logs -f mypage # # Check health status: # docker inspect mypage-staging | grep -A 10 Health # # Stop containers: # docker compose -f docker-compose.staging.yml down # # Restart containers: # docker compose -f docker-compose.staging.yml restart # # Remove old/unused images (cleanup): # docker image prune -f # # ============================================ # Troubleshooting # ============================================ # # If container keeps restarting: # 1. Check logs: docker compose -f docker-compose.staging.yml logs --tail=100 # 2. Check health: docker inspect mypage-staging | grep -A 10 Health # 3. Verify port is not already in use: netstat -tulpn | grep 3031 # 4. Check resource usage: docker stats mypage-staging # # If health check fails: # 1. Test manually: docker exec mypage-staging curl -f http://localhost:3030/ # 2. Check if Next.js server is running: docker exec mypage-staging ps aux # 3. Verify environment variables: docker exec mypage-staging env #