version: '3.8' services: # 选币引擎服务 coin-selector: build: . container_name: trading-ai-selector restart: unless-stopped volumes: - ./data:/app/data - ./logs:/app/logs - ./config.py:/app/config.py:ro # 只读挂载配置文件 - trading-db:/app/trading.db environment: - PYTHONPATH=/app - TZ=Asia/Shanghai # 钉钉配置(可选,也可以通过config.py配置) - DINGTALK_WEBHOOK_URL=${DINGTALK_WEBHOOK_URL:-} - DINGTALK_WEBHOOK_SECRET=${DINGTALK_WEBHOOK_SECRET:-} # 选币配置 - USE_MARKET_CAP_RANKING=${USE_MARKET_CAP_RANKING:-true} - COIN_LIMIT=${COIN_LIMIT:-50} command: python coin_selection_engine.py healthcheck: test: ["CMD", "python", "-c", "import os; exit(0 if os.path.exists('/app/trading.db') else 1)"] interval: 30s timeout: 10s retries: 3 networks: - trading-network # Web仪表板服务 web-dashboard: build: . container_name: trading-ai-web restart: unless-stopped ports: - "5000:5000" volumes: - ./data:/app/data - ./logs:/app/logs - ./static:/app/static - ./templates:/app/templates - trading-db:/app/trading.db environment: - PYTHONPATH=/app - TZ=Asia/Shanghai - FLASK_ENV=production command: python web_app.py depends_on: - coin-selector healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 10s retries: 3 networks: - trading-network # 定时调度服务 scheduler: build: . container_name: trading-ai-scheduler restart: unless-stopped volumes: - ./data:/app/data - ./logs:/app/logs - ./config.py:/app/config.py:ro - trading-db:/app/trading.db environment: - PYTHONPATH=/app - TZ=Asia/Shanghai - DINGTALK_WEBHOOK_URL=${DINGTALK_WEBHOOK_URL:-} - DINGTALK_WEBHOOK_SECRET=${DINGTALK_WEBHOOK_SECRET:-} command: python scheduler.py depends_on: - coin-selector networks: - trading-network # 网络配置 networks: trading-network: driver: bridge # 数据卷 volumes: trading-db: driver: local # 环境变量文件示例 # 创建 .env 文件并设置以下变量: # # # 钉钉机器人配置 # DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN # DINGTALK_WEBHOOK_SECRET=SEC_YOUR_SECRET # # # 选币配置 # USE_MARKET_CAP_RANKING=true # COIN_LIMIT=50 # # # Binance API(可选) # BINANCE_API_KEY=your_api_key # BINANCE_SECRET=your_secret