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:
+10
-6
@@ -1,8 +1,9 @@
|
||||
# 数字化桃育种系统 生产上线与运营手册
|
||||
|
||||
> 版本:3.0.1 适用:生产(Docker Compose)部署
|
||||
> 版本:3.1.0 适用:生产(Docker Compose)部署
|
||||
> 前置阅读:`docker/README.md`(部署操作)、`doc/桃育种系统模块扩展需求规格.md`(功能规格,v2.7,2026-08-04)
|
||||
> 本文档基于 2026-08-04 安全加固后的代码与配置撰写,上线前请逐项核对。
|
||||
> 3.1.0(2026-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──> nginx(TLS/限流/反代)──8001──> backend ──> PostgreSQL 16
|
||||
└──> Redis
|
||||
浏览器 ──443──> nginx(TLS/限流/反代)──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 落 PG(3.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 示例):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user