# 81 · 目标架构与命名规范(重构总纲) - 日期:2026-09-13 - 状态:🚧 **执行中**(R0 已完成;R1–R4 分期见 §四) - 触发:用户「按照方案改进,要求改造后是一个新的更好的架构包括命名方式等细节」(承接档案 80 的 9 项优化) - 原则:**保留全部现有功能**;只做**收口、显式化、命名统一**;不做推倒重来 > **TL;DR**|① 定下**一套命名**:对外叫「**工作台**」、内部统一前缀 **`dshs`**(替换 `dshs`); > ② 定下**六层架构**:静态层 / 注入层 / 控制面 / 数据面 / 管理面 / 可观测; > ③ 分 **R0–R4** 五期落地,每期自带验收与回滚;④ 内部重命名走「**双名期 → 切换期**」,**绝不硬切**(hooks / 自动化 / 脚本里写死了绝对路径)。 --- ## 一、命名规范(新) ### 1.1 对外(用户可见)—— 统一为「工作台」 | 位置 | 现在 | 目标 | 状态 | |---|---|---|---| | 工作台首页 `/` | `工作台` | `工作台` | ✅ 已改 | | 登录 / 注册 | `登录` / `注册` | 同 | ✅ 已改 | | 管理门户 | `管理门户`(副标题曾含平台名) | `管理门户`,副标题「**平台管理**」 | ✅ 已改 | | 管理台 | `管理台` | 同 | ✅ 已改 | | 启动过渡页 | `正在启动工作区` | 同 | ✅ 已改 | | 英文短名(对外文档/品牌) | — | **DSH Workspace** | 待用 | > ⛔ 由 `scripts/verify-static.mjs` **守住**:任何 `web/**.{html,css,js}` 出现 `dshs` 即校验失败(已接入 `npm run verify`)。 ### 1.2 内部(工程标识)—— 统一前缀 `dshs` | 资产 | 现在 | 目标 | 迁移方式 | |---|---|---|---| | systemd 单元 | `dshs.service` | **`dshs.service`** | 双名期:单元做 **symlink + `Alias=`** | | 源码目录 | `/opt/dshs` | **`/opt/dshs`** | 双名期:`/opt/dshs` → symlink | | 数据目录 | `/var/lib/dshs` | **`/var/lib/dshs`** | 双名期:symlink(**先只加链接,不搬数据**) | | DB 文件 | `dshs.db` | **`dshs.db`** | 切换期:停服 → `mv` → 起服(原子+回滚) | | env 前缀 | `DSHS_*` | **`DSHS_*`** | **同时读两个名**(新名优先),旧名保留一版 | | npm 包名 | `dshs`、`@dsh-local/*` | **`dshs`**、**`@dshs/*`** | 切换期批量改(>10 文件,先出清单) | | 注入脚本 | `SESSION_*_JS` 内联在 `proxy.ts` | **`assets/inject/{recovery,assist}.js`** | R1(见 §四) | | 注入全局标记 | `__dshRecover` / `__dshAssist` | **`__dshsRecover` / `__dshsAssist`** | R1,**保留旧名别名一版** | | 注入 CSS 类 | `.__dsh-*`、`.wk-*` | **`.dshs-*`**(浮层与过渡页统一) | R1/R2 | | 管理面路由 | `portal.html` + `desktop/plugins/skills.html` 三个桩页 | **`/admin` 路由族**(桩页删除) | R2 | | 业务技能前缀 | `mcn-*` / `douyin-*` | **不动**(业务域命名,与平台无关) | — | **兼容策略(硬要求)**:内部改名一律两期 —— **双名期**(新名为主 + 旧名仍可用)→ **切换期**(删旧名)。 理由:`~/.workbuddy/settings.json` 的 hooks、`/etc/cron.d/*`、平台脚本、备份脚本、文档、自动化任务里**都写死了绝对路径**;今天已因路径失配被"全机写操作被拒"上了一课。 --- ## 二、目标架构(六层) ``` ① 静态/呈现层 web/*.html(9 → 6 页,删 3 个跳转桩)+ design.css(统一 .dshs-* 前缀) ② 注入层 assets/inject/{recovery,assist}.js —— 独立文件、构建期硬校验、运行时可读 ③ 控制面 supervisor(实例生命周期)· orchestrator(spawn/reap/配额/熔断)· proxy(子域/鉴权/注入) ④ 数据面 SQLite + /var/lib/dshs/{users,state,artifacts,business-plugins} ⑤ 管理面 /admin 路由族(原 portal.html 拆分)+ admin API(**权限仍全在平台域**) ⑥ 可观测 /opt/dshs/state/*.json + GET /api/dsh/status(汇聚:实例/内存/熔断/插件) ``` **相对现状的 4 处关键改动**(都来自今天的事故): | # | 改动 | 消灭的问题 | |---|---|---| | 1 | **注入脚本出模板字面量,落成独立文件** | 模板转义把整段脚本写崩(今天 2 次:`.join('\n')` → SyntaxError → 浮层/自愈/助手全废) | | 2 | **自愈链路收口成一份状态机**(探活 → 判据 → 恢复 → 冷却 → 告警) | 档案 50→51→72→77→78 **5 代补丁**叠加,改一处要读五处 | | 3 | **实例配额跟随插件集合**(按已启用插件的内存预估定 `MemoryMax`,V8 堆跟随) | 「启用某插件 = 必然被 OOM 杀」(今天:384MB 上限 < univer gateway 390MB) | | 4 | **有界恢复**(连续 N 次失败停在明确失败态 + 手动重试) | 「恢复→起来→又被杀」无限循环(今天 guest 每 ~35s 一次) | --- ## 三、目标 vs 现状(逐项对照) | 维度 | 现状 | 目标 | |---|---|---| | 用户可见命名 | 6 个页面挂内部平台名 | **全清**,统一「工作台」;CI 守住 | | 注入脚本 | 2 段内联 TS 模板字面量(~27KB) | 2 个独立 `.js` 文件 + `verify-inject` 强校验 | | 自愈 | proxy 注入脚本 + orchestrator 各自为政 | 一份状态机(前端只负责"探针 + 呈现") | | 配额 | 硬编码 384MB / V8 160MB | **按插件集合自适应** | | 恢复 | 无限重试 | **有界**(N 次后停) | | 校验 | 单测 + 临时补的 verify-inject | **`npm run verify`** 一条命令(build+单测+注入+静态页) | | 管理面 | 整页跳 `portal.html`(+3 桩页) | `/admin` 路由族 + 实例内**弹窗 iframe**(R5 评估后) | | 可观测 | stderr / 采样文件 / 新加的 breaker | 统一 `state/*.json` + 一个 status 接口 | | 内部标识 | `dshs` 遍布 | 统一 `dshs`(双名期过渡) | --- ## 四、分期落地(R0–R4) | 期 | 内容 | 重启 | 验收 | 回滚 | |---|---|---|---|---| | **R0** ✅ **本轮已完成** | ① 静态页去痕迹(7 文件,已上线)② `npm run verify` 统一校验 + `verify-static.mjs` 静态不变量(含"去痕迹"防回归) | 否 | 线上 `