在手机上安全访问 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 插件包,请以其文档为准
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 手机访问完整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
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
neohob/DSHGate
在手机上安全访问 dsh 完整 Web 界面
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。