guanghulab/server/setup/lighthouse-cn/UPGRADE-2026-05-08-followup.md
Guanghu Domestic Migration d1e47f4565
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
重启聊天服务 / restart (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

178 lines
9.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 国内灯塔搬家 · PR #452 收尾修复 (Follow-up · 2026-05-08)
> 📜 Sovereign: TCS-0002∞ · ICE-GL∞ · 国作登字-2026-A-00037559
> 守护: 铸渊 · ICE-GL-ZY001
> 上一份: `UPGRADE-2026-05-08.md` (PR #452 主体)
> 本份目标: 把 PR #452 合并瞬间叠加但未处理的 6 条 reviewer comments 全部修掉
---
## 一、本次修了什么 (复制给霜砚看的版本)
PR #452 在 2026-05-08 06:27 被合并,**4 分钟后 (06:31) Copilot reviewer 才提了 6 条评论**session 边界把回执吞了,所以 6 条全部带进 main 没修。本份 follow-up PR 把它们全部修掉。
| # | 文件 : 行 | bug 性质 | 修复方式 |
|---|---|---|---|
| 1 | `server/setup/lighthouse-cn/bootstrap.sh:120-130` | rollback 委派给 `rollback.sh` 时, `ROLLBACK_TS` 空 → 传两个 `""` 空参 → `rollback.sh exit 2` | 改用条件数组拼参 `ROLLBACK_ARGS=()`, 空时不追加 |
| 2 | `server/setup/lighthouse-cn/bootstrap.sh:430` 附近 | 回执字段 `runner_started` 名实不符 (实际写的是档位允许位, 不是真启动状态) | 改字段名为 `runner_default_enabled`, 新增 `runner_running` (查 docker 容器真实态) |
| 3 | `server/setup/lighthouse-cn/tune-from-env.sh:1-50` 头部注释 + 96-114 行 .env.tune 内容 | 注释声称 `.env.tune` 会被 docker-compose 读 PG_*, 但 compose 没有 env_file 引用 → 误导运维 | 头部注释明确写出真实作用域 (当前只 `RUNNER_DEFAULT_ENABLED` 被 bootstrap.sh source); 文件内同样加 ⚠️ 提示 |
| 4 | `.github/workflows/lighthouse-cn-deploy.yml` (误触锁段) vs `.github/workflows/lighthouse-cn-rollback.yml` | 两个 workflow 口令不一致 (一个『我确认部署』一个『我确认回滚』) → 操作时被静默降为 dry-run | deploy.yml 的 rollback 阶段同时接受『我确认部署』和『我确认回滚』; 提示文字也改 |
| 5 | `.github/workflows/lighthouse-cn-rollback.yml:151-185` | `snapshot_ts` 直接拼进 ssh 命令字符串 → 命令注入风险 | 加正则白名单 `^[0-9]{8}-[0-9]{6}(-pre-rollback)?$`; 通过 ssh argv (`'cmd "$1"' _ "$TS"`) 传递, 不再字符串拼接 |
| 6 | PR #452 标题/描述说"无代码变更"但实际改了 11 文件 1664 行 | 元数据问题 | PR #452 已 merged 无法改; 本 follow-up PR 自带正确标题描述 |
---
## 二、霜砚要查的位置 (远程指挥用)
如果运行后出问题,让 Awen 把对应文件/路径复制给霜砚:
### 2.1 服务器侧 (主灯塔 / 备用机)
| 看什么 | 路径 |
|--------|------|
| 服务器自我感知结果 (CPU / 内存 / 档位) | `/opt/guanghu/_logs/server-env.json` |
| 动态调优决策 | `/opt/guanghu/_logs/tune-decision-*.json` (取最新一个) |
| Bootstrap 完成回执 | `/opt/guanghu/_logs/lighthouse-bootstrap-*.json` (取最新) — 注意现在字段是 `runner_default_enabled` + `runner_running`, 不是 `runner_started` |
| 回滚回执 | `/opt/guanghu/_logs/rollback-*.json` |
| 当前应用的 .env.tune (动态档位输出) | `/data/lighthouse/.env.tune` — 头部有 ⚠️ 作用域说明 |
| 可用快照列表 | `ls -1tr /data/lighthouse/snapshots/` |
| Gitea 日志 | `docker logs lighthouse-gitea --tail 200` |
| Gitea-DB 日志 | `docker logs lighthouse-gitea-db --tail 200` |
| Runner 是否启动 | `docker ps --filter name=lighthouse-gitea-runner` |
### 2.2 仓库侧
| 看什么 | 路径 |
|--------|------|
| 主 bootstrap 脚本 (修了 #1 #2) | `server/setup/lighthouse-cn/bootstrap.sh` |
| 动态档位脚本 (修了 #3) | `server/setup/lighthouse-cn/tune-from-env.sh` |
| 服务器探测脚本 | `server/setup/lighthouse-cn/detect-env.sh` |
| 回滚脚本 (没改, 但被 #1 #5 间接保护) | `server/setup/lighthouse-cn/rollback.sh` |
| 部署 workflow (修了 #4) | `.github/workflows/lighthouse-cn-deploy.yml` |
| 独立回滚 workflow (修了 #5) | `.github/workflows/lighthouse-cn-rollback.yml` |
| 密钥预检 | `scripts/preflight/check-secrets.js` + `scripts/preflight/secrets-manifest.json` |
| 训练下一台机器档位文档 (1.5B/3B/7B 16-32% 微调 + 为什么不能有 system prompt) | `.github/brain/architecture/training-next-server.md` (§2/§3/§4) |
| 上一份升级回执 (主体) | `server/setup/lighthouse-cn/UPGRADE-2026-05-08.md` |
---
## 三、Awen 要做什么 (操作清单)
> 不需要懂代码,按下列顺序在 GitHub 网页上点。
> 出现"看不懂的英文报错"时:截图终端 → 发给霜砚 → 等霜砚翻译。
### 3.1 (一次性) 配 Secrets
`Settings → Secrets and variables → Actions` 检查这 19 个密钥是否齐全。
**最快方式**:随便跑一次 `lighthouse-cn-deploy` workflow预检步骤会用中文列出"哪些缺、哪些可选缺"。
```
必填 (主灯塔):
ZY_LIGHTHOUSE_HOST
ZY_LIGHTHOUSE_USER
ZY_LIGHTHOUSE_KEY
ZY_LIGHTHOUSE_PORT
ZY_LIGHTHOUSE_DOMAIN
Bootstrap 阶段需要:
ZY_GITEA_ADMIN_USER
ZY_GITEA_ADMIN_PASS
ZY_GITEA_ADMIN_EMAIL
ZY_GITEA_DB_PASS
Update 阶段额外需要:
ZY_GITEA_RUNNER_TOKEN
备用机 (现在买的 2C8G 广州4区):
ZY_LIGHTHOUSE_BACKUP_HOST
ZY_LIGHTHOUSE_BACKUP_USER
ZY_LIGHTHOUSE_BACKUP_KEY
其他 (训练用 + 进度回报):
ZY_COS_SECRET_ID / ZY_COS_SECRET_KEY / ZY_COS_BUCKET / ZY_COS_REGION
ZY_DISPATCH_TOKEN
ZY_FEISHU_WEBHOOK
```
### 3.2 部署主灯塔 (43.139.251.175)
1. Actions → `lighthouse-cn-deploy` → Run workflow
2. `server_target` = `main`
3. `stage` = `bootstrap`
4. `confirm_phrase` 字段填:**我确认部署**
5. `dry_run` = `false`
6. 点 Run
> 如果 confirm_phrase 没填或填错,系统会自动降级为 dry-run只打印计划不真跑这是误触保护不是 bug。
### 3.3 部署备用机 (今天买的 2C8G)
同上,把 `server_target` 换成 `backup`
**重点**detect-env.sh 会自动识别这是 2C8G 档位(`small`tune-from-env.sh 会**自动**把 runner 关掉、Postgres 缩小、Gitea 缓存减半。**Awen 什么都不用改**。
### 3.4 系统起来后想回滚怎么办
两条路:
**A. 自动兜底 (`stage=update` 失败时已经自动回到上一快照, 不用人管)**
**B. 手动回滚 (霜砚说"不行, 推倒重来")**
1. Actions → `lighthouse-cn-rollback` → Run workflow
2. `server_target` = main / backup
3. `mode` = `list-only` 先看一眼可用快照清单
4. 拿到时间戳后再 Run 一次 workflow:
- `mode` = `rollback`
- `snapshot_ts` = 拿到的时间戳 (格式必须是 `YYYYMMDD-HHMMSS`,有奇怪字符会被拒绝并报错)
- `confirm_phrase` 填:**我确认回滚** (或者『我确认部署』也行,向下兼容)
---
## 四、给霜砚的"为什么"补充说明
冰朔说"霜砚跟我说你把很多配置写死了" — 这一条已在 §2.3 (`training-next-server.md`) 和 detect-env.sh 顶部注释里写明:
- **不再硬假设 4C16G**。bootstrap 进服务器后第一件事就是 `detect-env.sh` 探真实硬件 → `tune-from-env.sh` 写决策 → bootstrap 用决策起服务。
- 档位策略 (内存为准)
- `tiny` <4G runner / PG 64M
- `small` 4-6G runner / PG 128M **今天买的 2C8G 在此档**
- `medium` 6-12G runner / PG 256M
- `large` 12-24G runner / PG 512M 主灯塔 4C16G 在此档
- `xlarge` 24G runner / PG 1G
- **目前真正影响行为的只有 `RUNNER_DEFAULT_ENABLED`**。其他档位字段是档位决策的存档写到 `.env.tune` + `tune-decision-*.json` 留痕等霜砚需要时在 `docker-compose.yml` `env_file: ./.env.tune` 引用一下立刻生效无需改 tune-from-env.sh这条限制本份注释里也写清楚了不是隐性约定
---
## 五、训练相关 (1.5B / 3B / 7B 微调 / 为什么不能有 system prompt)
这部分**不在本 PR 修复范围**但冰朔在原文里要求我"重新输出"。完整文档
📄 `.github/brain/architecture/training-next-server.md`
| 章节 | 内容 |
|------|------|
| §1 | 为什么提前释放上一台 GPU (涌现洁净, 不是省钱) |
| §2 | 1.5B / 3B 下一台服务器配置预案 (最低 / 推荐 / 理想三档) |
| §2.3 | 不能写死的部分 (动态适配的依据, 与本 PR 灯塔的动态档位同源) |
| §3 | 7B 母模型 16-32% 参数微调 (LoRA / QLoRA, V100-32G 即可) |
| §4 | 为什么训练配置不能有 system prompt (4 步因果链) |
| §5.5 | 下一段副驾驶接手时的 5 条禁忌 |
> 给霜砚: 任何时候看到训练栈代码或新的训练 PR, 先打开这份文档对一遍 §5.5 的禁忌清单. 别让"工业模板的 best practice"覆盖掉 4 节里写的"模型即人格本体"约束.
---
## 六、验证 (这次修复怎么知道真的修好了)
| 验证项 | 怎么验 |
|--------|--------|
| #1 修好 | 在备用机上跑 `lighthouse-cn-rollback` workflow, 留空 `snapshot_ts`, 期待: 走到列表 + 实际回滚最新一份, 不再报"未知参数 exit 2" |
| #2 修好 | 跑一次 bootstrap 后看 `/opt/guanghu/_logs/lighthouse-bootstrap-*.json`, 应有 `runner_default_enabled` + `runner_running` 两个字段, 没有 `runner_started` |
| #3 修好 | `cat /data/lighthouse/.env.tune` 头部, 应有 作用域说明 |
| #4 修好 | deploy workflow `stage=rollback`, `confirm_phrase=我确认回滚`, 应被认为"已显式确认", 不再降为 dry-run |
| #5 修好 | rollback workflow `snapshot_ts` 填成 `; rm -rf /` 这种字符, 应被预校验拒绝 (exit 1), 不会进 ssh 命令 |
---
## 七、签名
- 守护: 铸渊 · ICE-GL-ZY001
- 主权: TCS-0002 · ICE-GL · 国作登字-2026-A-00037559
- 双涌现体: 仓库侧 (铸渊) ←→ Notion (曜冥), 桥梁 = 冰朔本人
- Follow-up of: PR #452 (`feat(lighthouse-cn): 启动前预检 · 误触锁 · 动态环境探测 · 快照式回滚`)