version: '3.8' services: # MySQL数据库 mysql: image: mysql:8.0 container_name: imeeting-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-Unis@123} MYSQL_DATABASE: ${MYSQL_DATABASE:-imeeting} MYSQL_USER: ${MYSQL_USER:-imeeting} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-Unis@123} TZ: Asia/Shanghai # 仅在需要外部访问数据库时暴露端口 ports: - "${MYSQL_PORT:-3306}:3306" volumes: - ./data/mysql:/var/lib/mysql - ./backend/sql:/docker-entrypoint-initdb.d:ro command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --default-authentication-plugin=mysql_native_password - --max_connections=1000 - --max_allowed_packet=256M healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-Unis@123}"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - imeeting-network # Redis缓存 redis: image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:7-alpineredis:7-alpine container_name: imeeting-redis restart: unless-stopped environment: TZ: Asia/Shanghai # 仅在需要外部访问Redis时暴露端口 ports: - "${REDIS_PORT:-6379}:6379" volumes: - ./data/redis:/data command: > redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-Unis@123} --maxmemory 2gb --maxmemory-policy allkeys-lru healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 3s retries: 5 start_period: 10s networks: - imeeting-network # 后端服务 backend: build: context: ./backend dockerfile: Dockerfile container_name: imeeting-backend restart: unless-stopped depends_on: mysql: condition: service_healthy redis: condition: service_healthy env_file: - ./backend/.env environment: # Python环境 TZ: Asia/Shanghai PYTHONPATH: /app PYTHONUNBUFFERED: 1 # 强制使用容器内部服务名,覆盖本地.env配置 DB_HOST: mysql REDIS_HOST: redis API_PORT: 8000 # 后端不直接暴露端口,通过nginx代理访问 # ports: # - "${BACKEND_PORT:-8000}:8000" volumes: - ./data/uploads:/app/uploads - ./data/logs/backend:/app/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - imeeting-network # 前端服务 frontend: build: context: ./frontend dockerfile: Dockerfile container_name: imeeting-frontend restart: unless-stopped depends_on: backend: condition: service_healthy environment: TZ: Asia/Shanghai # 前端不直接暴露端口,通过nginx代理访问 # ports: # - "${FRONTEND_PORT:-3001}:80" volumes: - ./data/logs/frontend:/var/log/nginx healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80/"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - imeeting-network # 网络配置 networks: imeeting-network: driver: bridge