🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

远程网关 neohob/DSHGate

DeepSeek Harness
neohob79 天前有提交已提供中文文档扫描:无法判定

在手机上安全访问 dsh 完整 Web 界面

30.9/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/7 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/neohob/DSHGate.git
按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
数据截至 2026/10/31·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 79 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/10/31) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安装兼容性检查需源码安装

仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包DSHGate(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:23:14

安全扫描自动 · 静态分析源码
v2.7.0
⚪ 扫描:无法判定尚无人工评估
展开查看扫描说明与证据 ↓

已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。

  • · 包内无可扫 JS
  • · TS 源码(可能为非 JS 实现或未发布源码),无法判定
扫描于 2026/11/4(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 手机访问完整Web界面
  • 绕过本地回环限制
  • 无需修改源码

用 Tailscale Serve 绕过 DeepSeek Harness 的本地回环限制——手机上跑完整 dsh web UI(设置、插件配置、凭据),不用改 dsh 源码。Go 写的,只用标准库。

README

由 DeepSeek 最新模型翻译生成
DSHGate 通过 Tailscale Serve 绕过 DeepSeek Harness 的 loopback 限制——在手机或任意 Tailnet 设备上使用 dsh 的完整 Web 界面(设置、插件配置、凭据),不改动 dsh 源码的一字节。 DSHGate 是一个极简、零依赖的 Go 反向代理,位于 Tailscale Serve 与 dsh web 之间。它让 dsh 认为远程浏览器运行在同一台机器上——于是设置页、插件配置卡片、凭据视图、"打开配置文件"按钮在手机上全部可用,和本地体验一致。 - 语言: Go(仅标准库)· 构建: 单静态二进制 · 平台: macOS / Linux / Windows - English version → README.md 为什么需要它 dsh web 故意把设置/凭据平面钉死在 loopback,设有两道独立的闸(目前没有真实认证,loopback 就是替代品): 1. 服务端闸 —— 特权 API(settings.、credentials.、agentPreset.read、host.*、llm.discoverModels)拒绝非 loopback 的 Host 头。trustedHosts 只是防 DNS rebinding 的栅栏,不是认证。
展开完整文档(README 剩余 1 节)
DSHGate

通过 Tailscale Serve 绕过 DeepSeek Harness 的 loopback 限制——在手机或任意 Tailnet 设备上使用 dsh 的完整 Web 界面(设置、插件配置、凭据),不改动 dsh 源码的一字节。

DSHGate 是一个极简、零依赖的 Go 反向代理,位于 Tailscale Serve 与 dsh web 之间。它让 dsh 认为远程浏览器运行在同一台机器上——于是设置页、插件配置卡片、凭据视图、"打开配置文件"按钮在手机上全部可用,和本地体验一致。

- 语言: Go(仅标准库)· 构建: 单静态二进制 · 平台: macOS / Linux / Windows
- English version → README.md

为什么需要它

dsh web 故意把设置/凭据平面钉死在 loopback,设有两道独立的闸(目前没有真实认证,loopback 就是替代品):

1. 服务端闸 —— 特权 API(settings.、credentials.、agentPreset.read、host.*、llm.discoverModels)拒绝非 loopback 的 Host 头。trustedHosts 只是防 DNS rebinding 的栅栏,不是认证。
2. 客户端闸 —— 服务端下发的客户端计算
isLoopback: pageLocation === void 0 || isLoopbackHostname(location.hostname)

远程浏览器因此把设置作用域跑在进程内 "memory" 模式,写入被静默丢弃——写请求根本不会发出。

纯改头的代理(如裸 nginx / 单独 Tailscale Serve)只能解决闸 1。闸 2 在浏览器里运行,其 location.hostname 是任何网络中间件都无法改变的。不改 dsh 源码的前提下,唯一出路是在边缘改写服务端下发的客户端响应。

DSHGate 两件事都做。客户端改写之所以可行,是因为 dsh 的浏览器客户端是未压缩、按插件分包分发的:

/plugins/@deepseek-ai/<包名>/client.js?rev=<hash>

闸门位于 dsh-client-connection/client.js 里唯一一行、字节稳定的代码,可以用字面量精确替换。

工作原理

手机 / 任意 Tailnet 设备 │ https://<节点名>.<tailnet域名>.ts.net/ (Tailscale Serve,仅 Tailnet,无 Funnel) ▼ ┌──────────────────────┐ 改写 Host/Origin ┌──────────────────┐ │ Tailscale Serve │ ────────────────────► │ DSHGate │ │ :443 (HTTPS 证书) │ │ 127.0.0.1:3081 │ └──────────────────────┘ └────────┬─────────┘ │ Host: 127.0.0.1:3080 ▼ ┌──────────────────┐ │ dsh web │ │ 127.0.0.1:3080 │ └──────────────────┘

Director(请求改写)—— 破服务端闸:

- Host → 127.0.0.1:3080(dsh 栅栏认可的 loopback 权威)。
- Origin → 仅当等于配置的公共源时才改写为 loopback;其余 Origin 原样透传,dsh 的同源校验依然拒绝跨站调用(保留 CSRF 防御)。

ModifyResponse(响应改写)—— 破客户端闸:

- 只缓冲 /plugins/@deepseek-ai/ 下 javascript 内容类型的响应(各插件客户端包)。
- 把下面这一行字面量精确替换:
isLoopback: pageLocation === void 0 || isLoopbackHostname(pageLocation.hostname)

替换为: isLoopback: true

这里算出的唯一标志被注入为 connection.isLoopback,所有客户端包都消费它,所以一处替换覆盖整个应用。
- 处理 gzip 编码的响应体,改写后以 identity 编码返回,并设置 Cache-Control: no-store、去掉校验器,保证改写过后的 bundle 始终新鲜。
- 升级检测: 如果模式消失(dsh 更新改了代码),DSHGate 会响亮地打警告并原样透传——失败可见,绝不静默。

WebSocket —— 实时通道(/api/events.mux)由 net/http 的 ReverseProxy 处理,完成 101 升级和双向拷贝,Host/Origin 同样已改写。

构建与运行

预编译二进制在 Releases 页面:macOS universal(Intel + Apple Silicon,ad-hoc 签名)与 Windows(amd64 / arm64),附 SHA-256 校验和。

go build -o dsh-gate dsh-gate.go # 仅标准库,单文件无需 go.mod
./dsh-gate

环境变量(均可选):

| 变量 | 默认值 | 作用 |
| DSH_GATE_LISTEN | 127.0.0.1:3081 | 代理监听地址(保持 loopback,只让 Tailscale Serve 到达) |
| DSH_GATE_TARGET | http://127.0.0.1:3080 | 上游 dsh web |
| DSH_GATE_LOOPBACK_AUTHORITY | 127.0.0.1:3080 | dsh 视为 loopback 的 Host 头 |
| DSH_GATE_PUBLIC_ORIGIN | https://neomac.tail79640.ts.net | 唯一允许通过栅栏的浏览器源 |

macOS:以 launchd 常驻(重启后仍在)

见 examples/ai.deepseek.dsh-gate.plist——把 __PATH_TO_DSH_GATE_BINARY__ 换成二进制绝对路径,然后:

cp examples/ai.deepseek.dsh-gate.plist ~/Library/LaunchAgents/
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.deepseek.dsh-gate.plist
launchctl kickstart -k gui/$(id -u)/ai.deepseek.dsh-gate # 更新后重启

Tailscale 远程使用 —— "在手机上愉快地使用 DeepSeek Harness"

本仓库是这个流程的配套组件:先按下面的方式用 Tailscale Serve 暴露 dsh web,再把 Serve 指到 DSHGate(而不是 dsh 本身)。

原始配方(中文原文)

出处:X 上的 @BruceBlue(https://x.com/BruceBlue)

如何在手机上愉快地使用 DeepSeek Harness?

手机和电脑都下载 Tailscale,然后把段话交给 Codex:

「请帮我用 Tailscale Serve,把电脑上运行于 127.0.0.1: 端口的 Web 服务安全地提供给手机访问。只允许 Tailnet 内访问,不要开启 Funnel或暴露公网端口;配置 MagicDNS HTTPS 地址,并把当前 Tailscale 域名加入应用的 trustedHosts。请验证 HTTPS 证书、页面、API、WebSocket和历史工作区数据,确保服务从正确目录后台启动。不要使用 HTTP + 100.x IP 作为最终入口,因为部分应用会因浏览器缺少安全上下文而出现 crypto.randomUUID is not a function。完成后,请给我一个可直接在手机打开的 https://设备名.tailnet域名/ 地址。」

之后就能够实现手机使用 dhs 了 🐳

等价的分步配置

1. 安装 Tailscale:Mac(服务端)和手机(客户端),登录同一个 tailnet。
2. 启动 dsh web(如 dsh web --port 3080 或桌面版),再启动 DSHGate(127.0.0.1:3081)。
3. 用 Tailscale Serve 暴露——仅 Tailnet、无 Funnel、不暴露公网端口: tailscale serve --bg --https=443 http://127.0.0.1:3081 tailscale serve status # 显示:https://<节点名>.<tailnet域名>.ts.net (tailnet only)

4. 把节点名加入 trustedHosts(dsh web 的 profile patch:~/.dsh/profiles/web/cordis.patch.yml): trustedHosts:
- <节点名>.<tailnet域名>.ts.net

(DSHGate 会把 Host 改写为 loopback,所以这只是纵深防御,非网关路径必需。)
5. 验证(见下方清单),然后手机打开 https://<节点名>.<tailnet域名>.ts.net/。

不要开启 tailscale funnel,不要用 HTTP 100.x CGNAT IP 作为最终入口——部分应用在缺少安全上下文时会崩(如 crypto.randomUUID is not a function)。

端到端实测清单(远程浏览器、真实链路)

- 设置页真正发出 settings.mutate / settings.update(200)——DSHGate 之前,这个请求根本不会发出。
- 语言切换(zh → en → zh)持久化到 ~/.dsh/settings.yaml,describe revision 递增,刷新后界面语言真实切换。
- 插件配置标签页在远程渲染出卡片(终端 / Agent 循环 / 网页搜索)。
- "打开配置文件"按钮在远程浏览器出现。
- WebSocket 握手返回 101。

安全说明

- 边界 = Tailnet 成员资格。 DSHGate 只能通过 Tailscale Serve(无 Funnel)到达。没有用户认证——按设计,tailnet 上的每台设备都被当作本机客户端,可读写全部设置和凭据(如网页搜索 API key),并可触发宿主级操作。请只让可信设备加入 tailnet,切勿开启 Funnel。
- 保留 CSRF 防御。 只有配置的公共源的 Origin 会被改写,其余原样透传、被 dsh 的同源校验拒绝。
- 不改 dsh 源码。 DSHGate 在边缘改写响应;dsh 安装文件零改动。若 dsh 升级导致字节模式变化,DSHGate 打警告并降级为透传——绝不会静默坏。

仓库结构

dsh-gate.go # 全部中间件(仅标准库,约 160 行) go.mod README.md # 英文版 README.zh-CN.md # 本文件(中文版) examples/ ai.deepseek.dsh-gate.plist # macOS launchd 示例(KeepAlive)

许可证

MIT © neohob
预览分享卡片长什么样 ↓neohob/DSHGate
分享 · DeepSeek Harness Hub
neohob/DSHGate

在手机上安全访问 dsh 完整 Web 界面

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部