docs(data): 语料库spec§18修订——用户两条反馈落地 [nas]——①断点续传钦点加固:unit粒度marker+原子写+杀进程重启即从未完成unit续跑+漏日自愈(公告T-1~T两天窗/新闻recent-100天然覆盖数日缺口)+daily幂等可重跑,验收加5b条(kill -9重启续跑实证);②解绑docker(用户:「不要和docker绑定,避免docker重启就失败」):采集进程改NAS宿主机直跑,运行时=/volume1/stock/corpus/venv(--copies自举,DSM自带Python3.8.12+pip实测可用x86_64,依赖锁cp38版),容器重启/升级/停用零影响;先例=现有DSM 03:00同步链(id=2,crontab实证7条任务在跑)宿主机直跑多年零docker,本设计沿同模式改admin跑避root属主坑;验收加docker全停下照跑实证;T1改venv自举 [nas]
CI/CD / test (push) Successful in 4s
CI/CD / nas-deploy (push) Successful in 10s
CI/CD / nas-verify (push) Successful in 9s

This commit is contained in:
2026-09-06 19:45:18 +08:00
parent 92e63ee27c
commit 14d3531f77
@@ -414,11 +414,14 @@ FETCHERS 注册表新增两键即自动可被未来 provider MCP server 暴露
1. **存储全部落 NAS、一律不上 VPS**——「vps承载有压力,之前基本面都放在了nas上,没有放vps,本次
也一样」。VPS 零参与:零 schtask、零存储、零采集进程;repo 里进脚本仅为随 NAS 部署管道分发
(promote --target nas → /app)VPS 侧永远不会被调度。
2. **采集发起位置=NAS 本机**(sanguo_vnpy_v2 容器内 docker exec)。关键差异:家宽出口 IP ≠ VPS
公网 IP(49.232.102.198),与 VPS 侧 ak-daily/ak-events 的东财限流**零冲突**——这正是采集放
NAS 的第二个理由(第一个是存储)。09-06 实测佐证:np-listapi/巨潮/东财文章页 ~35 发连续探测
自家宽 IP 全成功、零限流。
(promote --target nas → /volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2/**宿主机
直读该路径,不经容器**),VPS 侧永远不会被调度。
2. **采集进程=NAS 宿主机直跑,不绑定 docker**(用户钦点:「不要和docker绑定,避免docker重启就
失败」)。运行时=/volume1/stock/corpus/venv(`python3 -m venv --copies` 自举,DSM 自带
Python 3.8.12/pip 已实测可用,x86_64;依赖锁 cp38 兼容版 pandas/pyarrow/requests)——容器
重启/升级/停用零影响,venv `--copies` 连 DSM 换 Python 也不怕。家宽出口 IP ≠ VPS 公网 IP
(49.232.102.198),与 VPS 侧 ak-daily/ak-events 的东财限流**零冲突**。09-06 实测佐证:
np-listapi/巨潮/东财文章页 ~35 发连续探测自家宽 IP 全成功、零限流。
3. **时间带**:全部采集限于 **00:3017:30**,避开 18:0523:45 傍晚带(VPS 夜任务密集+家宽使用)。
唯一日窗=每日 06:00 起(见 18.3)。
4. 慢爬纪律:单进程单线程、per-domain 限速+抖动、直连不走代理(Session.trust_env=False,防
@@ -457,11 +460,21 @@ Schema(列名冻结,消费方=factor session 因子加工层,后续 provider fet
- **脚本**: `scripts/data_platform/corpus_download.py`(repo 内唯一新文件;单脚本红线同款——
corpus 栈一个入口,类型靠内部注册表,禁再开新脚本)。参数 `--lane daily|backfill`
`--until HH:MM`(墙钟自停)、`--limit N`(手动冒烟)。
- **调度**: DSM 任务计划 **sanguo-corpus-daily,每日 06:00 一条**:
`docker exec sanguo_vnpy_v2 python -X utf8 /app/scripts/data_platform/corpus_download.py
--lane daily && docker exec … --lane backfill --until 17:30`
(两 lane 串行同进程域=天然互斥;rc 聚合,任一 lane 失败 log 留痕)。回补 lane 每日从断点续跑,
17:30 前完成当前 unit 即 checkpoint 退出。
- **调度**: DSM 任务计划 **sanguo-corpus-daily,每日 06:00 一条,以 admin 身份跑**(先例=现有
03:00 同步链 DSM 任务(id=2),宿主机直跑多年零 docker;本设计沿同模式但改 admin 跑,避该链
root 属主文件坑):
`/volume1/stock/corpus/venv/bin/python -X utf8
/volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2/scripts/data_platform/corpus_download.py
--lane daily && 同解释器 --lane backfill --until 17:30`
(两 lane 串行=天然互斥;rc 聚合,任一 lane 失败 log 留痕)。**全程零 docker 依赖**。
**断点续传(用户钦点加固,所有 lane 的第一设计原则)**
- 粒度=unit(公告=(stock,year)/新闻=(stock,page)/全文/PDF=单 id),每 unit 一枚 marker(state/
下原子写 tmp+rename);进程被杀/断电/重启后,重启即从「未标 done 的最老 unit」续跑,**无任何
全局重启语义**;17:30 墙钟=完成当前 unit 即 checkpoint 退出,次日 06:00 自动接续。
- daily lane 幂等可重跑(短窗 id 去重,重复执行零副作用);漏日自愈=公告 T-1~T 两天窗,新闻
recent-100 页面天然覆盖数日缺口(冷门股 100 条跨数月)——某天整个任务没跑,次日一次执行即可
补齐,不依赖专门回补。
**daily lane(每日,总 ~4.5h,06:0010:30 前后)**:
1. 公告增量(巨潮,~5400 req @1/s≈1.5h):每股 seDate=T-1~T 两天窗+`announcement_id` 短窗去重
@@ -508,7 +521,10 @@ PDF 按可得性实下(404 标 missing 不重试);每源每股记录 first_date
3. **news 回补**: 600519 最早条目落 2023-09±1 月(实测硬顶对齐);depth_summary.json 全量产出。
4. **PDF**: 抽 20 份跨年份可打开(%PDF 魔数+size>0+meta 可反查路径);索引行数=文件数。
5. **边界**: /volume1/stock/corpus 之外零写入;VPS 零改动(git diff 触及面仅 scripts+tests+docs);
容量闸门演练一次(临时阈值)证明会停
容量闸门演练一次(临时阈值)证明会停;**docker 全停状态下手动触发 corpus-daily 照跑通**
(不绑容器的验收实证)。
5b. **断点续传**: 回补中途 `kill -9` 采集进程→重启后从未完成 unit 续跑,已完成 unit 零重拉
(marker 核对);某日整个任务停跑一天→次日单次执行把漏日补齐(T-1~T 窗+recent-100 覆盖)。
6. **测试**: tests/data_platform/ 新增 CI 测试(fetch 全 mock 零网络)——失败语义/短窗去重/
两天窗自愈/墙钟自停/unit marker,全套本地绿+CI 绿。
@@ -520,9 +536,10 @@ parquet);月度 compaction(数据量小,YAGNI)。
### 18.7 实施步骤概要(验收通过后,TDD)
T1 连通金丝雀(容器内 1 发/域+目录骨架)→ T2 corpus_download.py daily lane 四段+state 机制
+测试 → T3 DSM 任务注册+首周人工盯跑 → T4 backfill lane ①② → T5 ③④+容量闸门 → T6 验收
清单执行+活文档本节补「实施终态」小节。每步一个 commit,标签 **[nas]**(VPS 零触及)。
T1 宿主机 venv 自举(`--copies`,锁 cp38 兼容版本 pandas/pyarrow/requests,清华镜像)+连通金丝雀
(每域 1 发)+目录骨架 → T2 corpus_download.py daily lane 四段+断点续传 state 机制+测试 →
T3 DSM 任务注册(admin 身份,零 docker)+首周人工盯跑 → T4 backfill lane ①② → T5 ③④+容量闸门
→ T6 验收清单执行+活文档本节补「实施终态」小节。每步一个 commit,标签 **[nas]**(VPS 零触及)。
## 参考(调查来源)