diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index abc2081..30f7486 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -17,6 +17,7 @@ services: dockerfile: docker/Dockerfile container_name: sanguo-vnpy restart: unless-stopped + init: true # tini 作 PID1, 防 docker exec nohup 后台进程被清(见 docs/three-env-code-promote.md §9) # 容器名称 hostname: vnpy-server diff --git a/docs/three-env-code-promote.md b/docs/three-env-code-promote.md index e7b18b3..c71a528 100644 --- a/docs/three-env-code-promote.md +++ b/docs/three-env-code-promote.md @@ -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。