Skip to main content

dsh-full-remote

21Stars2Forks3Issues0Watchers

DeepSeek Harness plugin for remote access: a token-gated reverse proxy keeps settings, credentials, and file access working over public tunnels and on other devices instead of returning 403. Per-device sessions. 支持通过公网隧道或局域网,在手机等设备上远程使用 DeepSeek Harness,设置、凭据与文件访问等功能保持可用。

Evidence5/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki
Language
TypeScript
License
MIT
Branch
main
aiauthenticationcloudflareddeepseek-harnessdshdsh-pluginhome-serverllm

Install

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

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin JUANWANG-BUAA/dsh-full-remote for me: review the repository at https://github.com/JUANWANG-BUAA/dsh-full-remote first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

一句话定位

为 DeepSeek Harness Web 提供一层带访问令牌和设备会话校验的反向代理,让 Web 界面可以通过公网隧道、临时 cloudflared 隧道或局域网 IP 在其他设备上使用,同时保持设置、凭据、目录浏览等特权接口可用。

核心能力

  • 反向代理 + 头部改写:把请求的 Host 和 Origin 改写为 127.0.0.1,使经过隧道的请求也能通过 DSH 自身的回环信任校验
  • 访问令牌与一次性邀请:192 位访问令牌保存在权限 0600 的状态文件;面板可生成 15 分钟有效、单次使用的二维码邀请链接,邀请中不含长期令牌
  • 按设备会话管理:每台登录设备获得独立的会话凭据(cookie 里只有哈希),可在本地面板重命名、撤销、查看登录 IP 与最近活跃 IP
  • 一键 Cloudflare 临时隧道:面板内启动 trycloudflare.com 隧道,免账号、免公网 IP,cloudflared 二进制按需下载并 SHA256 校验
  • 可选安全开关:首访审批、CIDR 远程 IP 白名单、固定延时 + 按 IP 锁定登录失败次数、WebSocket 升级失败限流
  • 响应优化:对可压缩的 HTTP 响应(HTML/JS/CSS/JSON/SVG)做 gzip,对带内容 hash 的 /assets/* 加上 immutable 长期缓存
  • 移动端适配:手机端的工具审批、ask_user_question 选项、计划评审以底部抽屉形式呈现,不需切回宿主机
  • 健康检查与审计日志:提供 /_dsh_reverse_proxy/healthz,所有登录、审批、撤销、令牌轮换、启停、WebSocket 拒绝事件写入 JSONL 审计日志(超 8 MB 自动轮转)

技术实现

  • 语言: TypeScript(双端:Node host + Web client)
  • 关键依赖: @deepseek-ai/schemastery(配置 schema 与运行时校验)、uqr(二维码生成)、@deepseek-ai/cordis(宿主框架)、@deepseek-ai/dsh-client-runtime + @deepseek-ai/dsh-client-ui-slots(Web 端 React UI 插槽)
  • 架构模式: Cordis 双端插件。host 端通过 cordis.patch.yml 插入 reverse-proxy 行(id 冻结),并禁用 DSH 自带的自适应目录选择器(默认改用应用内浏览);client 端通过 settings.section slot 注册「反向代理」设置页(顺序 30,排在 General / Models / Plugins / Agent presets 之后),并注册 shell.overlay 提供远程确认浮层
  • 入口文件: src/index.ts:48-52(host,apply(ctx, config) 注册 /dsh-reverse-proxy/* 控制路由并通过 tapIndex 注入页面引导),src/client/index.ts:32-156(client)

适用场景

经常需要在另一台设备(手机、另一台电脑)上使用 DSH Web 但又不想只用回环地址的人:用 cloudflared 临时隧道在家里调试、用局域网 IP 让手机走同一 WiFi 直连、或者在外用 SSH/ngrok/frp 隧道远程处理工作会话。插件把 DSH 默认只在回环信任的特权接口开放给经过鉴权的远程客户端,避免被 403 拦截。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness>=0.1.0-rc.5 <0.2,已在 0.1.1-rc.1 验证必须使用 web profile(依赖 webServer 服务),不适用于 headless profile
Node.js`^22.19.0
平台macOS、Linux、Windows x64主机跨平台;cloudflared 二进制支持 darwin-x64/arm64、linux-x64/arm64、win32-x64;Windows ARM64 无官方 cloudflared,需自行安装并通过 cloudflaredPath 指定
原生模块无纯 Node.js http/https/child_process/zlib,无 node-gyp 编译依赖

安装方式

dsh plugin --profile web add github:JUANWANG-BUAA/dsh-full-remote

配置项

src/config.ts 定义的 Schemastery schema 完整配置;下表列出常用项,所有未列出字段保留默认值。

配置类型说明默认值
listenHost字符串代理监听地址;0.0.0.0 / :: 表示绑定全部网卡但不是可打开的地址127.0.0.1
listenPort数字(0-65535)代理监听端口;0 表示自动选择空闲端口3081
backendHost字符串DSH Web 后端地址,必须保持回环(127.0.0.1/localhost/::1),否则加载时拒绝127.0.0.1
backendPort数字DSH Web 后端端口;0 表示跟随 webServer.port0
approvalMode布尔新设备首次访问是否需在本地面板手动批准false
allowedCidrs字符串数组远程 IP 白名单(CIDR 或单 IP),空表示允许任何已认证 IP,回环始终放行[]
trustForwardedFor布尔是否在直连 peer 为回环时信任 X-Forwarded-For 最右值作为真实客户端 IP(CIDR / 限流 / 审计)false
trustCloudflareConnectingIp布尔是否同时信任 Cloudflare 的 CF-Connecting-IP,需先开启 trustForwardedForfalse
compressResponses布尔是否对可压缩的 HTTP 响应做 gzip(SSE/WebSocket/字体/<1KB 响应不压缩)true
cacheHashedAssets布尔是否对带内容 hash 的 /assets/* 加 immutable 长期缓存true
auditLog布尔是否记录登录、审批、撤销、令牌轮换等 JSONL 审计事件true
allowTokenRead布尔是否允许通过回环接口的 GET /token 读取访问令牌(轮换时仍返回新令牌)false
sessionIdleSeconds数字设备会话空闲超时秒数,0 表示关闭0
maxRequestBytes数字请求体上限,默认 160 MiB 与 DSH Web /api 桥一致160 MiB
requestTimeoutMs数字整个请求(头+体)超时,默认 5 分钟覆盖远程图片上传300000
upgradeMaxAttempts / upgradeLockoutSeconds数字WebSocket 升级失败次数阈值与锁定时长10 / 300
tlsCertFile / tlsKeyFile字符串本地 TLS 证书 / 私钥(PEM),为空表示纯 HTTP;与快速隧道互斥""
cloudflaredPath字符串cloudflared 二进制路径,为空时按 PATH → 下载缓存查找""
stateFile字符串持久化状态文件路径,为空使用 $DSH_HOME/reverse-proxy.json""

另外可通过环境变量 DSH_FULL_REMOTE_USE_NATIVE_PICKER=1 让插件保留 DSH 原生的自适应目录选择器(默认禁用,否则远程添加工作区会触发宿主机原生对话框)。

常见问题

Q: 这个插件解决的是什么问题?

A: DSH 默认只在回环地址放行设置、凭据、目录浏览等特权接口,公网隧道或局域网访问时这些接口会被 403 拦截。插件在隧道和 Web 服务之间插入鉴权代理,改写 Host/Origin 为 127.0.0.1 让特权接口继续可用,并提供自己的访问控制层。

Q: 必须用 Cloudflare 快速隧道吗?

A: 不是。快速隧道只是面板里的一键选项,适合临时共享或救急;日常建议把已有的 cloudflared 命名隧道、ngrok、frp、SSH、Tailscale 指向 127.0.0.1:3081,或者把监听地址改成局域网 IP 让手机走同一 WiFi。

Q: 快速隧道每次启动 URL 都变吗?

A: 是的。trycloudflare.com 临时隧道每次启动随机分配地址,旧的邀请链接和已登录的设备会话都会失效。要稳定地址请用 named tunnel 或自建隧道。

Q: 可以只在局域网使用,不暴露公网吗?

A: 可以。把监听地址从 127.0.0.1 改成局域网 IP(如 192.168.x.x),手机在同一 WiFi 内直接访问;面板里可复制的「隧道目标」就是该地址。

Q: 远程打开设置页保存设置报「settings are unavailable in this browser」怎么办?

A: 升级到 DSH 0.1.1-rc.1(CHANGELOG 0.3.6 已修复),客户端页面引导会钉住 isLoopback。DSH 0.1.0-rc.8 起的官方 ModuleLoader create() 替换了 load,插件已适配,但更早版本会触发该报错。

Q: 怎样卸载?

A: 从 cordis.patch.yml 中删除 dsh-full-remote 对应的两层(reverse-proxy 插入和 directory-picker 行),重启 dsh web;状态文件 $DSH_HOME/reverse-proxy.json 可保留也可手动删除。

Q: 多设备同时登录会被互相踢下线吗?

A: 不会。每台设备登录后获得独立的设备凭据和会话 cookie,状态文件里只保存哈希;最多 16 台设备同时在线(可调 maxSessions),超过会淘汰最久未活跃的一台。

Q: 头像/图片从手机粘贴会被 413 拒绝吗?

A: 不会。默认请求体上限 160 MiB,与 DSH Web /api 桥保持一致,远程粘贴 deepseek-v4-flash-vision-exp 图片走同一条已认证 /api 路径不会被代理拦截。

上手难度

进阶 — 安装后基本可用,但要真正用稳需要理解 listenHost / backendHost / trustForwardedFor / quick tunnel URL 漂移 等概念;推荐先从默认 loopback + cloudflared 临时隧道起步,再视需求切换到 named tunnel 或局域网 IP。

已知问题与限制

  • cordis.patch.yml 与其他 remote-access 插件(如 deepseek-harness-auth)的 directory-picker-browse 插入可能冲突;本插件运行时只在该 id 不存在时插入,但仍应在组合前检查最终 loader 树
  • backendHost 必须是回环地址(127.0.0.1 / localhost / ::1),通配符或非回环值会在加载时被 validateBackendHost 拒绝
  • allowTokenRead 默认关闭,启用后任何能发本地控制头的进程都能读取长期访问令牌
  • trustCloudflareConnectingIp 必须在 trustForwardedFor 已开启时才允许开启(src/config-validation.ts:37-39)
  • TLS 证书 / 私钥必须同时配置,单独配置会被拒绝(src/config-validation.ts:34-36)
  • 默认开启 cloudflared 临时隧道后,所有远程客户端对插件都呈现为 127.0.0.1,CIDR 白名单和按 IP 锁定实际作用于隧道整体;只有显式开启 trustForwardedFor 才能看到真实 IP
  • Cloudflare 临时隧道地址每次启动随机变化,旧邀请链接和登录会话全部失效;Cloudflare 自身对临时隧道有非 HTML 重内容限制;首次使用会按需下载 cloudflared(18-52 MB),Windows ARM64 无官方构建需用户自行安装并设置 cloudflaredPath
  • WebSocket / SSE 响应不做 gzip;登录 / 等待 / 设备主页等栅栏页也不压缩(每页约 1 KB 节省)
  • DSH 0.1.0-rc.8 起的 ModuleLoader create() 替换 load,需要插件在客户端引导中重新绑定 isLoopback(CHANGELOG 0.3.6 已修复并继续在 0.1.1-rc.1 验证)
  • 同一台机器本地启动的隧道使所有远程用户共享一个回环限流桶,必须开启 trustForwardedFor 才能区分
  • 控制操作(启动 / 停止 / 查令牌 / 改监听地址)只能从本机 Harness 窗口执行,隧道 URL 上无法调用
  • 多插件组合时建议跑 pnpm run test:composition 校验 row id 冲突,并参考 docs/compatibility.md 的运行时验收清单

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/JUANWANG-BUAA/dsh-full-remote)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory