chore(docs): 文档库并入代码仓(R4 选 a)+ 索引/台账跟进
1) dsh-server-docs/ 从工作区(原 E:\...\aliyun-dsh-server\dsh-server-docs)**整体并入本仓**,
保留目录名 ⇒ 仓库内 dsh-server-docs/... 的相对引用天然继续有效;旧目录(含其 .git)已归档到
工作区 _中间产物_待清理/,未随本提交带入。
2) .gitattributes:新增 `dsh-server-docs/** -text` —— 原文档库是 `* -text` + autocrlf=false,
必须保持纯 LF,否则会被本仓的 CRLF 规则翻掉。
3) 活引用里的绝对路径已全部改到新位置(docs 的 INDEX / README / scripts / skills + 用户级 skills
+ ~/.workbuddy/settings.json 的 hooks);历史档案(04-调整方案/、archive/)按「只增不改」未动。
⚠️ hooks 路径改动需「完全重启会话」才生效(配置是会话启动快照)。
4) 交接单/T08:新增 §16「生产整体切换执行记录」(形态 / 落地动作 / **4 个只有真上线才暴露的真 bug** /
验收证据 / 回滚命令 / 残留项);台账 T08 行 → 已完成并归档;03-路线图 §二 登记 T08 收尾项。
5) 统一称谓:**「本机」只指跑 WorkBuddy 的开发机**,47 / 106 一律写「远程服务器」。
This commit is contained in:
1 parent
c70d5d860e
commit
5ad755116e
173 files changed
+27632
No files matched your search
@@ -0,0 +1,51 @@
|
||||
# 47-运行环境管理页(admin 可视化共享运行时与工具)(2026-09-11 落地)
|
||||
|
||||
## 背景与动机
|
||||
|
||||
用户澄清并提要求:「宿主是指用户吧,用户安装全员共享没问题,但需要给 admin 做个管理页面知道都装了些什么(是否需要升级或卸载)」。
|
||||
|
||||
术语更正(重要):**「宿主」= 服务器本身(47.77.182.89),不是某个用户**。安装由平台以 root 执行;
|
||||
用户侧根本装不进 /usr(只读 + 无 sudo)。所以「共享」= 服务器装一次、全部用户共享,
|
||||
用户**无法**自行安装或修改。
|
||||
|
||||
## 实现
|
||||
|
||||
### 服务端:GET /api/admin/runtime(admin 只读,档案 47)
|
||||
- 位置:src/web/routes/admin.ts(不新增路由文件,复用已注册的 admin 插件)。
|
||||
- 数据全部用 shell 取(避免为此新增 import):版本 = 直接执行二进制;
|
||||
基线 = cat /opt/dsh/state/runtime-baseline.json;清单 = cat SHARED-TOOLS.md;
|
||||
体积 = du -sk;时间 = stat -c %y。
|
||||
- 返回:items(名称/分组/类型/版本/来源/安装脚本/可否卸载)、baseline、drift(与基线比对)、
|
||||
manifest、installScripts、baselineScript、note。
|
||||
|
||||
### 门户:新增 #/runtime「运行环境」页
|
||||
- 首页「管理」区新增卡片「📦 运行环境 · 共享运行时与工具」。
|
||||
- 页面内容:漂移告警条(红/绿)、条目表格(名称/版本/来源/安装脚本/可卸载)、
|
||||
目录+体积+最近变更、**折叠区**「升级 / 卸载 / 迁移怎么做?」与「安装清单原文」。
|
||||
|
||||
### 升级 / 卸载怎么说清
|
||||
- 升级:改脚本里的固定版本号 → 重跑对应安装脚本(幂等 + 官方 sha256 校验)→
|
||||
**必须再跑 runtime-baseline.cjs --accept 刷新基线**,否则页面一直提示漂移(与档案 44 的版本冻结配套)。
|
||||
- 卸载:删 /usr/local/bin/<名字> 软链即可;标注「平台必备」的项请勿删。
|
||||
- 迁移:整个 /usr/local/dsh-runtime/ 一个打包单元。
|
||||
|
||||
## 验证记录
|
||||
|
||||
| 检查 | 结果 |
|
||||
|---|---|
|
||||
| tsc 构建 | 通过(首轮因模板字符串把 RT 当字面量注入而失败,已修) |
|
||||
| 门户静态页 | curl 3080/portal.html 命中「运行环境」3 次、renderRuntime 2 次 |
|
||||
| API(临时 admin 会话,R4 模板,用完即删) | 见下方实测输出 |
|
||||
| 临时会话清理 | 已删(user_agent=poc-runtime-page) |
|
||||
|
||||
## 事故 / 踩坑记录
|
||||
|
||||
- ⚠️ **生成代码时模板字符串未转义**:补丁脚本用 JS 模板字符串生成 TS,其中的裸 RT 变量被原样写入
|
||||
TS → tsc 报 TS2304 Cannot find name RT。**教训:用脚本生成代码时,被生成代码里的标识符要显式写成字面量。**
|
||||
- ⚠️ **又在 ssh 单引号里跟引号搏斗**(sed 的 -e 与 URL 斜杠冲突、node -e 里的 \x27 不被解释)→
|
||||
连续失败两轮。**再次验证技能 SOP:涉及复杂引号一律「本地写文件 → scp → 远端执行」,不要 inline。**
|
||||
|
||||
## 回滚
|
||||
|
||||
cp web/portal.html.bak-<ts> web/portal.html && cp src/web/routes/admin.ts.bak-<ts> src/web/routes/admin.ts
|
||||
&& npm run build && systemctl restart dshs
|
||||
Reference in new issue
Block a user