dsh-service-portal:用随机域名与口令把本机服务按需对外开放

前言

在 DSH(DeepSeek Harness)里跑本地 Web 服务、配置台或调试面板时,常见做法是手动配反向代理、自己找隧道工具,再单独做一层访问控制。步骤多、内外网策略也容易不一致。dsh-service-portal 是维护者 dingminhua 发布的 DSH 插件(分类:联网工具),把「门户进程 + cloudflared 隧道 + 口令登录 + 节点路由」收进插件设置页:装好默认只开内网并显示二维码,公网暴露需显式开启。插件源自 ld-rl-poker 里的门户能力,与具体业务无关,任意本机 HTTP 服务都可按路径挂载。

这是什么

dsh-service-portal(对外服务门户) 是 DeepSeek Harness 插件,npm 包名 dsh-service-portal,当前版本 1.0.4,MIT 许可证。一句话:用 cloudflared 在需要时提供 随机 *.trycloudflare.com 域名,用 一道口令(无账号体系)守住公网入口;内网侧默认可免密扫码进入,节点增删与开放/屏蔽在 DSH 插件配置里完成,无需改配置文件或重启门户。

目录与源码:

  • SkillHub 目录页:https://www.skillhub.cn/plugins/dingminhua/dsh-service-portal
  • GitHub:https://github.com/dingminhua/dsh-service-portal

核心功能

装好即用与启停记忆

插件加载后门户会自动启动,但 仅内网,不会自动把本机服务挂到公网。设置页可见内网地址与二维码。外网必须由你点击「开启公网访问」,且每次开启需勾选免责声明(服务端也会校验)。

autoStart 默认 true,会跟随你在设置页的「启动 / 停止门户」:停止后下次打开 DSH 不再自动起;再点启动则恢复。无论自动与否,公网始终是手动开。

设置页:内网与公网两条入口

界面形态对齐 dsh-pocket:局域网、公网两个区块,各有开关、二维码、地址、访问密码行与高级选项(手动选地址)。两个开关改完立即生效,无需重启门户(重启会更换隧道域名)。

  • 内网(示例形态 http://192.168.x.x:8899):默认同 WiFi 下免密;可启用「局域网访问密码」,或关闭整个局域网访问(关闭后内网请求直接 403 说明页,非公网登录页)。
  • 公网(https://<随机>.trycloudflare.com):必须口令。
  • 本机访问(loopback):永远免密,避免本机无法进入自己的门户。

节点管理

在 DSH:插件页 → 该插件 → 配置 中添加节点(名称、对外路径、本机端口、备注),可 开放 / 屏蔽(仅路由闸门,不停止上游进程)、编辑、删除。每个节点提供「内网访问」「公网访问」两个入口,按钮是否可点取决于对应开关(例如未开公网时公网按钮变灰并提示先开启公网)。

门户网页(只读)

扫码打开的是测试页与引导页:列出已发布节点,「访问」打开服务,「测试」就地探测并显示结果(如 HTTP 200、502 及区分「上游未起」与「上游在线但自身返回 502」)。页面 无设置功能,改配置请回到 DSH 插件配置。

安全与认证模型

按 Host 分类(fail-closed:认不出的 Host 一律当公网):

Host 分类 判定 门户页 / 服务
loopback localhost、127.x、::1 免密
lan RFC1918 私网、CGNAT、.local 等 默认可免密(可开局域网口令)
public 其余一切 必须口令

公网使用自定义口令登录页(非浏览器原生基本认证框)。口令可每次随机(passwordMode: random)或固定(fixed,至少 12 字符)。登录限速:单 IP 连续失败 5 次锁 60 秒,另有全局阈值。健康检查对上游端口做 TCP 探测,而非仅读标记位。

工作原理(路由概览)

门户进程默认监听 8899,按 Host 区分 loopback / lan / public,典型路由:

  • / → 门户只读页
  • /_auth/login → 外网口令登录
  • /_api/* → 门户 API(供 DSH 设置调用)
  • /<路由路径>/… → 转发到对应本机服务

安装与启用

兼容版本

package.json 声明:

  • engines.node: >=24
  • engines.dsh: >=0.2.1-rc.1 <0.3.0-0

装完后 需要重启 DSH(插件在宿主进程加载)。

方式一:npm(README 示例为 Windows Desktop)

$dsh = "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"
& $dsh plugin --profile desktop add dsh-service-portal

若旧 profile 仍装有已删除子插件 dsh-poker-viewer,README 建议先移除再装根插件:

& $dsh plugin --profile desktop remove dsh-poker-viewer
$dsh = "$env:LOCALAPPDATA\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd"
& $dsh plugin --profile desktop add "link:D:/DshProject/dsh-service-portal"

cloudflared 路径可留空由插件自动探测(如 ~/.dsh/dsh-pocket/bin、~/.dsh/bin、PATH 等)。

配置要点

以下字段在 DSH 设置页可改,均为即时生效(.volatile()),摘录 README 表格:

字段 默认 说明
repoPath 空 被开放的服务所在仓库根,须自行填写
portalPort 8899 门户端口
autoStart true 打开 DSH 时自动起门户(仅内网)
passwordMode random random / fixed
fixedPassword 空 fixed 时至少 12 字符
lanAuthEnabled false 内网是否要求口令
cloudflaredPath 空 可执行文件路径,空则自动探测
infraPath 本仓库根 含 tools/ 与 runs/ 的基础设施路径

口令模式与固定口令在门户 运行中不可改(需先关闭门户再改),避免界面与实际口令不一致。

典型用法

  1. 安装插件并重启 DSH,打开该插件配置页,填写 repoPath 等必要项。
  2. 确认门户已起:查看内网地址与二维码,手机同网段扫码进入只读门户页。
  3. 在配置中添加节点(对外路径、本机端口),用「测试」确认上游是否响应。
  4. 需要从外网访问时:在设置页勾选免责声明后点击「开启公网访问」,使用显示的随机域名与口令登录,再通过公网入口访问节点。
  5. 临时不想对外路由某服务时,将节点设为「屏蔽」,上游进程可继续运行。

适用场景与注意

适合:需要在 DSH 工作流里快速把本机 HTTP 服务暴露给局域网设备扫码使用,或偶尔通过 Cloudflare 快速隧道从公网带口令访问,且希望路由在图形界面管理、不必手写 nginx 或反复改配置的场景。

注意:

  • 插件以 当前 DSH 进程权限 运行;安装前请阅读 源码与许可证,自行评估暴露本机服务的风险。
  • 公网隧道依赖 cloudflared 与 trycloudflare 类随机域名,不适合作为长期生产级固定域名方案。
  • SkillHub 等为社区目录,与 DeepSeek / 幻方无官方从属关系;星标等数据以目录页为准(当前线索为 GitHub 1 star)。
  • 仅转发路由,不负责启动你的上游服务;502 时需按门户页提示区分未启动与上游自身错误。

结尾

dsh-service-portal 把「内网二维码 + 公网隧道 + 单口令 + 按路径转发」做成 DSH 里可开关、可记状态的插件能力,节点与双入口管理集中在设置页。进一步了解与安装说明见 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜