feat(api): 修改oss

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

58
Dockerfile Normal file
View File

@@ -0,0 +1,58 @@
# ============================================================
# 明缘云道场 · 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}"]