Mandarin715/dsh-autostart1

dsh-autostart

Windows-only DSH plugin: one-click boot autostart and a restart that cannot leave DSH down. No console window ever.

包名
dsh-autostart
版本
0.2.0
许可证
MIT
最近更新
2026年9月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Mandarin715/dsh-autostart

使用

控件作用
服务状态实时探测端口,显示运行中/已停止
开机自启开关启用时会写 ~/.dsh/dsh-autostart/config.json、生成 bootstrap.vbs,并写入注册表 HKCU\...\RunDSH autostart
当前访问地址从捕获的启动输出里解析出的最新带 token 地址,可一键复制
重启服务二次确认后重启;DSH 会在数秒内恢复。它会先确保有看护进程在跑、由它把 DSH 拉回来;起步失败则当场拒绝这次重启
钩子脚本可选。服务起来后会执行它,用于拉起你自己的依赖进程

页面完全打不开? 这张卡片只在 DSH 运行时才存在 —— 见下面的「服务没起来时怎么救」。

配置

在 profile 的 cordis.patch.yml 里:

- id: dsh-autostart
  name: dsh-autostart
  config:
    hookScript: ''                 # 可选,服务起来后执行的脚本绝对路径
    dshPort: 3080
    exitDelayMs: 800               # 重启时旧宿主退出前的延时;上限 5000(见下方说明)
    waitForExitMs: 30000           # 自常驻看护进程取代旧重启路径后已无读者 —— 保留只是为了让
                                   # 已存在的 config.json 仍能加载
    startTimeoutMs: 30000
    openBrowserOnBoot: false       # true = 开机时自动打开浏览器
    blockWhenAgentsRunning: false  # true = 有 Agent 在跑时拒绝重启
    allowedHosts: []               # 经反代访问时填你的域名(必须显式填写),如 ['derp.example.com']

exitDelayMs 的有效上限是 5000 毫秒。 这个延时只为让重启响应先刷出去、旧宿主再退出;而新拉起的 看护进程等这个宿主退出只等 30 秒(DEFAULT_TAKEOVER_EXIT_MS)。延时超过那个窗口,接管就会放弃并收工, 重启也就变成了关机 —— 所以超过 5000 的值在使用处被截断到 5000,而不是拒绝加载 (index.jsMAX_EXIT_DELAY_MS)。

allowedHosts 必须由你显式填写(opt-in)。 默认是空数组,即不信任任何非回环的 Host。 如果你是通过反向代理访问 DSH(例如 frp + auth-proxy,它会把浏览器发来的原始 Host 转发过来), 那么请求里的 Host 是公网域名而不是 127.0.0.1,写操作按钮(启用/停用自启、重启服务)会被守卫 拒绝并返回 403。把你的域名填进 allowedHosts 后这些按钮才可用;同源校验 (Origin 必须与 Host 完全一致)对这些条目仍然生效——可接受的写法见下。

allowedHosts 可接受的写法:裸主机名,或 host:port,例如 ['derp.example.com']['derp.example.com:8443']不要带协议头或路径(https://derp.example.com/ 是错的)。 浏览器访问 https://derp.example.comHost 不带端口,因此对白名单里的权威跳过本地 dshPort 校验——填进白名单本身就是显式授权,而 Origin 与 Host 的同源校验依然必须成立。回环地址仍保持严格端口校验。

改配置后要不要重新启用自启?——要,但原因不是 dispose。 hookScript / dshPort / startTimeoutMs 这些字段是在**「启用自启」时快照进 config.json** 的,而看护进程读的是 config.json、不是插件的实时配置。所以改了它们**必须回设置页 重新点一次「启用自启」**才会生效(重复启用是幂等的)。真机实测过:改了 hookScript 却只重启服务, config.json 里仍是旧值,钩子不会执行。 而 allowedHosts 只影响插件的路由守卫,重载即生效,与自启无关。 waitForExitMs 同样会被快照,但已经没有任何代码读它(见上方配置示例里的说明)。

注册表项不会因为改配置而消失。 插件只在自己真的被卸载时(判据:本插件的 service.js 已不存在)才移除 DSH autostart;DSH 因重载或加载失败而拆解插件树时保留它。