Files
jerryandClaude Fable 5 8467dec3a8 fix(bff): 断流崩溃根治——SSE 取消链模块明文化 + 团队文档归档
客户端中途断开流时 Cython 协程 __Pyx_Coroutine_SendEx 断言 abort 整个 BFF。
证据链:3.2.8 崩 db.c / 3.3.0 仍崩(升级无效) / db 明文后迁移 sse_relay.c,
证明取消链上任意 Cython 协程均可触发。最终把 db.py/qa.py/sse_relay.py
加入编译白名单(明文),隔离实例断流探针 10/10 存活,生产同构建实测通过。
代价:3 模块失去编译硬化(无凭据内容),编译模块 30->27。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-03 21:13:56 +08:00

106 lines
6.0 KiB
Markdown
Raw Permalink 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.
# P4 部署清单(TL 执行,逐步核对)
> 纪律:备份先行、只动服务器、不 push git、不碰 QA 树(8091)、生产 BFF 8090 只在最后一步重启。
## 0. 前置确认
- [ ] dev1/dev2/dev3/QA v1.1 全部交付且 TL 审核通过
- [ ] dev1 交付后:TL 统一删除 routers/docgen.py 顶部 _STUB 桩段并核对签名
- [ ] 意图 30 条双跑(后端 pytest + 前端 node)通过
## 1. 备份(不可跳过)
```bash
TS=$(date +%Y%m%d-%H%M); BK=/home/xzq/backups/docgen-$TS; mkdir -p $BK
tar czf $BK/deploy-sdk.tar.gz -C /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified sdk
cp /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified/sdk/data/plantai.db $BK/plantai.db
cp /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified/sdk/.env $BK/env.backup
```
## 2. 全量测试(服务器仓库,venv)
```bash
cd /home/xzq/5090/teamWorkspace/zh/PlantAI-rag-new
/home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python -m pytest \
vstore/tests/ sdk/app/services/test_docgen_*.py sdk/app/routers/test_docgen_api.py \
tooling/scripts/test_docgen_import.py tests/docgen/ -c tests/docgen/pytest.ini -q
```
## 3. BFF 编译 + 替换部署树
```bash
bash tooling/compile/compile_sdk.sh sdk /tmp/sdk-docgen-build /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-venv/bin/python
rsync -a --delete --exclude data --exclude .env --exclude mock /tmp/sdk-docgen-build/ /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified/sdk/
# 部署树 .env 追加(不覆盖已有):
# VSTORE_BASE_URL=http://127.0.0.1:8094
# DOCGEN_LLM_API_KEY / DOCGEN_LLM_BASE_URL / DOCGEN_LLM_MODEL(复制 QA 的 deepseek 值)
# DOCGEN_ROOT
```
## 4. vstore 部署 + 起服
```bash
mkdir -p /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified/vstore
rsync -a REPO/vstore/ /home/xzq/5090/teamWorkspace/zh/plantai-rag-new-deploy-unified/vstore/
# 部署树 vstore/.env:VSTORE_KEY(取自 /home/xzq/backups/docgen-vstore-key.txt)、
# VSTORE_ROOT 或 VSTORE_VAULT_PATH/VSTORE_INDEX_PATH(本地路径或 URL)、
# VSTORE_EMBED_URL=http://127.0.0.1:11434、VSTORE_EMBED_MODEL=bge-m3:567m
bash deploy/vstore_restart.sh
curl -s http://127.0.0.1:8094/api/vstore/health
```
## 5. BFF 重启 + 前端构建
```bash
bash deploy/bff_restart.sh
cd ui && npm run build # 生产 dist → 部署树 ui/dist(按现有 sync 规则)
```
## 6. 通知测试 agent 开始 R1(受控端口:vstore 8094 / BFF 8090 / UI 5180 或 dist)
## 7. 回滚(出问题时)
```bash
rsync -a --delete --exclude data --exclude .env $BK/deploy-sdk.tar.gz 解包覆盖 sdk/
cp $BK/plantai.db 回原位; bash deploy/bff_restart.sh
```
## 附:P4 部署实际记录(2026-09-03 15:05)
- 备份:/home/xzq/backups/docgen-20260903-1425(deploy-sdk.tar.gz + plantai.db + env.backup)
- 编译:30 模块 Cython 3.2.8 硬化成功(docgen 全链路 .so);rsync 替换部署树(保留 data/.env/mock)
- vstore:8094 已起服,local 后端;部署树 vstore/.env 曾因 key 值二次加前缀报 Fernet 格式错(已修,重写 .env 后 ingest 正常)
- vstore_restart.sh 已修 cd 目标(vstore 是包,须从部署根 -m vstore.api:app)
- BFF:8090 重启后 openapi 确认 8 个 docgen 端点;健康检查五上游 + db 正常
- 冒烟:vstore ingest 成功、vault 仅 .enc、明文 grep 无命中;BFF 透传入库/list 正常;完整 QA 流(不断流)7 progress + complete 正常
- vite:5180 已重启(v5.4.11,19s 就绪)
## 附:既有问题归档(非本次引入,A/B 证据)
**「客户端中途断流 → BFF 崩溃」**:`__Pyx_Coroutine_SendEx: Assertion f->f_back == NULL`(db.c)。
- 复现:curl --max-time 20 打 /api/qa/chat/stream 后超时断连 → BFF abort
- A/B:本次构建(db.c:13468)与 9月2日旧构建(db.c:13218,tooling/build/sdk-compiled 备份)**均崩溃**,断言一致 → 既有问题(Cython 3.2.8 协程取消缺陷,与 docgen 无关)
- 影响:用户点「停止」或网络断连可能触发 BFF 进程退出(bff_restart.sh 可快速恢复);前端「停止」按钮走 AbortController 的路径是否触发待 V1.5 专项验证与修复
- 决策:不纳入本轮 docgen 闭环;记录后另立专项
## 附:断流崩溃根治专项(用户指令 2026-09-03,doc_writer 闭环完成后立即开始)
**用户指令**:记录下来,当前任务完成后立即开始根治断流崩溃。
**已知事实(A/B 证据)**:旧构建(9月2日,db.c:13218)与新构建(db.c:13468)断流均崩,Cython 3.2.8 协程取消缺陷;当前无任何自动拉起(无 systemd/supervisor/cron 守护)。
**拟修路径(按序验证)**:
1. Cython 3.2.8 → 3.3.0 重编译 → 隔离实例断流探针 10 连发 A/B
2. 仍崩则取消敏感模块(db.py / sse_relay.py)降级明文 Python(compile_sdk.sh 白名单机制支持)
3. 配套加固(可选):BFF 自动守护(systemd Restart=always 或 cron 探测重启)
**验收**:隔离实例断流探针不崩 + 生产替换后「停止按钮/断网」实测 + 三模式问答回归。
## 附:断流崩溃根治完成记录(2026-09-03 19:30)
**修复方案(最终)**:编译白名单追加 3 个模块(app/db.py、app/routers/qa.py、app/services/sse_relay.py)——SSE 流取消链明文化,取消路径全程走 CPython 原生协程。
**证据链**:
- Cython 3.2.8 构建:崩溃 db.c:13468
- Cython 3.3.0 构建:崩溃 db.c:14416(升级无效,3.3.0 未修复此缺陷)
- db.py 明文:崩溃迁移 sse_relay.c:29531(同一断言)→ 证明取消链上任意 Cython 协程均可能触发
- db+qa+sse_relay 明文化:隔离实例断流探针 10/10 存活
- 生产同构建替换后:真实断流探针存活 + 完整 QA 流 7 progress + complete 正常 + 五上游健康
**代价与风险**:3 个模块失去 Cython 硬化(源码可读,无敏感凭据——凭据在 .env/环境);编译模块 30→27。白名单理由已写入 compile_sdk.sh 注释。
**备份**:/home/xzq/backups/docgen-crashfix-20260903-1922(可回滚)