飞牛上的 DSH,
一个侧栏搞定重启。
在左侧栏加一个入口:刷新页面等于原来的 F5,重启 DSH Web走飞牛网关—— 停掉托管进程、按原参数拉起、等健康检查通过,再自动带你回到页面。
飞牛服务控制
fnOS两个动作,各归各位
刷新只是重新加载页面;重启才动进程——而且交给真正该负责的那个家伙。
刷新页面
等价于飞牛 App 的 F5 / Ctrl+R:location.reload(),进程不动、会话不断,适合改了前端或想重新拉取状态的时候。
重启 DSH Web
两步确认后请求飞牛网关重启:网关停掉托管的 dsh web、按原参数拉起、等端口健康检查通过,然后页面轮询到恢复自动刷新。
状态一眼看全
当前 PID、监听端口、origin、启动参数、网关 socket 可达性、网关记录的 PID、检测到的 supervisor——排查时不用再去翻 /proc。
兜底但不越权
没有飞牛网关时用 detached helper 自重启;检测到 systemd 单元或调试器就明确拒绝,并告诉你原因,而不是把进程搞丢。
为什么不自己重启自己
飞牛应用把 dsh web 托管在网关下面。进程没法替换自己——只能停下,再由别人在端口释放后拉起它。
面板二次确认,发送一个带控制头的 POST。
Host 半通过 unix socket 调用 /__fnos-gateway/control/web/restart。
网关停掉子进程,按原参数拉起,等端口健康检查通过。
轮询 /status 直到 running,自动刷新页面。
网关路径(推荐)
网关是 supervisor:它持有 PID 文件、启动令牌和健康检查握手。由它重启,这些状态全部保持一致。
helper 兜底
没有飞牛 socket 时,Host 半拉起一个 detached helper,等端口安静后用原始 argv 复现启动;systemd 下拒绝执行。
滑到底,才下载
插件包一个文件就够。向右滑满整条才算数——放手里随便一点不会误触发下载。
使用键盘也可:聚焦滑条后按 → 或 Enter。
下载得到的文件与仓库内构建产物一致,可先跑 node package/scripts/smoke.mjs 自检。
- 下载:滑满滑条,浏览器会通过作者的云盘直链取包。
- 解包:
tar -xzf dsh-fnos-control-0.1.0.tgz,得到package/目录。 - 安装:
dsh plugin --profile web add ./package,bundle 自动登记。 - 重启 DSH Web,刷新页面,左侧栏出现「服务控制」即完成。
直链由 GitHub Releases 提供,版本固定不会过期;也可以从源码目录自行构建。
三步装进全新 DSH
不需要构建、不需要依赖安装,解包即可用。
# 1. 解包 tar -xzf dsh-fnos-control-0.1.0.tgz # 2. 装进 profile(自动登记 bundle) dsh plugin --profile web add ./package # 3. 重启 DSH Web,然后刷新页面 # 左侧栏出现「服务控制」即可用 # 自检(可选) node ./package/scripts/smoke.mjs
- 自动登记:
dsh plugin add会把包名写进dsh.profile.bundles,不用手改配置。 - 零依赖:Host、Client、语言包、图标全在包里,纯 ESM。
- 双语言:中文「服务控制」/ English「Service Control」,跟随界面语言。
- 可退回:移除 bundle 即恢复原样,插件不写磁盘。
注:别在 profile 的 cordis.patch.yml 里再插同名行——一行一挂载,重复会启动失败。
能重启,但不能乱重启
重启是危险动作,所以每一层都设了闸门。
| 闸门 | 行为 |
|---|---|
| 两步确认 | 点「重启」后按钮变成「确认重启?」,5 秒内不确认自动退回。 |
POST + 专用头 | 重启路由只收 POST,必须带 x-dsh-control: 1,跨站表单和图片都发不出来。 |
| 仅回环 | 只应答 127.0.0.1 / ::1 的请求,远端的浏览器打不到这个口。 |
| systemd 检测 | 检测到 systemd 单元时禁止 helper 自重启(会被 cgroup 连带杀掉),如实返回原因。 |
| 调试器检测 | 进程带 --inspect 之类参数时不重启,避免把调试会话一起带走。 |
| 并发保护 | 一次只允许一个重启请求,重复请求返回 409。 |