# ===================================
# A股自选股智能分析系统 - Docker Compose
# ===================================
# 
# 使用方式:
#   定时模式: docker-compose -f ./docker/docker-compose.yml up -d
#   FastAPI模式: docker-compose -f ./docker/docker-compose.yml up -d server
#   同时启动: docker-compose -f ./docker/docker-compose.yml up -d analyzer server

name: daily-stock-analysis
version: '3.8'

x-common: &common
  build:
    context: ..
    dockerfile: docker/Dockerfile
  restart: unless-stopped

  # 环境变量（从 .env 文件加载）。不要将 ../.env 作为单文件 volume 挂载到 /app/.env，
  # 否则 Docker mount point 会阻止配置保存时的 os.replace 原子更新。
  env_file:
    - ../.env

  volumes:
    - ../data:/app/data
    - ../logs:/app/logs
    - ../reports:/app/reports
    - ../strategies:/app/strategies:ro
    # Longbridge OAuth token cache persistence; entrypoint repairs container-side ownership for dsa user.
    # Create ../longbridge_tokens on the host before copying an authorized token cache into it.
    - ../longbridge_tokens:/home/dsa/.longbridge
    # 如需覆盖前端静态资源，可挂载本地 static 目录
    # - ../static:/app/static:ro

  environment:
    - TZ=Asia/Shanghai

    # Web/API service bind address (must be 0.0.0.0 inside container)
    - WEBUI_HOST=0.0.0.0
    # API_PORT 从 .env 文件读取，无需在此硬编码

    # 代理设置（如果需要）
    # - http_proxy=http://host.docker.internal:10809
    # - https_proxy=http://host.docker.internal:10809
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"
  # 资源限制：完整分析建议 1G+；512M 仅适合轻量 Web/API、单股、低并发场景，
  # 且建议设置 MAX_WORKERS=1 并避免同时启动 analyzer 和 server。
  deploy:
    resources:
      limits:
        memory: 1G
      reservations:
        memory: 512M

services:
  # 定时任务模式
  analyzer:
    <<: *common
    container_name: stock-analyzer

  # FastAPI 模式
  server:
    <<: *common
    container_name: stock-server
    command: ["python", "main.py", "--serve-only", "--host", "0.0.0.0", "--port", "${API_PORT:-8000}"]
    # 若使用 network_mode: host，则以下 ports 映射无效，端口由 command 中的 --port 指定
    ports:
      - "${API_PORT:-8000}:${API_PORT:-8000}"
