# 接续包 · 涉密内容外置到配置目录(2026-09-19) > **本包是唯一细节来源**。接续会话开工第一步:`state.py` → 重算本文件 md5 → 与 automation prompt 里的值比对, > **不符即停并报告「口径已更新,需重新接续」**。 > ⚠️ **本棒已完成并入库**;下一棒默认动作 = **核实完成状态后报告结束**(⛔ 勿自行开工、⛔ 勿扩大范围)。 ## 1. 目标(已达成) **用户原话**:「很多涉密内容包含在代码中 开源时非常容易泄密,把所有涉密内容统一整理到配置文件夹对应文件中, 代码中引用对应配置信息」+「处理完毕后 提交仓库」+ 收口时追加「改造后记得**完整检查两遍**」。 | # | 需求 | 状态 | |---|---|---| | ① | 涉密内容统一收进配置文件夹 | ✅ 新建 `config/`,真实值入 `config/platform.env`(gitignore 排除) | | ② | 代码引用对应配置 | ✅ TS 走 `src/platform-paths.ts`;shell 走 `config/load.sh`;node 走 `config/index.cjs` | | ③ | 完整检查两遍 | ✅ 两遍均跑(语法 + 扫描 + 编译 + 测试),第 2 遍抓到第 1 遍的漏项 | | ④ | 提交仓库 | ✅ `452924d` 已提交并**双推**(原仓 + CNB,三方裸 sha 全等) | ## 2. 已完成(可核对的落点) | 项 | 值 | |---|---| | commit | **`452924d89c87cbd175b31d57e26395dfbccaa52f`**(100 文件,+585/−453) | | 双推 | `work.alotbuy.com:maogeigei/dsh_shenxian.git` + `cnb.cool/maogeigei/dsh-shenxian.git` ⇒ 三方裸 sha **全等** | | 新增(入库) | `config/{platform.env.example,load.sh,index.cjs,README.md}` · `src/platform-paths.ts` | | 不入库 | `config/platform.env`(`.gitignore:37` 排除;服务器侧 600) | | 档案 | `dsh-server-docs/04-调整方案/140-涉密内容外置到配置目录.md`(**未登记 INDEX.md**) | | 部署 | 47:`config/`→`/opt/dshs/config/`(服务器侧由自身 env 生成 `platform.env`,32 键/600)· `lib/`→`/opt/dshs/lib`(297 文件) | | 新增 drop-in | `/etc/systemd/system/dshs.service.d/platform-dirs.conf`:`DSH_PLATFORM_DIR=/opt/dsh` · `DSH_INSTALL_DIR=/opt/dshs` | | 回滚点 | `/opt/dsh/backups/pre-secrets-config-20260919-150752/lib`(294 文件) | | 零回归 | `tsc` 0 错;`npm test` **373/375**(唯一失败 `lease` 属**既有**);`/opt/dsh/{state,backups}` 未搬家、`/var/lib/dshs/platform` 未误建;端点 200 / API 401 / 单元 active / 0 错误 | ## 3. 在途 / 未完成 - **无代码在途**。工作区仅剩历史临时目录(`_tmp_seq24/`、`_tmp_seq40/`、`_中间产物_待清理/`,本轮未动; 本轮扫描器已移入 `_中间产物_待清理/_seq140_涉密外置/`,可删)。 - 全局执行锁:**已释放**。档案占号锁 `.lock-140`:**已释放**。 - **档案 140 未登记 `INDEX.md`**(本轮未做)。 ## 4. 🔴 关键决定(后续别推翻) 1. **真实值只放 `config/platform.env`,且只放本机 / 对应机器那一份**。服务器侧的 `platform.env` 由 `systemctl show dshs -p Environment` **生成** ⇒ ⛔ **drop-in 改动后必须重新生成**,否则脚本读旧值。 2. **优先级 = 系统 env > `config/platform.env` > 代码内中性默认值**。代码内默认一律中性 (`<数据根>/platform`、空域名),⛔ 别把生产值写回代码默认。 3. 🔴 **`platform-dirs.conf` 必须保留 `DSH_PLATFORM_DIR=/opt/dsh`** —— 删掉它,`platformDir` 退化成 `/platform` = `/var/lib/dshs/platform` ⇒ state/backups/artifacts **静默搬家**。 4. **`DEFAULT_OVERLAY_SEED` / `DEFAULT_OVERLAY_BOOTSTRAP_SEEDS` 刻意留空**,种子一律由 `DSHS_OVERLAY_BOOTSTRAP_SEEDS` 提供(线上已配 3 条)。测试断言已把「必须为空」固化为回归项 ⇒ ⛔ 别写回生产域名。 5. **`src/platform-paths.ts` 必须零副作用**(不 mkdir/不写文件)—— 它会被只读路径调用; `resolveConfig()` 会 mkdir 数据根并可能生成 `secret.key`,⛔ 不要在 paths 模块里调它。 6. **注释里的真标识无法「引用配置」** ⇒ 一律中性化(``/``/``)。 7. `web/wake.html` 的注册域白名单改为**运行时从 `location.hostname` 推导**(去最左一段)—— 换域名零改动。 ## 5. 下一步(⛔ 无必须开工项) 1. **开源导出层要补一条**:`config/platform.env` 是新的「单一秘密副本」⇒ 导出**必须排除它**; 若要随包发模板,**只能加 `platform.env.example`**(属技能 `dsh-opensource-release` 的 lane)。 2. **档案 140 登记 `INDEX.md`**(本轮未做)。 3. **可选**:`test/lease.test.mjs` 那 1 个既有失败(与本次无关)—— 修不修由你定。 4. **既有缺陷已发现未动**:`scripts/start-cluster-manager.sh` 第 11 行原缺 `#` 注释前缀(会被当命令执行)。 按「发现即报告、不顺手改」留给你。 5. **既有约定,本轮未改(已报告)**:仓库 `core.autocrlf=true` ⇒ `scripts/*.sh`、`config/load.sh` 在**索引里是 CRLF**(本机/服务器工作副本是 LF,故实际运行正常)。若将来改为 **Linux 端 `git clone` 部署**, `.sh` 会带 CRLF ⇒ source 失败 ⇒ 那时需给 `*.sh` 加 `-text`。**属仓库级改动(>10 文件),须先出清单再动。** 6. **在册旧账(与本次无关)**:D8 云安全组(唯一在册红)、档案 136 控制面并集(已立项未落地)。 7. 🔴 **`.workbuddy/memory/MEMORY.md` 已超注入上限(≈7,800 字符)**,本会话开机时系统已要求清理, **本轮未做**。⇒ 下一棒应做一次「只减不增」的合并去重(先把已过期/已被档案取代的条目删掉, 再考虑新增),⛔ 别在超限状态下继续追加。 ## 6. 复发验证(想自己复核时照跑) ```bash # 三方 sha cd /d/github/dsh_shenxian && git rev-parse HEAD git ls-remote origin -h refs/heads/master | cut -f1 git ls-remote https://cnb.cool/maogeigei/dsh-shenxian.git -h refs/heads/master | cut -f1 # 代码面涉密标识应为 0(务必大小写不敏感 —— 大写 AI1net 曾漏过) grep -rniE 'ai1net|alotbuy|47\.77\.182\.89|/opt/dshs|/var/lib/dshs|dshs-worker-' src/ test/ scripts/ web/ assets/ config/ | grep -v 'platform.env' # 派生路径零回归 ssh -p 22 root@47.77.182.89 'ls /opt/dsh/state /opt/dsh/backups; ls -d /var/lib/dshs/platform 2>/dev/null && echo "回归!" || echo "no-platform-dir ok"' ``` ⚠️ **⛔ 不要用 `git stash` 做「临时回基线」**(HISTORY 里 2026-09-19 实测事故): 本棒用它做基线比对时被 SIGTERM 打断 ⇒ **`.git/refs` 被删、仓库一度不可识别**, 所幸 pack 完好 + reflog 完整,按 reflog(三处收敛 `9c2e7975`)重建 refs + `git fetch origin` 取回对象 + `git reset` 重建 index 后**完整恢复**(`git fsck` 干净)。 ⇒ 要基线比对用 `git worktree add`;动手前先落 patch / tar 备份。