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 # Python 数据服务 (AKShare) akshare: build: context: ../akshare dockerfile: Dockerfile container_name: aguzhitou-akshare environment: DB_HOST: mysql DB_PORT: 3306 DB_NAME: aguzhitou DB_USER: root DB_PASSWORD: 1qazse42W3 PYTHONUNBUFFERED: "1" ports: - "8000:8000" depends_on: mysql: condition: service_healthy restart: always networks: - aguzhitou-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8000/"] interval: 30s timeout: 10s retries: 3 start_period: 40s # 后端应用 (Node.js) 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://akshare:8000 ports: - "3000:3000" depends_on: mysql: condition: service_healthy redis: condition: service_healthy akshare: 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 volumes: mysql_data: driver: local redis_data: driver: local networks: aguzhitou-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16