checkpoint: 基建与确定性文档更新——运营手册 3.1.0 + 引擎实施记录 18.23

运营手册升 3.1.0:定时任务 jobstore 落 PG 说明、SQLite 彻底清理、require_redis 显式
503 守卫行、备份口径同步。实施记录追加 18.23:引擎确定性修复(系谱按 id 规范排序,
消除 DB 行序对 MME 布局影响,根因链 + 验证)。
This commit is contained in:
34047007@qq.com
2026-08-07 22:44:03 +08:00
parent 7e449b5c9d
commit 93af27d1e1
2 changed files with 25 additions and 6 deletions
@@ -1,8 +1,9 @@
# 数字化桃育种系统 生产上线与运营手册
> 版本:3.0.1 适用:生产(Docker Compose)部署
> 版本:3.1.0 适用:生产(Docker Compose)部署
> 前置阅读:`docker/README.md`(部署操作)、`doc/桃育种系统模块扩展需求规格.md`(功能规格,v2.72026-08-04
> 本文档基于 2026-08-04 安全加固后的代码与配置撰写,上线前请逐项核对。
> 3.1.02026-08-07):定时任务 jobstore 落 PostgreSQL、SQLite 彻底清理、Redis 降级守卫完备(存储类接口显式 503),详见各节标注。
---
@@ -16,7 +17,7 @@
| 反向代理 | nginx 1.25-alpine | 容器 `nginx` | TLS 终结、HTTP→HTTPS、API 反代、限流 |
| 后端 | FastAPI + SQLAlchemy async + Redis | 容器 `backend` | `python main.py run --env=prod` |
| 数据库 | PostgreSQL 16 | 容器 `postgres` | 见 §3 |
| 缓存 | Redis 7 | 容器 `redis` | 会话、验证码、登录锁定计数、系统参数缓存 |
| 缓存 | Redis 7 | 容器 `redis` | 会话、验证码、登录锁定计数、系统参数缓存**定时任务 jobstore 已落 PG**,不依赖 Redis,见 §3 |
### 1.2 端口暴露(已收紧到本机回环)
@@ -32,8 +33,8 @@
### 1.3 数据流
```
浏览器 ──443──> nginxTLS/限流/反代)──8001──> backend ──> PostgreSQL 16
└──> Redis
浏览器 ──443──> nginxTLS/限流/反代)──8001──> backend ──> PostgreSQL 16(业务数据 + 定时任务 jobstore)
└──> Redis(会话/缓存;降级时参数/字典读接口回源 DB)
```
---
@@ -89,6 +90,8 @@ Docker Compose 使用(`docker compose --env-file .env up -d`)。必填项缺
生产固定使用 PostgreSQL 16,与开发环境(`localhost:5432`,库/角色 `dpb`)一致,可用 `pg_dump`/`pg_restore` 无缝迁移。
**定时任务 jobstore 落 PG3.1.0**:调度器默认 jobstore 为 `apscheduler_jobs` 表(SQLAlchemyJobStore),任务定义持久化于主库——重启/升级后由 apscheduler 原生机制自动恢复,**不依赖 Redis**(多 Worker 场景本系统不适用,故不做 Redis jobstore)。该表随主库每日备份(§6.2),备份即含任务定义。
`docker/docker-compose.yaml` 已编排 `postgres:16` 服务:
| 配置 | 值 |
@@ -201,6 +204,7 @@ docker compose ps # 全部 healthy 为佳
| 生产配置 fail-safe | SECRET_KEY 非默认/≥32 位、DEBUG=false、CORS 非空,否则**拒绝启动** | `setting.py` |
| 日志脱敏 | 密码/token/验证码等字段掩码为 `***`refresh/logout 裸 body 整体掩码 | `router_class.py` |
| 登录暴力破解 | 同一用户名+IP 连续失败 5 次锁定 15 分钟(Redis);Redis 故障时自动降级不锁死 | `auth/service.py` |
| 存储类接口降级守卫 | AI配置/在线监控/缓存监控/验证码接口依赖 `require_redis`Redis 不可用显式 **503**(而非 500/静默空数据);参数/字典读接口回源数据库;调度任务 jobstore 已落 PG 不受影响 | `dependencies.py` |
| 生产关闭文档 | `/docs`、`/redoc` 生产不注册 | `init_app.py` |
| 客户端 IP 防伪造 | 默认不信任 XFF;`IP_TRUST_PROXY_HEADERS=true` 才读取 | `ip_local_util.py` |
| 端口收内网 | 数据库/Redis/后端均绑 `127.0.0.1` | `docker-compose.yaml` |
@@ -239,14 +243,14 @@ docker compose logs -f backend # 实时日志
### 6.2 备份与恢复
**备份优先级**:数据库 > 上传文件 > 配置 > 前端产物(可重建)> Redis(会话可重建)。
**备份优先级**:数据库 > 上传文件 > 配置 > 前端产物(可重建)> Redis(会话可重建;定时任务 jobstore 已落 PG,随数据库备份)。
| 数据 | 位置 | 策略 |
|------|------|------|
| 数据库(核心) | 数据库卷 | 每日全量 + 保留 7~14 天,异地一份 |
| 上传文件 | `backend/static/upload`(容器内 `/home/static/upload` | 每日增量同步 |
| 配置 | `docker/.env`、`backend/env/.env.prod` | 每次变更后备份 |
| Redis | 会话/缓存 | 无需备份(丢失仅踢下线) |
| Redis | 会话/缓存 | 无需备份(丢失仅踢下线;定时任务已落 PG,不在 Redis |
**PostgreSQL 每日备份**(宿主机 crontab 示例):