前言¶
在 Linux 上长期跑 DSH(DeepSeek Harness)时,升级全局 @deepseek-ai/dsh、备份 profile、再重启 Web 进程,往往要自己对齐 npm 前缀、PATH 和服务管理方式。社区里参考插件 dsh-upgrade 在 macOS 上可用,但在 Linux 上容易出现全局安装权限错误,或因硬编码 launchctl 导致重启步骤直接失败。dsh-upgrade-linux 由 zelinwang 维护,归类为 admin-security,把路径、前缀、profile 与 systemd 单元改为运行时探测,在 Linux 上复刻版本检测、通道分流、备份、兼容性预检与一键升级等能力。
这是什么¶
dsh-upgrade-linux 是 DSH 的版本检测与一键升级插件,Linux 优先,不写死本机路径。实现上参考 dsh-upgrade@1.1.0 的能力集,但将原先「只在作者 Mac 上成立」的假设全部换成运行时探测。包声明 dsh.bundle.platforms: ["linux"],非 Linux 组合会被 DSH 跳过并说明原因,而不是在错误平台上崩溃。
维护者与源码见 GitHub 仓库 zelinwang/dsh-upgrade-linux;社区目录页为 SkillHub 插件页。许可证为 MIT,当前包版本为 0.1.0,要求 engines.dsh 为 >=0.2.0。
相对参考插件在 Linux 上的改动¶
下面用表格概括 README 中列出的两处硬伤及本插件做法。
| 问题 | 参考插件 | 本插件 |
|---|---|---|
| 升级安装 | spawn 时重写 PATH=/opt/homebrew/bin:/usr/local/bin:...,npm 可能装到系统前缀 /usr/local → EACCES |
继承原环境,前缀由 npm root -g 得出 |
| 服务重启 | 硬编码 launchctl kickstart(macOS)→ Linux 上 spawn ENOENT |
从 /proc/self/cgroup 反查 systemd 单元,并用 MainPID == process.pid 校验 |
| 升级记录 | 写死用户目录或 /opt/homebrew |
按 os.homedir() / os.tmpdir() 生成 |
运行时探测逻辑¶
插件不在代码里写死 npm、dsh 安装位置或重启目标,而是在当前进程环境中逐项解析。探测结果可通过 HTTP 接口自检。
| 项目 | 探测方式 |
|---|---|
| npm 可执行文件 | dirname(process.execPath)/npm,再扫描 PATH |
| npm 全局前缀 | <npm> root -g |
| dsh 包目录 | <全局前缀>/@deepseek-ai/dsh |
| 当前版本 | 读取上述目录中的 package.json |
| DSH_HOME | 环境变量 $DSH_HOME,否则 ~/.dsh |
| profile 名 | --profile → $DSH_PROFILE → profiles/ 下唯一目录 → 默认 web |
| 重启单元 | cgroup 中最深的 .service(排除 user@*.service),且 MainPID 须为当前 PID |
| 备份目录 | 配置项 backupDir,未设则为 os.tmpdir()/dsh-upgrade-linux-backups |
随时查看环境快照:
GET /api/dsh-upgrade-lx/env
通道与更新提醒¶
通道只看 npm dist-tag,不看版本号后缀(README 标明此前逻辑有误并已修正)。
| dist-tag | 通道 | 含义 |
|---|---|---|
latest |
稳定通道 | 默认 npm i -g 装到的版本 |
next |
预览通道 | 下一正式版候选 |
alpha |
尝鲜通道 | 最早内测版本 |
| 不在任何 tag 上 | 历史版本 | 已被覆盖的旧版本 |
版本号中的 -rc / -alpha 只描述版本性质,不改变通道归属。例如 0.2.1-rc.5 若由 latest 指向,则属于稳定通道的候选版。
| 所在通道 | 比较对象 | 提醒条件 |
|---|---|---|
| 稳定通道 | 仅 latest |
latest 比当前新且发布更晚 |
| 预览通道 | latest + next |
候选比当前新且发布更晚,取版本号最高者 |
| 尝鲜通道 | latest + next + alpha |
同上 |
其他通道有新版本时默认不弹提醒,但面板会列出(含通道标签与日期);安装一次即切换到对应通道。与参考插件相比:徽标只对稳定版亮起;latest 严格取自 dist-tag latest;未声明 engines 的已装插件在兼容性检查中记为 null(未知),而非一律判不兼容。
核心功能与 HTTP 接口¶
侧栏提供升级入口:有更新时显示绿色呼吸圆点与「有新版本」徽标;升级过程中展示「备份 → 安装 → 重启」三段进度与滚动日志(界面示意图见仓库 docs/)。
REST 接口如下(路径前缀均为 Web profile 下的插件路由):
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/dsh-upgrade-lx/env |
环境探测结果 |
| GET | /api/dsh-upgrade-lx/info |
当前版 / latest / next / alpha 及版本列表 |
| GET | /api/dsh-upgrade-lx/compatibility?target= |
已装插件 engines 校验 |
| GET | /api/dsh-upgrade-lx/status |
升级任务状态与日志 |
| GET | /api/dsh-upgrade-lx/ping |
存活性探测(重启后重连用) |
| POST | /api/dsh-upgrade-lx/upgrade |
body:{"target":"0.2.2-rc.1"} |
| POST | /api/dsh-upgrade-lx/restart |
重启服务 |
升级流程(插件内部)¶
经过面板或 API 触发后,顺序为:
- 备份 profile 目录(排除
node_modules)并打成.tgz - 执行
npm install -g @deepseek-ai/dsh@<target>,继承环境、不重写PATH - 校验磁盘上的真实安装版本
- 重启经校验的 systemd 单元;若非 systemd 托管,则退出进程并提示手动重启
安装与启用¶
平台要求:Linux,依赖 systemctl、/proc、npm root -g。推荐从 npm 生态经 DSH 插件命令安装:
dsh plugin --profile web add dsh-upgrade-linux
systemctl --user restart dsh-web.service # 或你自己的重启方式
本地目录联调(开发调试):
dsh plugin --profile web add /path/to/dsh-upgrade-linux
systemctl --user restart dsh-web.service
说明:dsh plugin add 对本地目录使用 link: 方式,改代码后需重启 DSH 才生效。安装完成后可在侧栏打开升级面板,或用上表的 GET/POST 接口做自动化。
指定目标版本升级示例(body 字段以 README 为准):
# 经 HTTP 客户端对当前 Web 服务发起 POST,路径为 /api/dsh-upgrade-lx/upgrade
# Content-Type: application/json
# {"target":"0.2.2-rc.1"}
适用场景与注意¶
适合谁:在 Linux(常见为 systemd 用户服务托管 dsh-web)上跑 DSH Web profile,希望用同一套 UI/API 做全局 dsh 升级、备份与重启,且不想手动拼 npm 前缀与单元名的管理员或日常维护者。
务必注意:
- 插件以当前 DSH 进程的用户与权限运行;全局
npm install -g需要该用户具备相应写权限与前缀配置,安装前请自行审阅 源码与 MIT 许可证。 - 默认备份目录在
os.tmpdir()下(如/tmp),重启机器会清空;需要保留备份时,在插件配置中设置backupDir。 - 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本件是社区贡献的 admin-security 类工具,GitHub 星标数以目录/仓库页显示为准(当前线索为 0)。
结尾¶
dsh-upgrade-linux 把 DSH 自升级能力收敛到 Linux 可复现的探测与 systemd 重启路径上,避免 macOS 专用假设在服务器上踩坑。需要安装入口与分类信息时打开 SkillHub 目录页;需要接口细节、通道规则与发布脚本说明时以 GitHub README 为准。