From 4fccfad4cac5d40d3e1c89140ed179f78dcc24a5 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Sat, 1 Aug 2026 08:49:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(nas):=20=E5=9B=BA=E5=8C=96=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=20--init=20=E9=93=81=E5=BE=8B(=E9=98=B2=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E5=9B=9E=E6=B5=8B=E8=A2=AB=E6=B8=85=E5=A4=8D=E5=8F=91?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- docker/docker-compose.yml | 1 + docs/three-env-code-promote.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) 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。