diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md index 221e2a5..bc4a6f1 100644 --- a/docs/DEPLOY.md +++ b/docs/DEPLOY.md @@ -194,6 +194,38 @@ docker compose -f docker-compose.server.yml exec scheduler \ (类型变更类迁移在 MySQL 上锁大表写入,避开抓取窗口:北京 02:00 全量、 每 4h 增量;增量耗时约 15-30 分钟)。 +### 数据分析板块首部署附加步骤(一次性,2026-09-04) + +alembic 链自当前线上版本起新增 3 支迁移:`a7d3e9f1c2b4` msg_daily_stats +日汇总表、`f0a1b2c3d4e5` 分析板块四新表 + `message.fetched_at` 索引、 +`c3d4e5f6a7b8` 五表 `updated_at` 窄索引。 + +- **迁移随 `up -d --build` 自动跑**,平时无需手动。⚠️ 其中 + `ix_message_fetched_at` 要在 86 万行 message 表上建索引,约十几秒 + (InnoDB online DDL,量级同 c53f90b1e6a4)——**避开北京 02:00 全量抓取 + 窗口**执行升级:先停 scheduler 容器再 up,或白天低峰手动跑 + `sudo docker compose -f docker-compose.server.yml exec backend alembic upgrade head`。 +- 部署完成后在**夜间低峰**跑两条一次性回填,此后每 4h 的 analytics tick + 自动增量维护,不用再手动: + ```bash + sudo docker compose -f docker-compose.server.yml exec backend python -m app.sync.cli staff-daily-stats + sudo docker compose -f docker-compose.server.yml exec backend python -m app.sync.cli sensitive-scan --full + ``` + 前者全量重建 stat_daily_staff(分钟级);后者逐词扫全库并建扫描水位 + (高频词分钟级)。**首跑必须带 `--full`**:不建水位,增量扫描会拒绝扫库。 +- **顺序**:sensitive-scan --full 宜赶在调度器首次 4h analytics tick 之前; + tick 首次在进程启动 4h 后才触发,部署当天跑回填通常天然满足。万一 tick + 先到,也只是每 4h 记一条 ERROR 日志(analytics tick failed,无扫描水位), + 属预期提示非故障,补跑 --full 后即消失。 +- 升级收尾 `sudo docker compose -f docker-compose.server.yml restart frontend` + (让 nginx 重新解析 backend 容器 IP,防漂移后 502,同既有升级流程)。 +- 浏览器验收:登录后依次打开 `/analytics/dashboard`、`/analytics/churn`、 + `/analytics/unreplied`、`/analytics/sensitive` 四页;各页角标「数据截至」 + 在上述回填完成后才会显示。 +- 起步词库 6 词(私单/飞单/加私人微信/红包/转账/离职)由 sensitive-scan + 幂等自动补种,无需手插;后续加新词默认只扫增量,要扫历史消息需重跑 + `--full`。 + ## 8. 本地收尾(部署验证通过后) ```bash