version: '3.4' services: new-api: build: context: . dockerfile: Dockerfile container_name: new-api-prod restart: always command: --log-dir /app/logs ports: - "3000:3000" volumes: - ./data:/data - ./logs:/app/logs environment: # 生产环境数据库配置 - 使用环境变量 - SQL_DSN=${MYSQL_USER:-newapi_user}:${MYSQL_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE:-new_api} - REDIS_CONN_STRING=redis://:${REDIS_PASSWORD}@redis:6379 - TZ=Asia/Shanghai - ERROR_LOG_ENABLED=true - STREAMING_TIMEOUT=120 # 生产环境必须设置的安全配置 - SESSION_SECRET=${SESSION_SECRET} # 必须设置!多机部署时的会话密钥 # 可选配置 # - NODE_TYPE=slave # 多节点部署时取消注释 # - SYNC_FREQUENCY=60 # 需要定期数据库同步时取消注释 # - FRONTEND_BASE_URL=${FRONTEND_BASE_URL} # 多节点部署时的前端URL depends_on: mysql: condition: service_healthy redis: condition: service_started healthcheck: test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'"] interval: 30s timeout: 10s retries: 5 start_period: 60s redis: image: redis:7-alpine container_name: redis-prod restart: always command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 30s timeout: 10s retries: 3 # 生产环境不暴露Redis端口 # ports: # - "6379:6379" mysql: image: mysql:8.2 container_name: mysql-prod restart: always environment: # 生产环境MySQL配置 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE:-new_api} MYSQL_USER: ${MYSQL_USER:-newapi_user} MYSQL_PASSWORD: ${MYSQL_PASSWORD} # MySQL性能优化配置 MYSQL_INNODB_BUFFER_POOL_SIZE: 256M MYSQL_INNODB_LOG_FILE_SIZE: 64M MYSQL_MAX_CONNECTIONS: 200 volumes: - mysql_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d # 初始化脚本目录 command: > --default-authentication-plugin=mysql_native_password --innodb-buffer-pool-size=256M --innodb-log-file-size=64M --max-connections=200 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 30s timeout: 10s retries: 5 start_period: 60s # 生产环境不暴露MySQL端口 # ports: # - "3306:3306" volumes: mysql_data: driver: local redis_data: driver: local networks: default: name: newapi-prod-network