dsh-fnos-control: Adding fnOS Refresh and Restart to the DSH Web Sidebar

前言

在飞牛 NAS 上通过 fnOS 应用 fn-deepseek-harness 跑 DeepSeek Harness(DSH)时,桌面端还能靠 F5 / Ctrl+R 刷新页面,或通过网关 API 重启受监管的 dsh web 子进程;手机浏览器里没有同等入口,运维动作往往要切回桌面或记 Unix socket 上的控制路径。下面介绍社区插件 dsh-fnos-control,它在 DSH Web 侧栏增加「服务控制」面板,把「刷新页面」和「重启 DSH Web」做成可点的操作,并尽量走 fnOS 网关已有的监督重启逻辑。

这是什么

dsh-fnos-control 是面向 fnOS(飞牛 OS) 的 DSH 插件,仓库由维护者 QICci 发布在 GitHub(QICci/dsh-fnos-control),在 SkillHub 目录中归类为客户端。插件不替换 fnOS 自带能力,只是把应用里已有的两类操作接到 DSH Web UI:刷新当前页,以及请求网关停止再启动 dsh web 子进程并在健康检查通过后恢复页面。

项目站点:https://dsh.likkas.cn/。许可证为 MIT(见仓库 LICENSE)。

核心功能

侧栏会多一项 服务控制(英文界面为 Service Control),对应主面板提供两个按钮,含义与 fnOS 应用内行为一致:

操作 实际效果
Reload page(刷新页面) 执行 location.reload(),等同应用内的 F5 / Ctrl+R,不触碰后端进程。
Restart DSH Web(重启 DSH Web) 在存在 fnOS 网关时,调用其控制 API 停止并重启受监管的 dsh web 子进程,等待端口健康检查通过后刷新页面;无网关时仍渲染面板,并走独立的 detached-helper 回退路径(例如手工启动的 dsh web)。

fnOS 网关侧已暴露的控制路径(插件在可用时会包装这一路径):

GET  /app/fn-deepseek-harness/__fnos-gateway/control/web/status
POST /app/fn-deepseek-harness/__fnos-gateway/control/web/restart

插件 Host 侧还会挂载仅本机、且需请求头 x-dsh-control: 1 的路由:

  • GET /dsh-fnos-control/api/status:返回 PID、端口、网关可达性、检测到的 supervisor 等状态。
  • POST /dsh-fnos-control/api/restart:调度重启;在 systemd 或调试器下会拒绝并说明原因。

安全与交互上:重启需两步确认(5 秒内确认);重启路由仅接受 loopback 的 POST;恢复过程最长轮询约 90 秒,超时则提示手动刷新;插件本身不向磁盘写入数据。

环境与依赖

  • DeepSeek Harness >= 0.2.1-rc.2(README 注明在 0.2.1-rc.3 上验证)
  • Node.js >= 20
  • 完整「网关重启」路径需要 fnOS 应用 fn-deepseek-harness;没有网关时面板仍可用,重启走 helper 回退。

当前发布包版本为 0.1.0(见 package.json 与 release v0.1.0)。

安装与启用

官方 README 给出的安装方式如下,不要自行拼接 dsh plugin add github:... 一类未在文档中出现的命令。

从本地目录(开发或已解压的源码树):

dsh plugin --profile web add /path/to/dsh-fnos-control

通过插件管理器添加后会自动应用 bundle;也可在 DSH UI:Plugins → install bundle → 选择目录。

从 tarball:

Release 附件为 dsh-fnos-control-0.1.0.tgz(文档中 tarball 解压示例文件名为 dsh-fnos-control-0.1.0.tar.gz,以你实际下载的文件名为准)。安装前可用 node package/scripts/smoke.mjs 校验下载物;Release 页给出的 SHA-256 为 ebd31664752bba3139e12c02e5d31283ac7ce3d31cae87b71912958f20d7fb2a。

tar -xzf dsh-fnos-control-0.1.0.tar.gz
dsh plugin --profile web add ./package

写入 profile 的 bundle 列表:

dsh plugin add 会把 bundle 名追加到 profile 的 package.json 里 dsh.profile.bundles。若手工安装,需自行加入 dsh-fnos-control:

{ "dsh": { "profile": { "bundles": ["...", "dsh-fnos-control"] } } }

注意:不要同时在 profile 的 cordis.patch.yml 里重复插入同一 loader 条目,否则启动会因 duplicate loader entry id 失败。

典型用法

  1. 按上一节安装并确保 web profile 已加载客户端 bundle(dsh.client.platform 为 web,且 immediately: true)。
  2. 打开 DSH Web,在侧栏找到 服务控制,进入主面板。
  3. 日常排查 UI 状态时点 刷新页面;需要让 Host 进程在监督下完整重启时点 重启 DSH Web,并在 5 秒内确认。
  4. 安装后可用 README 中的命令自检 Host 是否挂载(将端口改为你实际的 DSH Web 端口,示例为 3080):
node --check index.js && node --check client.js
curl -s -H 'x-dsh-control: 1' http://127.0.0.1:3080/dsh-fnos-control/api/status

status 返回本进程 PID 与网关状态时,说明 Host 半部已挂载;侧栏入口在页面加载客户端 bundle 后出现。

适用场景与注意

适合谁: 在飞牛 NAS 的 fn-deepseek-harness 里长期使用 DSH Web、且经常在手机或窄屏浏览器上操作、又不想记网关控制 URL 的用户。

权限与安全: 插件以当前 DSH 进程权限运行;重启会作用于受监管的 dsh web 或回退 helper 路径。安装前建议阅读仓库源码与 MIT 许可证,确认行为符合你的运维策略。社区目录 SkillHub 插件页 与 GitHub 仓库由社区维护,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文仅介绍该 bundle 的能力与安装方式。

局限: 检测到 systemd 单元时 Host 侧不会通过 detached helper 重启(避免 cgroup 内进程一并退出);无 fn-deepseek-harness 时无法使用网关那条「正确」的监督握手路径,但仍可使用刷新与 helper 回退重启。

结尾

dsh-fnos-control 把飞牛 fnOS 场景下 DSH Web 缺的「刷新」与「监督下重启」收进侧栏,减少在手机端找快捷键或记 API 路径的成本。更多说明见 GitHub README 与 SkillHub 目录页。

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

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

Xiaoye