version: '3.8' services: # MySQL 数据库 mysql: image: mysql:8.0 container_name: ezops-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-CHANGE_ME} MYSQL_DATABASE: ezops MYSQL_USER: ezops MYSQL_PASSWORD: ${MYSQL_PASSWORD:-CHANGE_ME} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] interval: 10s timeout: 5s retries: 5 # Redis 缓存(可选) redis: image: redis:7-alpine container_name: ezops-redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # EZOps 后端服务 backend: build: context: . dockerfile: Dockerfile container_name: ezops-backend restart: unless-stopped ports: - "8080:8080" environment: - APP_MODE=release - DATABASE_DRIVER=mysql - DATABASE_MYSQL_HOST=mysql - DATABASE_MYSQL_PORT=3306 - DATABASE_MYSQL_USERNAME=ezops - DATABASE_MYSQL_PASSWORD=${MYSQL_PASSWORD:-CHANGE_ME} - DATABASE_MYSQL_DATABASE=ezops - REDIS_ENABLED=true - REDIS_HOST=redis - REDIS_PORT=6379 volumes: - ./config.yaml:/app/config.yaml - ./logs:/app/logs - ./uploads:/app/uploads depends_on: mysql: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Nginx 反向代理(可选) nginx: image: nginx:alpine container_name: ezops-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - backend volumes: mysql_data: redis_data: networks: default: name: ezops-network