dsh-upgrade-linux:面向 Linux 的 DSH 版本检测与一键升级

前言

在 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 触发后,顺序为:

  1. 备份 profile 目录(排除 node_modules)并打成 .tgz
  2. 执行 npm install -g @deepseek-ai/dsh@<target>,继承环境、不重写 PATH
  3. 校验磁盘上的真实安装版本
  4. 重启经校验的 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 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye