# ============================================================
# 明缘云道场 · FastAPI 后端 Docker 镜像
#
# 基础镜像用 Python 3.11（3.9 已 EOL，3.11 是当前主流 LTS）。
# ⚠️ requirements.txt 全是「>=」下限约束：3.11 会解析到**最新版** fastapi/uvicorn/pydantic，
#    与线上 3.9（pyenv39）装的旧版（fastapi 0.128.x / uvicorn 0.39.x）不同 ——
#    切换前需用 3.11 重新做一遍接口验证（见部署方案 §3.1）。
# ============================================================
FROM python:3.11-slim

# 时区：业务用 date.today() 算「上课日/周期边界」，必须是 Asia/Shanghai。
# 项目本身无 TZ 配置，全靠系统时区，容器默认 UTC 会把周期窗口整体错位。
ENV TZ=Asia/Shanghai \
    PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1

# 换国内 apt 镜像源：构建机访问 deb.debian.org 很慢（apt-get update 要拉 ~10MB+ 索引，
# 官方源可能 4~5 分钟）。换成清华源后首次构建可降到几十秒。
# 同时兼容 deb822（debian.sources）与旧版 sources.list；构建机在海外可删掉换源这段。
RUN set -eux; \
    for f in /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list; do \
        [ -f "$f" ] && sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' "$f"; \
    done; \
    apt-get update \
    && apt-get install -y --no-install-recommends tzdata curl \
    && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /srv

# 先装依赖，利用构建缓存：requirements.txt 没变就不会重装。
# crcmod（oss2 的依赖）是 C 扩展 sdist，镜像里没装编译器，它会自动退回
# 纯 Python 实现 —— 属预期行为，只是 CRC 校验慢一点，不影响功能。
COPY requirements.txt /srv/requirements.txt
# pip 同样走国内镜像：构建机访问 pypi.org 也慢（本轮实测 10~22 kB/s），
# 换清华 PyPI 后这步可从 4 分钟降到几十秒。若清华缺包，可换成
# https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r /srv/requirements.txt \
        -i https://pypi.tuna.tsinghua.edu.cn/simple

# 代码放 /srv/wechat_backend/ —— main.py 已用相对导入（from . import ...），
# 包名与目录名彻底解耦，这里叫什么都能正常启动（uvicorn wechat_backend.main:app）。
COPY . /srv/wechat_backend/

# 端口由 PORT 环境变量决定（测试 8000 / 生产 8001）
EXPOSE 8000 8001

# 健康检查走应用自带 /api/v1/health（无鉴权、无 DB 依赖，只证进程存活）
# curl -f：非 2xx 直接返回非零退出码；${PORT:-8000} 由容器内 shell 展开
HEALTHCHECK --interval=30s --timeout=3s --start-period=15s --retries=3 \
    CMD curl -fsS "http://127.0.0.1:${PORT:-8000}/api/v1/health" >/dev/null || exit 1

# exec 让 uvicorn 成为 PID 1，能接收 SIGTERM 优雅退出。
# --workers 默认 1（贴近现状）；状态全在 DB/OSS、无内存态，多进程安全，需要时可调大。
CMD ["sh", "-c", "exec uvicorn wechat_backend.main:app --host 0.0.0.0 --port ${PORT:-8000} --workers ${WORKERS:-1}"]
