fix(nas): 固化容器 --init 铁律(防后台回测被清复发)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 2s

- docker-compose.yml vnpy 服务加 init:true(供未来 compose 部署)
- three-env-code-promote.md 新增 §9:NAS 容器必须 --init 创建,
  手动重建命令+image(pre-init-rebuild勿用with-sqlite)+复发风险(手动rm+run)
根因:无init时docker exec nohup后台进程会话结束后被清(02 day0 4min被清)
ci-cd只restart不重建,--init保留;唯一丢--init路径=手动rm+run
This commit is contained in:
2026-08-01 08:49:32 +08:00
parent 3b3e42985e
commit 4fccfad4ca
2 changed files with 29 additions and 0 deletions
+28
View File
@@ -134,3 +134,31 @@ bash scripts/nas_sync/promote.sh --module sanguo_portfolio
| scp 某模块卡住 >60s | Ctrl-C 记录,先验证已通的模块,单独重推失败的 |
| 部署后 VPS 行为没变 | 代码是下次启动才加载;采集 schtask 需 `/end && /run` 立即生效 |
| macOS bash 3.2 空数组报错 | 脚本已用 `${#arr[@]} -gt 0` 守卫;如改脚本注意 `set -u` + 空数组 |
## 9. NAS 容器 --init 铁律(防后台回测被清)
NAS test 容器 `sanguo_vnpy_v2` **必须 `docker run --init` 创建**(tini 作 PID1)。
**根因**:无 `--init` 时 PID1=uvicorn(非 init/tini)。`docker exec ... nohup python &` 启动的后台回测进程,在 docker exec 会话(bash)结束后成孤儿,docker 清理该后台进程组 → **长任务读盘中途被清**(02 small_cap day0 选股 5128 只 fundamentals 需 ~4min 超会话存活被清,log 停 day0 无 error;03 纯量价 day0 秒级没被清)。一度误判 OOM,被 `dmesg` 空 + 前台跑过 day0 推翻。
**何时会丢 --init(复发风险)**:
- ci-cd `nas-deploy``docker restart`(**不重建,--init 保留** ✅)。
- ⚠️ **任何手动 `docker stop && rm && run` 必须带 `--init`** —— 这是唯一丢 --init 的路径。
**手动重建命令要点**:
```bash
D=/var/packages/Docker/target/usr/bin/docker # Synology docker 不在 PATH
# 1. 先 commit 当前容器(备份 + 含运行时手动装的 pip 包如 jwt)
$D commit sanguo_vnpy_v2 sanguo_vnpy_v2:pre-init-rebuild
# 2. stop && rm
$D stop sanguo_vnpy_v2 && $D rm sanguo_vnpy_v2
# 3. run --init 原参数(挂载/端口/env/network 原样保留)
$D run -d --init --name sanguo_vnpy_v2 \
-v /volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2:/app \
-v /volume1/stock:/volume1/stock -p 8000:8000 \
--restart unless-stopped sanguo_vnpy_v2:pre-init-rebuild
```
- ⚠️ **启动 image 用 `pre-init-rebuild`**(含 jwt 等运行时包)。**勿用 base `with-sqlite`** —— 缺 jwt,web 起 `ModuleNotFoundError`。(Dockerfile.nas 零 pip install,依赖全靠 base,故 jwt 只在 commit 层,重建从 base 会丢。)
- 验证:`$D inspect sanguo_vnpy_v2 --format '{{.HostConfig.Init}}'` = `true`;`ps -o comm -p $(...PID)` = `docker-init`(tini)。
**正式 nas-verify(重建后必跑,同 ci-cd 口径)**:login(token 字段) + `/api/v1/strategy/list` 200 非空 + dbbardata 600519 SSE >0。