Files
wechat_backend/Dockerfile
王宏豪 faa114503f feat(api): 修改oss
- 替换开发环境API基础URL为本地服务地址
- 实现签名URL本地缓存机制,解决微信按URL缓存图片导致重复下载问题
- 添加缓存清理功能,包括过期清理和按需删除特定缓存项
- 集成阿里云OSS上传功能,支持直传减少服务器带宽占用
- 优化头像地址处理逻辑,统一使用签名缓存避免地址频繁变化
- 移除过时的OSS上传示例文件oss-upload.js
- 更新课程页面实现跳转第三方小程序功能
- 调整打卡记录图片地址获取方式,统一使用新的签名缓存逻辑
- 优化图片上传流程,增加压缩处理和批量上传支持
- 完善认证模块中的缓存清理逻辑,切换账号时清除相关图片缓存
- 添加后端环境变量配置模板和代理文档说明
2026-10-10 10:27:00 +08:00

59 lines
3.2 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================
# 明缘云道场 · 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}"]