docs(deploy): VPS生产runbook+三机环境矩阵+NAS ops脚本+修rsync危险命令
vps-production-runbook(VPS运维一站式,已验证状态+拓扑+发布流水线+人类闸口+排障); env-version-matrix(三机Python/deps矩阵+Lock建议); scripts/ops(NAS bridge探针-容器无curl-+VPS→NAS备份脚本); nas-deploy-plan§3(修rsync --exclude语法,原会删万级staging parquet+破坏entrypoint启动).
This commit is contained in:
@@ -47,13 +47,29 @@ DOCKER="/var/packages/Docker/target/usr/bin/docker"
|
||||
SRC=~/.openclaw/sanguo_projects/sanguo_vnpy_v2/
|
||||
DEST=sanguo-nas:/volume1/homes/admin/.sanguo_projects/sanguo_vnpy_v2/
|
||||
|
||||
# 1) 同步代码(已排除数据/缓存/配置——配置含部署态密码,不覆盖)
|
||||
# 1) 同步代码(已排除数据/缓存/venv/entrypoint/配置——配置含部署态密码,不覆盖)
|
||||
# ⚠️ 每个 pattern 必须单独一个 --exclude=PATTERN(见下方警告框)
|
||||
rsync -avz --delete \
|
||||
--exclude='.git' '__pycache__' '*.pyc' '.pytest_cache' \
|
||||
--exclude='data/' 'logs/' 'temp/' '*.log' '.DS_Store' '.venv/' 'node_modules/' 'config/' \
|
||||
--exclude='.git' --exclude='__pycache__' --exclude='*.pyc' --exclude='.pytest_cache' \
|
||||
--exclude='data/' --exclude='data_cache/' --exclude='logs/' --exclude='temp/' \
|
||||
--exclude='*.log' --exclude='.DS_Store' \
|
||||
--exclude='.venv/' --exclude='venv/' --exclude='venv311/' \
|
||||
--exclude='node_modules/' --exclude='config/' \
|
||||
--exclude='entrypoint.sh' \
|
||||
-e ssh \
|
||||
"$SRC" "$DEST"
|
||||
```
|
||||
|
||||
> ⚠️ **rsync --exclude 写法警告(2026-07-14 dry-run 实测固化)**
|
||||
>
|
||||
> 旧写法 `--exclude='.git' '__pycache__' '*.pyc' ...`(一个 `--exclude` 后紧挨多个 bare pattern)**实测排除失效**——rsync 把 bare pattern 当**源路径**处理(报 `lstat: No such file or directory`),`--delete` 因此会误删 NAS 上:
|
||||
> - `data_cache/` 全量 staging parquet(**万级文件,dev/NAS 差约 1 万个**)
|
||||
> - `/app/entrypoint.sh`(容器 Entrypoint,删除后 `docker restart` 启动失败)
|
||||
> - 以及 `venv/` 等 dev-only 目录被误推上去
|
||||
>
|
||||
> **必须**用每 pattern 单独 `--exclude=PATTERN` 写法(如上命令)。每次改排除列表后建议先 `rsync -avzn ...`(dry-run)确认 `deleting` 列表无意外项再实跑。
|
||||
|
||||
```bash
|
||||
# 2) 重启容器
|
||||
ssh sanguo-nas "$DOCKER restart sanguo_vnpy_v2"
|
||||
|
||||
@@ -69,6 +85,24 @@ curl -s http://192.168.2.154:8000/api/v1/auth/login -X POST \
|
||||
| `ssh sanguo-nas "$DOCKER ps"` | `Up` |
|
||||
| `POST /api/v1/auth/login` | 返回 `{"token":...}` |
|
||||
|
||||
### 附:`entrypoint.sh` 根因说明(2026-07-14 dry-run + docker inspect 实证)
|
||||
|
||||
`docker inspect sanguo_vnpy_v2` 显示容器 `Entrypoint=[/app/entrypoint.sh]`、`Cmd=[]`,
|
||||
即容器启动**必须**找到 `/app/entrypoint.sh`。但 dev 仓库根目录已无此文件(已移到
|
||||
`docker/entrypoint.sh`)。若 rsync 带 `--delete` 且不排除,会删掉 NAS 上的
|
||||
`/app/entrypoint.sh` → 下次 `docker restart` 直接启动失败(entrypoint not found)。
|
||||
|
||||
- **短期保护(已落实)**:上方步骤 1 命令加了 `--exclude='entrypoint.sh'`,NAS 现有文件
|
||||
不会被删,容器可继续启动。代价:dev 侧对 entrypoint 的改动不会自动同步(需手动处理)。
|
||||
- **根治方案(待用户确认采用哪种)**:
|
||||
|
||||
| 方案 | 做法 | 适用 |
|
||||
|------|------|------|
|
||||
| ① 纳入 git 根目录版本化 | dev 根目录恢复 `entrypoint.sh`(与 `docker/entrypoint.sh` 统一为同一份),去掉 `--exclude='entrypoint.sh'`,rsync 正常同步 | entrypoint 需随代码迭代频繁改 |
|
||||
| ② 由镜像层提供 | 确认 `entrypoint.sh` 由 Dockerfile `COPY` 进镜像;则 bind-mount 不应覆盖它(调整挂载/文件位置) | entrypoint 极少改、希望与代码解耦 |
|
||||
|
||||
> ⚠️ 两种方案互斥。当前默认走"短期保护",**待用户确认**后再切到 ① 或 ②。
|
||||
|
||||
---
|
||||
|
||||
## 四、依赖变更(改 requirements-docker.txt)— 偶尔
|
||||
|
||||
Reference in New Issue
Block a user