# 基础镜像 Python 3.12（3.9 已于 2025-10 EOL）
FROM python:3.12-alpine3.21
WORKDIR /app
# 使用阿里云 apk 镜像源加速安装
# tzdata：alpine 无 zoneinfo，ENV TZ=Asia/Shanghai 不装它不生效
# （容器内日志/展示本地时间差 8 小时；计费/会话全部 epoch 秒不受影响）
# aria2：下载加速通道（常驻 RPC，仅监听 127.0.0.1 的随机端口 + 随机 secret）
#   ——标签写入已改为 mutagen 纯 Python 实现，镜像不再需要 ffmpeg
RUN sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories && \
    apk add --no-cache tzdata aria2
# 依赖由 uv 从 uv.lock 精确安装（可复现构建）；uv 二进制仅存在于构建阶段
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
ENV UV_PROJECT_ENVIRONMENT=/usr/local UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY . .
RUN chmod +x /app/entrypoint.sh
# 非 root 运行（容器安全基线）。注：挂载卷 ./downloads ./data 的宿主机目录
# 需对 UID 10001 可写（见 docker-compose.yml 注释），否则下载与数据库写入会失败
RUN adduser -D -u 10001 appuser && chown -R appuser:appuser /app
USER appuser
ENV TZ=Asia/Shanghai
EXPOSE 5000
# 容器健康检查（/health 为轻量本地端点，不触发上游请求）
HEALTHCHECK --interval=60s --timeout=5s --start-period=20s --retries=3 \
    CMD wget -qO- http://127.0.0.1:5000/health || exit 1
CMD ["/app/entrypoint.sh"]
