version: '3.8' services: # MySQL 8数据库 - 生产环境优化配置 mysql: image: mysql:8.0 container_name: license-manager-mysql-prod restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root@123} MYSQL_DATABASE: license_manager MYSQL_USER: license_user MYSQL_PASSWORD: ${MYSQL_PASSWORD:-license@123} TZ: Asia/Shanghai ports: - "${MYSQL_PORT:-3306}:3306" volumes: - mysql_data:/var/lib/mysql - ./mysql/conf.d:/etc/mysql/conf.d command: > --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO --max_connections=2000 --innodb_buffer_pool_size=512M --innodb_log_file_size=256M --slow_query_log=1 --slow_query_log_file=/var/lib/mysql/mysql-slow.log --long_query_time=2 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 5 start_period: 60s networks: - license-manager-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # 后端服务 - 生产环境 backend: image: ${BACKEND_IMAGE:-license-manager-backend:latest} container_name: license-manager-backend-prod restart: unless-stopped environment: - TZ=Asia/Shanghai - GIN_MODE=release ports: - "${BACKEND_PORT:-18888}:18888" volumes: - ./backend/configs:/app/backend/configs:ro - ./backend/configs/config.prod.yaml:/app/backend/cmd/config.yaml:ro - ./logs:/app/logs - ./data:/app/data depends_on: mysql: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost:18888/health || exit 1"] interval: 10s timeout: 10s retries: 6 start_period: 60s networks: - license-manager-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" deploy: resources: limits: memory: 512M reservations: memory: 256M # 前端服务 - 生产环境 frontend: image: ${FRONTEND_IMAGE:-license-manager-frontend:latest} container_name: license-manager-frontend-prod restart: unless-stopped environment: - TZ=Asia/Shanghai ports: - "${FRONTEND_PORT:-80}:80" depends_on: backend: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -fsS http://localhost/ || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - license-manager-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" deploy: resources: limits: memory: 256M reservations: memory: 128M # Redis缓存 (可选,用于session存储和缓存) redis: image: redis:7-alpine container_name: license-manager-redis-prod restart: unless-stopped ports: - "${REDIS_PORT:-6379}:6379" volumes: - redis_data:/data command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redis@123} healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - license-manager-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: mysql_data: driver: local redis_data: driver: local networks: license-manager-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16