version: '3.8' services: # Flask应用服务 app: build: context: . dockerfile: Dockerfile image: flask-prompt-master:latest container_name: flask-prompt-master-app restart: unless-stopped environment: - FLASK_ENV=production - DATABASE_URL=mysql+pymysql://root:${MYSQL_ROOT_PASSWORD}@mysql:3306/${MYSQL_DATABASE}?charset=utf8mb4 - REDIS_URL=redis://redis:6379/0 - SECRET_KEY=${SECRET_KEY} - LLM_API_KEY=${LLM_API_KEY} depends_on: - mysql - redis volumes: - ./logs:/app/logs - ./uploads:/app/uploads networks: - app-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # MySQL数据库 mysql: image: mysql:8.0 container_name: flask-prompt-master-mysql restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} volumes: - mysql_data:/var/lib/mysql - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - app-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 3 # Redis缓存 redis: image: redis:7-alpine container_name: flask-prompt-master-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data:/data networks: - app-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 # Nginx反向代理 nginx: image: nginx:alpine container_name: flask-prompt-master-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf - ./docker/nginx/ssl:/etc/nginx/ssl - ./logs/nginx:/var/log/nginx depends_on: - app networks: - app-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 # 监控服务 monitor: build: context: . dockerfile: Dockerfile.monitor image: flask-prompt-master-monitor:latest container_name: flask-prompt-master-monitor restart: unless-stopped environment: - APP_URL=http://app:5000 - MONITOR_INTERVAL=30 volumes: - ./logs:/app/logs depends_on: - app networks: - app-network healthcheck: test: ["CMD", "python", "-c", "import requests; requests.get('http://app:5000/health')"] interval: 60s timeout: 10s retries: 3 # 日志管理服务 log-manager: build: context: . dockerfile: Dockerfile.log-manager image: flask-prompt-master-log-manager:latest container_name: flask-prompt-master-log-manager restart: unless-stopped volumes: - ./logs:/app/logs networks: - app-network command: ["python", "log_manager.py"] profiles: - maintenance volumes: mysql_data: driver: local redis_data: driver: local networks: app-network: driver: bridge