中文EN

dsh-full-remote

remote装不上npmMIT

远程访问 DeepSeek Harness 且服务端 API 完整:转发时改写 Host/Origin,恢复其他方案必定 403 的 settings.* / credentials.* / host.listDirectory。令牌门、按设备会话、可选首访审批。

下载量 / Downloads
999
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-full-remote

沙箱测试结果

阶段结果
1 安装✗
2 列装—
3 挂载—
4 启动—
第一条错误
dsh: initialized profile web at /home/node/.dsh/profiles/web

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-full-remote

![Awesome dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)

![npm](https://www.npmjs.com/package/dsh-full-remote)

![CI](https://github.com/JUANWANG-BUAA/dsh-full-remote/actions)

![License: MIT](./LICENSE)

![GitHub Repo stars](https://github.com/JUANWANG-BUAA/dsh-full-remote/stargazers)

![GitHub last commit](https://github.com/JUANWANG-BUAA/dsh-full-remote/commits/main)

![Node](./package.json)

![DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)

![PRs Welcome](https://github.com/JUANWANG-BUAA/dsh-full-remote/pulls)

已收录进 awesome-dsh-plugin · DeepSeek Harness 插件

[English](./README.md) | 中文

dsh-full-remote 是 DeepSeek Harness 的一个插件:它在 Harness Web 服务前放置一层带鉴权的反向代理,使 Web 界面可以通过公网隧道或局域网设备访问,同时保持设置、凭据、目录浏览等特权接口可用。

60 秒快速开始

dsh plugin --profile web add dsh-full-remote
dsh --profile web

在 设置 → 反向代理 中点击「启动代理」,再点击「启动 Cloudflare

快速隧道」,用手机扫描面板生成的二维码。邀请链接只可使用一次,且不包含长期访问令牌。

如果使用受控网络,也可以把现有的 SSH、frp、ngrok、Tailscale 或 cloudflared

隧道指向面板显示的代理地址。

快速隧道是可选的临时通道,不等同于正式运维的公网部署;对外暴露前请先阅读[安全模型](#安全模型),组合其他插件时请查看[兼容性说明](./docs/compatibility.md)。

桌面控制面板 · 手机工作区

!桌面控制面板 · !手机工作区

手机端选项确认 · 远程桌面确认卡片

!手机确认浮层 · !远程桌面确认

问题

DeepSeek Harness 的 Web 服务只绑定回环地址,且仅当请求的 Host、Origin 头指向回环地址时才放行特权接口。经通用隧道访问时,这两个头携带的是公网域名,无法通过信任校验。页面可以加载,但以下接口返回 403:

  • settings.*
  • credentials.*
  • host.listDirectory

已有做法 · 结果

通用隧道(SSH 端口转发、Caddy、绑定 0.0.0.0) · 页面可加载;settings. / credentials. / host.listDirectory 返回 403

仅限局域网的插件,无鉴权 · 局域网内可用,不适合公网暴露

只有密码校验,不改写请求头 · 请求通过了鉴权,但特权接口仍然被拦截

解决方案

插件在隧道与 Harness Web 服务之间插入一层反向代理:

  • 转发前将 Host、Origin 改写为 127.0.0.1,使特权接口通过 Harness 的信任校验;
  • 任何请求都须先通过访问令牌或设备会话校验;
  • 转发 HTTP、SSE、WebSocket 流量;可压缩的 HTTP 响应可能再做 gzip(SSE / WebSocket 不压);
  • 提供设置页(设置 → 反向代理),用于启停代理、修改监听地址、轮换令牌、管理设备会话。

改写使 Harness 原本对远程客户端的信任校验失效,因此插件提供自己的访问控制层作为替代,见[安全模型](#安全模型)。

插件可以一键启动临时 Cloudflare 快速隧道;也支持把受控的 cloudflared、ngrok、frp、SSH、Tailscale 等现有隧道指向插件发布的本地地址。

工作原理

flowchart LR
    A[手机或远程浏览器] --> B[公网隧道<br>cloudflared / ngrok / frp / SSH]
    B --> C[dsh-full-remote<br>127.0.0.1:3081<br>鉴权 + 头部改写]
    C --> D[DeepSeek Harness Web<br>127.0.0.1:3080]

1. 远程浏览器连接公网隧道,流量转发到插件的监听地址(默认 127.0.0.1:3081)。

2. 请求只有携带访问令牌、有效的一次性邀请或已有的设备会话才会被接受;未通过鉴权的请求不会到达后端。

3. 代理将 Host/Origin 改写为回环地址,移除不可信头部,再转发到 127.0.0.1:3080 上的 Harness Web 服务。可压缩的 HTTP 响应(HTML/JS/CSS/JSON/SVG,≥1 KB)可能做 gzip;SSE 与 WebSocket 不压。带内容 hash 的 /assets/* 可能加上长期缓存头。详见 [HTTP gzip](./docs/http-gzip.zh.md)。

功能

特权接口

  • settings.describe / update / replace / mutate
  • credentials.describe / set / unset
  • host.listDirectory / pickDirectory / openPath
  • agentPreset.*、llm.discoverModels

访问控制

  • 192 位访问令牌,状态文件权限 0600,在本地面板查看与轮换
  • 按设备会话:每次登录生成独立的设备凭据,持久化时只保存其哈希;可在面板中重命名或撤销设备,并查看每台设备的来源 IP(登录时与最近活跃)
  • 可选首访审批:新设备停留在等待页,直至本机批准
  • 手机邀请:二维码或一次性链接(单次有效、15 分钟过期)。同 IP 60 秒内的浏览器自动重试会沿用同一台设备会话,避免隧道抖动丢响应时把手机卡进令牌页,也不会在设备列表里多出一条。链接中不含长期令牌
  • 登录失败计入固定延时,并按 IP 累计锁定
  • 可选 CIDR 白名单,限制远程 IP
  • 可选 trustForwardedFor:在可信本地隧道后使用真实客户端 IP 进行 CIDR / 限流 / 审计;只有另行开启 trustCloudflareConnectingIp 才会读取 Cloudflare 的 CF-Connecting-IP,否则取 X-Forwarded-For 最右值;回环或非法的转发值一律不信任

一键公网隧道(Cloudflare 快速隧道)

  • 面板内一键启动 cloudflared 快速隧道(免费、免账号),自动给出 https://…trycloudflare.com 地址,免公网 IP、免端口映射
  • 二进制三级获取:cloudflaredPath → PATH 探测 → 钉版本(2026.8.2)+ 内嵌 SHA256 校验的按需下载缓存;校验失败即丢弃
  • 隧道在线期间转发头信任动态生效(限流 / CIDR / 审计按真实客户端 IP),隧道关闭立即还原;隧道指向代理监听端口,令牌门 / 审批 / 审计全部照旧生效
  • 邀请自动使用隧道地址:开隧道 → 生成邀请 → 手机扫码直入(面板显示且可手动覆盖 Origin)
  • 与本地 TLS 互斥(Cloudflare 边缘已提供 HTTPS);快速隧道地址每次启动随机变化,定位是临时分享 / 救急

设备主页(可选落点)

  • 登录页第二个按钮「设备主页」进入 /_dsh_reverse_proxy/home:查看本设备信息(名称 / 登录 IP / 登录时间 / 会话到期 / 安全状态)
  • 给自己设备改名(主人审批列表里看到「小王的 iPhone」而非「Safari on iOS」)、自助登出(只吊销本设备会话)
  • 登录默认落点仍为 /,原有流程不变

运维

  • 栅栏自检:使用与代理相同的 Host/Origin 改写探测 settings.describe
  • 结构化 JSONL 审计日志(登录、审批、撤销、令牌轮换、启动、停止、WebSocket 打开/拒绝),并支持在面板内查看最近事件与导出 JSON;超过 8 MB 自动轮转,保留上一代
  • 监听地址可在运行时修改,绑定失败自动回滚
  • 可选本地 TLS(tlsCertFile / tlsKeyFile)
  • 健康检查接口 /_dsh_reverse_proxy/healthz
  • WebSocket 升级限流:同一远程 IP 反复升级失败后会进入锁定
  • 请求体大小在流层面受限;剥离逐跳与可伪造头部;清除上游 set-cookie
  • 对可压缩的 HTTP 响应做 gzip(JS/CSS/HTML/JSON/SVG),客户端需声明

Accept-Encoding: gzip;SSE、WebSocket、字体、登录栅栏页、不足 1 KB

的响应不压。实测 Harness 首屏(index.html + 带 hash 的 index/vendor

JS/CSS)−72.7%(1.29 MB → 351 KB);vendor-*.js −75.7%。过小 JSON

会变大所以跳过。issue #11 的「95%+」不是通用结果。关闭:

compressResponses: false。详见 [HTTP gzip](./docs/http-gzip.zh.md)

  • 带内容 hash 的 /assets/* 加上长期 Cache-Control(不含 index.html 与

/api)。关闭:cacheHashedAssets: false

移动端

  • 通过隧道域名打开设置页时,改动正常持久化;设置 → 模型 能加载提供方目录(Harness 0.1.0-rc.8 起依赖页面引导在官方 `cr

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:14,最后更新 2026-08-21

链接

GitHub · Homepage · npm

同类插件