把散落在代码里的真实部署值统一收进 config/,代码改为引用配置, 使仓库副本/开源导出不再带出生产域名、IP、内网路径与凭据。 新增 config/:platform.env.example(模板)· load.sh(shell 加载器)· index.cjs(node 加载器)· README.md(键一览与优先级)。 真实值放 config/platform.env —— 已 .gitignore 排除,不入库、不进导出。 TS 侧新增 src/platform-paths.ts 作部署路径的唯一解析处(零副作用): platformDir/stateDir/backupDir/artifactDir/installDir/scriptPath。 config.ts 接入这些字段;内置中继种子由生产 URL 改为空(改由 DSHS_OVERLAY_BOOTSTRAP_SEEDS 提供)。修掉 5 处硬编码绝对路径, src/** 注释中性化 116 行/53 文件。 scripts/** 36 个内部运维脚本:真令牌/PG 口令/隧道目标/主机号/路径 一律改从配置取;web/wake.html 的注册域白名单改为运行时从 location.hostname 推导;test/** 夹具 119 行/13 文件改 RFC 2606/5737 保留值,并把「内置种子必须为空」固化为回归断言。 取证:tsc 0 错;npm test 373/375(唯一失败 lease 属既有); 全仓扫描(大小写不敏感)代码面涉密标识 = 0;已部署 47 并零回归 (/opt/dsh/* 未搬家,/var/lib/dshs/platform 未被误建)。
config/ — 平台部署配置
本目录集中存放部署相关的值。源码里不再写任何真实部署值,一律从这里(或同名环境变量)读取。
文件
| 文件 | 是否入库 | 说明 |
|---|---|---|
platform.env.example |
✅ 入库 | 模板,只有占位符。复制成 platform.env 后填写 |
platform.env |
⛔ 不入库 | 本机真实值。已被 .gitignore 排除;也不会进入开源导出 |
load.sh |
✅ 入库 | shell 加载器,供 scripts/ 下的脚本 source |
怎么用
首次配置
cp config/platform.env.example config/platform.env
${EDITOR:-vi} config/platform.env
shell 脚本里引用
. "$(dirname "$0")/../config/load.sh"
echo "$DSH_PLATFORM_DIR/state" # → 平台状态目录
load.sh 找不到文件时不报错,脚本继续用系统 env 或自身默认值。
TypeScript 里引用
src/config.ts 负责解析,业务代码只读 ServerConfig 上的字段,不直接读 process.env:
const cfg = resolveConfig()
cfg.platformDir // <platform-dir>
cfg.stateDir // <platform-dir>/state
cfg.backupDir // <platform-dir>/backups
cfg.installDir // 代码安装根
优先级
系统环境变量 > config/platform.env > 代码内中性默认值
- systemd drop-in(
/etc/systemd/system/dshs.service.d/*.conf)与/etc/dshs.env属"系统环境变量",优先级最高; load.sh逐键判断,已由系统 env 提供的键不会被文件覆盖;- 代码内默认值一律是中性值(不含任何真实域名、地址、路径),只保证"不配也能起"。
⚠️ 注意:dshs 的 systemd drop-in 里同名键会压掉
/etc/dshs.env—— 两个地方都写同一个键时,以 drop-in 为准。
键一览
| 键 | 含义 | 中性默认(代码内) |
|---|---|---|
DSHS_DATA_ROOT |
数据根(每用户 home/ws、平台库) | ~/.dshs |
DSH_PLATFORM_DIR |
平台私有目录的父目录 | <dataRoot>/platform |
DSH_INSTALL_DIR |
代码安装根(lib/、scripts/) |
模块相对路径推导 |
DSHS_BASE_DOMAIN |
对外域名 | 空(子域功能关闭) |
DSHS_COOKIE_DOMAIN |
会话 cookie 域 | 空(host-only) |
DSHS_OVERLAY_BOOTSTRAP_SEEDS |
覆盖网络引导种子,逗号分隔 | 空(功能关闭) |
DSHS_CLUSTER_HOST_ID |
本机在 dsh_hosts.id 里的标识 |
空 |
DSHS_CLUSTER_AGENT_TOKEN |
Worker 注册凭据 | 空 |
DSHS_TUNNEL_TARGET |
反向隧道目标 | 空(隧道关闭) |
DSH_HOST_PUBLIC_IP / DSH_HOST_LAN_IP |
出网护栏要封的本机地址 | 空(只封回环) |
派生字段(不用单独配):stateDir = $DSH_PLATFORM_DIR/state、backupDir = $DSH_PLATFORM_DIR/backups、artifactDir = $DSH_PLATFORM_DIR/artifacts。