version: '3.8' services: # MySQL 8.0 数据库 mysql: image: mysql:8.0 container_name: aguzhitou-mysql environment: MYSQL_ROOT_PASSWORD: 1qazse42W3 MYSQL_DATABASE: aguzhitou MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci TZ: Asia/Shanghai volumes: - mysql_data:/var/lib/mysql - ./init-scripts:/docker-entrypoint-initdb.d:ro ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1qazse42W3"] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: always networks: - aguzhitou-network command: > --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb_buffer_pool_size=512M --max_connections=200 --wait_timeout=28800 --interactive_timeout=28800 # Redis 7 缓存 redis: image: redis:7-alpine container_name: aguzhitou-redis volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: always networks: - aguzhitou-network # 后端应用 app: build: context: . dockerfile: Dockerfile container_name: aguzhitou-app environment: NODE_ENV: production PORT: 3000 DATABASE_URL: mysql://root:1qazse42W3@mysql:3306/aguzhitou REDIS_URL: redis://redis:6379 JWT_SECRET: aguzhitou-docker-secret-key-2024-prod-only-min-32-characters JWT_EXPIRES_IN: 7d LOG_LEVEL: info AKSHARE_URL: http://localhost:8000 ports: - "3000:3000" depends_on: mysql: condition: service_healthy redis: condition: service_healthy volumes: - ./logs:/app/logs restart: always networks: - aguzhitou-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/v1/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # AKShare 数据服务(可选) akshare: image: registry.cn-shanghai.aliyuncs.com/akshare/akshare:latest container_name: aguzhitou-akshare ports: - "8000:8000" restart: always networks: - aguzhitou-network profiles: - with-akshare volumes: mysql_data: driver: local redis_data: driver: local networks: aguzhitou-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16