# Staging overlay for Custom PHP Framework # Extends base docker-compose.yml with staging-specific configurations version: '3.8' services: web: environment: - APP_ENV=staging - PHP_IDE_CONFIG= # Remove IDE config in staging ports: # Expose both HTTP and HTTPS for staging testing - "${APP_PORT:-8000}:80" - "${APP_SSL_PORT:-443}:443/tcp" - "443:443/udp" volumes: # Semi-readonly application code in staging - ./:/var/www/html:cached - ./ssl:/var/www/ssl:ro healthcheck: test: ["CMD", "curl", "-f", "-k", "https://localhost/health"] interval: 30s timeout: 10s retries: 3 start_period: 20s restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "5" labels: "service=nginx,environment=staging" deploy: resources: limits: memory: 512M cpus: '1.0' reservations: memory: 256M cpus: '0.5' php: environment: - APP_ENV=staging - APP_DEBUG=true # Enable debug in staging - PHP_IDE_CONFIG= # Remove IDE config - XDEBUG_MODE=debug # Enable Xdebug in staging for debugging build: args: - ENV=staging - COMPOSER_INSTALL_FLAGS=--optimize-autoloader user: "1000:1000" # Keep development user for staging volumes: # Cached application code for staging - ./:/var/www/html:cached - storage-data:/var/www/html/storage:rw - var-data:/var/www/html/var:rw - composer-cache:/root/.composer/cache healthcheck: test: ["CMD", "php", "/var/www/html/public/health.php"] interval: 30s timeout: 10s retries: 3 start_period: 40s restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "5" labels: "service=php,environment=staging" deploy: resources: limits: memory: 1G cpus: '2.0' reservations: memory: 512M cpus: '1.0' db: environment: - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} - MYSQL_DATABASE=${DB_DATABASE} - MYSQL_USER=${DB_USERNAME} - MYSQL_PASSWORD=${DB_PASSWORD} ports: - "33060:3306" # Keep external port for staging database access volumes: - db_data:/var/lib/mysql healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "127.0.0.1", "-u", "root", "-p${DB_ROOT_PASSWORD}"] interval: 30s timeout: 10s retries: 5 start_period: 60s restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "5" labels: "service=mariadb,environment=staging" deploy: resources: limits: memory: 1G cpus: '1.0' reservations: memory: 512M cpus: '0.5' redis: volumes: # Use standard Redis configuration in staging - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro - redis_data:/data command: ["redis-server", "/usr/local/etc/redis/redis.conf"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 5s retries: 3 start_period: 20s restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "5" labels: "service=redis,environment=staging" deploy: resources: limits: memory: 512M cpus: '1.0' reservations: memory: 256M cpus: '0.5' queue-worker: environment: - APP_ENV=staging - APP_DEBUG=true # Enable debug for staging - WORKER_DEBUG=true - WORKER_SLEEP_TIME=${WORKER_SLEEP_TIME:-100000} - WORKER_MAX_JOBS=${WORKER_MAX_JOBS:-500} - WORKER_MEMORY_LIMIT=${WORKER_MEMORY_LIMIT:-512M} build: args: - ENV=staging - COMPOSER_INSTALL_FLAGS=--optimize-autoloader user: "1000:1000" volumes: - ./:/var/www/html:cached - ./storage/logs:/var/www/html/storage/logs:rw - ./src/Framework/CommandBus/storage:/var/www/html/src/Framework/CommandBus/storage:rw restart: unless-stopped stop_grace_period: 45s logging: driver: "json-file" options: max-size: "50m" max-file: "5" labels: "service=queue-worker,environment=staging" deploy: resources: limits: memory: 768M cpus: '1.0' reservations: memory: 384M cpus: '0.5' # Staging network configuration - more permissive than production networks: frontend: driver: bridge backend: driver: bridge cache: driver: bridge volumes: redis_data: driver: local composer-cache: driver: local storage-data: driver: local var-data: driver: local db_data: driver: local