# 生产加固覆盖层 —— 与 base 叠加使用（base 保持 dev 便利，本文件收紧安全）：
#   docker compose -f docker-compose.yml -f docker-compose.prod.yml build
#   docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
#
# 需在宿主机 .env（chmod 600，勿入库）或环境变量提供以下必填项（缺失即拒绝 up / config 报错）：
#   POSTGRES_PASSWORD   —— pg 强随机口令（替换 base 的弱口令 writer/writer）
#   CREDENTIAL_ENC_KEY  —— Fernet key（生产新生成，勿用 .env.example 占位值）
#   CORS_ORIGINS        —— 前端真实来源，逗号分隔，禁通配 *
#   NEXT_PUBLIC_API_BASE—— 浏览器可达的公网 API 基址（构建期内联进 web bundle）
services:
  pg:
    environment:
      POSTGRES_USER: writer
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填（生产强口令，勿用 base 弱口令）}
      POSTGRES_DB: writer
    # 生产不发布任何宿主端口：迁移经 compose 内网（`run --rm api alembic`）直连 pg 服务名，
    # 且宿主已有别的 pg 占用 127.0.0.1:5432。!reset 清掉 base 的 "5432:5432"——否则 compose
    # 会「拼接」两份端口（base 的 0.0.0.0:5432 + 本层），既暴露公网又与宿主 pg 冲突。
    ports: !reset []
    restart: unless-stopped

  api:
    environment:
      DATABASE_URL: postgresql+asyncpg://writer:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填}@pg:5432/writer
      DATABASE_URL_SYNC: postgresql+psycopg://writer:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD 必填}@pg:5432/writer
      APP_ENV: prod
      LOG_JSON: "true"
      CREDENTIAL_ENC_KEY: ${CREDENTIAL_ENC_KEY:?CREDENTIAL_ENC_KEY 必填（生产 Fernet key，勿用占位值）}
      CORS_ORIGINS: ${CORS_ORIGINS:?CORS_ORIGINS 必填（前端真实来源，逗号分隔，禁通配）}
    # base 发布 0.0.0.0:8000（dev 便利）；生产只绑回环——nginx 是唯一公网入口，basic auth 不可绕过。
    # !override 整体替换 base 的端口列表（否则拼接会残留 0.0.0.0:8000）。
    ports: !override
      - "127.0.0.1:8000:8000"
    restart: unless-stopped

  web:
    build:
      context: ./apps/web
      args:
        # 构建期内联：生产须指向浏览器可达的公网 API（通常反代后的 https 域名）。
        NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填（浏览器可达的公网 API 基址）}
        # 本机所在区域 registry.npmjs.org 不可达，构建走 npmmirror 镜像（可用 env NPM_REGISTRY 覆盖）。
        NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmmirror.com}
    environment:
      NEXT_PUBLIC_API_BASE: ${NEXT_PUBLIC_API_BASE:?NEXT_PUBLIC_API_BASE 必填}
      API_BASE_INTERNAL: http://api:8000
    # 只绑回环（同 api）：nginx 反代 127.0.0.1:3000 是唯一公网入口。!override 替换 base 的 3000:3000。
    ports: !override
      - "127.0.0.1:3000:3000"
    restart: unless-stopped
