version: '3.8' services: # MySQL数据库 mysql: image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/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-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 environment: # Python环境 TZ: Asia/Shanghai PYTHONPATH: /app PYTHONUNBUFFERED: 1 # 数据库配置 DB_HOST: mysql DB_PORT: 3306 DB_USER: ${MYSQL_USER:-imeeting} DB_PASSWORD: ${MYSQL_PASSWORD:-Unis@123} DB_NAME: ${MYSQL_DATABASE:-imeeting} # Redis配置 REDIS_HOST: redis REDIS_PORT: 6379 REDIS_DB: ${REDIS_DB:-0} REDIS_PASSWORD: ${REDIS_PASSWORD:-Unis@123} # API配置 API_HOST: 0.0.0.0 API_PORT: 8000 BASE_URL: ${BASE_URL:-http://localhost} # LLM配置 QWEN_API_KEY: ${QWEN_API_KEY} # 后端不直接暴露端口,通过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: - "${HTTP_PORT:-80}: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