# Docker Compose para PRODUCCIÓN # Uso: docker-compose -f docker-compose.prod.yml up -d services: # MariaDB Database mysql: image: mariadb:10.11 container_name: whatsapp-mysql restart: always environment: MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-root_password_2026} MARIADB_DATABASE: ${DB_NAME:-usite_whatsapp_bot} MARIADB_USER: ${DB_USER:-usite_whatsapp_user} MARIADB_PASSWORD: ${DB_PASS:-6q!Vio0fn@PFmsLyHjH5} TZ: America/Bogota volumes: - mysql-data:/var/lib/mysql - ./database:/docker-entrypoint-initdb.d:ro command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time-zone=America/Bogota networks: - whatsapp-network healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-root_password_2026}"] interval: 10s timeout: 5s retries: 5 start_period: 30s # Aplicación PHP con Nginx - MODO PRODUCCIÓN app: build: context: . dockerfile: Dockerfile args: - APP_ENV=production container_name: whatsapp-app restart: always ports: - "80:80" - "443:443" volumes: - .:/var/www/html - /var/www/html/vendor - ./logs:/var/www/html/logs - ./uploads:/var/www/html/uploads - ./docker/nginx/ssl.conf:/etc/nginx/http.d/ssl.conf:ro - /etc/letsencrypt:/etc/letsencrypt:ro - ssl-certs:/etc/nginx/ssl environment: # Zona horaria Colombia - TZ=America/Bogota # Entorno - APP_ENV=production - APP_DEBUG=false # Base de datos - MariaDB local en Docker - DB_HOST=mysql - DB_PORT=3306 - DB_NAME=${DB_NAME:-usite_whatsapp_bot} - DB_USER=${DB_USER:-usite_whatsapp_user} - DB_PASS=${DB_PASS:-6q!Vio0fn@PFmsLyHjH5} # Redis - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} # WhatsApp API - WHATSAPP_TOKEN=${WHATSAPP_TOKEN} - WHATSAPP_PHONE_NUMBER_ID=${WHATSAPP_PHONE_NUMBER_ID} - WEBHOOK_VERIFY_TOKEN=${WEBHOOK_VERIFY_TOKEN} # Configuración de producción - LOG_LEVEL=WARNING - ENABLE_RATE_LIMIT=true - DISPLAY_ERRORS=0 - ERROR_REPORTING=0 # PHP optimizado para producción - PHP_MEMORY_LIMIT=512M - PHP_MAX_EXECUTION_TIME=300 - PHP_OPCACHE_ENABLE=1 depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - whatsapp-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health.php"] interval: 30s timeout: 5s retries: 3 start_period: 30s # Redis para colas y caché redis: image: redis:7-alpine container_name: whatsapp-redis restart: always command: > redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru volumes: - redis-data:/data networks: - whatsapp-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # Workers para procesamiento en background worker: build: context: . dockerfile: Dockerfile.worker container_name: whatsapp-worker restart: always volumes: - ./logs:/var/www/html/logs environment: - TZ=America/Bogota - APP_ENV=production - APP_DEBUG=false - DB_HOST=mysql - DB_PORT=3306 - DB_NAME=${DB_NAME:-usite_whatsapp_bot} - DB_USER=${DB_USER:-usite_whatsapp_user} - DB_PASS=${DB_PASS:-6q!Vio0fn@PFmsLyHjH5} - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} - LOG_LEVEL=WARNING depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - whatsapp-network command: php worker.php --daemon # Mantenimiento automatizado - PRODUCCIÓN maintenance: build: context: . dockerfile: Dockerfile.maintenance container_name: whatsapp-maintenance-prod restart: always cap_add: - SYS_NICE - SETGID - SETUID volumes: - .:/var/www/html - ./logs:/var/www/html/logs - ./backups:/backups - maintenance-cron-logs:/var/log/cron environment: - TZ=America/Bogota - APP_ENV=production - DB_HOST=mysql - DB_PORT=3306 - DB_NAME=${DB_NAME:-usite_whatsapp_bot} - DB_USER=${DB_USER:-usite_whatsapp_user} - DB_PASS=${DB_PASS:-6q!Vio0fn@PFmsLyHjH5} - REDIS_HOST=redis - REDIS_PORT=6379 - APP_URL=http://app depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - whatsapp-network volumes: mysql-data: driver: local redis-data: driver: local ssl-certs: driver: local maintenance-cron-logs: driver: local networks: whatsapp-network: driver: bridge