packages/dsh-remote-web-ui
zhu1090093659/dsh-web手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
远程与移动端安全网关:零改动 DSH 底层代码开放 Tailscale/局域网访问,支持扫码配对、RSA 加密、防暴力破解与移动端样式片段;与其他远程插件共存时自动让出共享配对服务,避免启动崩溃。
DeepSeek Harness (DSH) 远程与移动端安全接入代理插件
无需修改 DSH 源码(运行时插件接管) · 局域网 / Tailscale 安全接入 · 扫码配对 · 移动端样式适配 · 工作区能力复用 · 实时状态推送
📱 桌面级移动工作台:手机上也能新建 / 切换工作区、执行终端命令 🛡️ 多重安全认证:扫码配对 · 长期密码 · 免密直连 + RSA 加密 + 防爆破封禁 🎨 移动端样式片段:内置三段预设,不满意可自定义 CSS
English Documentation · 简体中文
这是什么 • 核心优势 • 快速开始 • 接入模式 • 网络配置 • 界面预览 • 功能特性 • 安装与更新 • 高级配置 • 本地文件存储 • 常见问题
dsh-remote-mobile 是专为 DeepSeek Harness (DSH) 深度定制的远程与移动端安全治理插件。
DSH 核心服务出于安全考虑默认仅监听本地回环地址(127.0.0.1),手机、平板或其他电脑无法从外部访问 Web 控制台。本项目通过访问控制中间件与请求隔离技术,安全地开放了 Tailscale 虚拟私网 以及 本地局域网 (Wi-Fi/LAN) 访问能力,并提供登录凭证 RSA 加密、扫码配对、长期密码认证与防暴力破解审计体系。插件本身不提供全链路 TLS;完整传输加密需依赖 Tailscale 或外层 HTTPS。
手机端访问时,插件还针对 DSH 界面做了移动端样式适配:侧边栏抽屉折叠与可拖拽展开把手、新版官方三栏 Grid 布局与右侧边栏兼容、设置弹窗居中微缩、对话正文高密度排版等,让手机上的使用体验更贴近桌面端。
scrypt 加盐慢哈希密码落盘,连续输错自动熔断锁定 IP,拦截公网/局域网未经授权的访问。在终端执行 DSH 官方插件安装指令(推荐):
dsh plugin --profile web add dsh-remote-mobile[!IMPORTANT]
生态插件安装建议:不建议安装 `@linxin666/dsh-web-all` 全家桶,更推荐按需安装单体功能插件。全家桶将多个前端模块合并打包,可能引发移动端悬浮入口重复与手势交互冲突;如需任务看板、宠物等生态功能,建议直接安装对应的单体包(原因、推荐命令与共存说明见 常见问题 Q6)。
本插件 1.10.0+ 不需要修改 webserver 或 cordis.patch.yml:
127.0.0.1:3080;3081 安全接入代理;本节适用于本插件 1.10.0+。
安全权衡说明:安全接入代理默认监听 0.0.0.0:3081(暂不含 TLS)。若在公共 Wi-Fi 或未经保护的网络下使用,建议配合 Tailscale(WireGuard 隧道加密)或外层 HTTPS。插件 1.9.0 之前的配置迁移(DSH 0.2.1+)
本插件 1.9.0 之前的配置,或曾手动配置 webserver.host: 0.0.0.0 的配置,需要按以下步骤迁移。本插件 1.10.0+ 可直接跳过本节。
DSH 0.2.1+ 会拒绝 0.0.0.0,并在插件加载前直接启动失败。请删除或注释整个 webserver 配置块:
# ❌ DSH 0.2.1+ 下会启动失败
# - id: webserver
# host: '0.0.0.0'
# ✅ 保持默认回环监听
# 无需配置 webserver;DSH 使用 127.0.0.1:3080,
# dsh-remote-mobile 自动使用 3081 安全接入代理。不确定当前配置时:
grep -n -A5 'id: webserver' ~/.dsh/profiles/web/cordis.patch.yml若看到 host: '0.0.0.0',删除对应配置块;没有则无需处理。
DSH 0.1.7 ~ 0.2.0 可以保留 0.0.0.0,插件会回退 direct 模式;若通过自定义域名或公网 IP 访问,请配置 trustedHosts。
如果您安装了其他可能产生冲突的插件,推荐在 ~/.dsh/profiles/web/cordis.patch.yml(Windows 对应 %USERPROFILE%.dsh\profiles\web\cordis.patch.yml)中禁用冲突项:
# (推荐)只保留一款远程/Web 接入类插件,避免功能重复与入口混乱
# 本插件与其他远程接入类插件共存时也能正常启动:检测到配对共享服务被占用
# 会自动让出,并在设置页顶部展示警示横幅说明详情。
# 示例:禁用 @linxin666/dsh-web-ui-all 内置的远程插件
- id: web-ui-remote-web-ui
disabled: true💡 说明:插件自身注册已由 DSH Bundle 体系全自动处理,无需在cordis.patch.yml中额外添加id: remote-mobile。Windows 用户可按Win + R键输入%USERPROFILE%.dsh\profiles\web快速直达配置目录。
[!WARNING]
不建议安装聚合全家桶(`@linxin666/dsh-web-all`):它会把多个子插件的前端逻辑合并打包到同一个 client.js 中,加载时自执行,可能与本插件产生移动端入口重复与手势冲突。推荐按需安装所需单体插件(如任务看板、宠物等)。完整原因、推荐命令与共存说明见 常见问题 Q6。dsh web --no-open启动后,在电脑浏览器打开 DSH Web 控制台,进入 设置 ⚙️ -> 远程与移动端,使用手机微信或系统相机扫描二维码进入配对/登录页,完成授权后即可使用。
设置面板按 「接入 / 设备与安全 / 样式覆写 / 本地数据」 四个页签分组显示,避免长页面;页签选择会被记住,切换不重置配对码等状态。
本插件 1.10.0+ 默认使用 proxy,不需要配置 webserver:
场景 · DSH 核心监听 · 生效模式 · 手机访问 DSH 0.2.1+ + 插件 1.10.0+ · 127.0.0.1:3080 · proxy · 3081 DSH 0.1.7 ~ 0.2.0 + 0.0.0.0 配置 · 0.0.0.0:3080 · direct(自动回退) · 3080 DSH 0.2.1+ + 具体网卡 IP · 192.x.x.x:3080 · direct · 3080 同机反向代理 · 127.0.0.1:3080 + 显式 direct · direct · 反代入口
3081 提供认证与转发。0.0.0.0 配置或高级部署。127.0.0.1,手机无法直接访问;只有再通过同机 Nginx / Caddy / Tailscale Serve 等反向代理转发到 3080 时才有意义,否则只能本机使用。判定不能只看 TCP 来源 IP(socket 地址):Host 与 X-Forwarded-* 也会改变结果。socket IP 是服务器看到的 TCP 对端地址,不是 Host,也不是 X-Forwarded-For。
访问方式 · 链路 · 判定 · 插件登录 A 本机直连 · PC → 127.0.0.1:3081 · 本机回环(loopback) · 不需要 B 手机直连 · 手机 → 192.x.x.x:3081 / 100.x.x.x:3081 · 外部直连(external) · 需要(可开 allowLan/allowTailscale 免密) C 同机反向代理 · 手机 → Nginx → 127.0.0.1:3081 · 反向代理(reverse-proxy) · 需要(不享受免密)
这里的“反向代理”指用户侧的 Nginx / Caddy / Tailscale Serve,不是插件的 3081 安全接入代理。
127.0.0.1 仅在本机直连、且无外部 Host/Forwarded 时跳过登录,当前没有开关;跳过的只是插件登录,Host/Origin/CSRF 仍生效。LAN/Tailscale 默认认证,开启 allowLan/allowTailscale 后对应网络才免密;反向代理流量不享受这些免密。
展开:请求头、Nginx 配置与常见错误
请求头示例(A/B/C 对应上表):
Host: 127.0.0.1:3081Host: 192.x.x.x:3081 或 Host: 100.x.x.x:3081Host: dsh.example.com,并携带 X-Forwarded-For: 100.x.x.x / X-Forwarded-Host / X-Forwarded-Proto: httpsC 场景即使 Nginx 从 127.0.0.1 连入,仍判定为反向代理,需要认证。
location / {
proxy_pass http://127.0.0.1:3081;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}自定义域名需加入 trustedHosts:
{
"trustedHosts": ["dsh.example.com"]
}常见错误:Nginx 把 Host 改写成 127.0.0.1 并删除全部 X-Forwarded-*,插件会误判为 A 并跳过登录。Tailscale Serve 也是同机反代,同样要保留这些头。
网络接入与扫码配对 · 设备与安全 · 样式片段覆写 · 本地数据存储 ·
登录 · 对话列表字号缩放 · 侧边栏移动端样式 · 官方轨迹查看 · · ·
100.64.0.0/10 CGNAT 网段),生成专属访问二维码,支持开启免密直连(底层传输加密由 Tailscale WireGuard 隧道提供)。192.168.x.x、10.x.x.x、172.16-31.x.x),提供局域网专属二维码与直达链接预览,附带醒目的高危风险提示。RSA-OAEP-SHA256;crypto.getRandomValues() 做密码学安全随机数填充。插件不自带 TLS;登录后的页面、API 与 WebSocket 流量需要依靠 Tailscale 或外层 HTTPS 才能获得完整传输加密。
scrypt 加盐慢哈希算法(scrypt:${salt}:${hash})对密码进行落盘存储,比对过程采用 crypto.timingSafeEqual 恒定时间比较以防范时序侧信道攻击。.js、.css、.png、.svg、.woff2 等 20 种合法资源),拦截无扩展名或动态管理 API 请求(如 /plugins/xxx/admin),在兼容第三方生态插件前端资源的同时降低后台动态接口暴露面,无需用户在设置界面手动维护白名单。(DSH 核心静态目录 /assets/ 属官方资源,单独无条件放行。)beforeExit 进程退出 Flush,降低异常中断导致数据丢失或配置损坏的风险;settings.json 与 style-snippets.json 采用临时文件原子替换(renameSync)。X-Forwarded-*)时,才采用 X-Forwarded-For 首个合法 IP,兼顾真实来源与防伪造。Origin / Sec-Fetch-Site),恶意网页驱使浏览器向 127.0.0.1 发起的跨站写请求会被直接拒绝;curl / 本机脚本等无浏览器信号的客户端不受此限制。注意:该策略也会拦截第三方插件的跨域 webhook / OAuth callback,以及发送 Origin: null 的旧 WebView;使用此类集成时请先做兼容性验证。X-Forwarded-* 识别为代理流量,不再被误判为免密客户端,必须通过插件 Token 鉴权;受信代理通过内部 Secret 例外。插件自身为 loopback 请求注入的 127 Forwarded 头会被识别为内部头,不会误伤本机 3080 根路径的 connection 鉴权。SSE 事件流仅限同源连接,不开放跨域读取。crypto.randomUUID 与 navigator.clipboard Polyfill,解决移动端浏览器在 HTTP 非安全上下文下缺少原生 API 的报错(clipboard polyfill 在非安全上下文下提供复制/样式复制能力)。DSH Web 界面在手机上仍有不少沿袭桌面端的样式问题,插件内置「移动端样式片段」模块,把移动端适配拆分为可独立启停的 CSS 片段:
preset-sidebar 侧边栏抽屉导航:折叠时侧边栏 0 宽度占用、可拖拽悬浮把手、自适应抽屉宽度、44px 触控友好区;preset-settings 设置面板适配:上下堆叠自适应、顶部导航横滑、内容纵向自然滚览;preset-main 对话正文高密度排版:小字号 12.5px + 紧凑行距 + 收紧边距,每行展示更多内容;基于稳定 HTML 元素与 localName 后缀,不做布局缩放,无右侧留白;html[data-dsh-mobile] 打头,则只在手机等移动端 UA 下命中;希望「窄屏桌面窗口也生效」时请直接写选择器(无需 html[data-dsh-mobile] 前缀),注入层会自动包裹媒体查询。~/.dsh/remote-mobile/style-snippets.json,保存后下一次页面加载即生效,无需重启; 打上 data-dsh-mobile="1"` 标记作为作用域钩子(以其作为选择器时仅移动端 UA 命中,详见上条),并注入可拖拽的展开把手脚本(全端注入,运行时仅在侧边栏折叠时生效)。remoteWebUiPairing 配对共享服务被其他远程/Web 接入类插件占用时,本插件自动让出(延迟裁决:等待激活窗口结束后检测服务名归属),避免服务重名导致的整树回滚崩溃——从插件市场安装后通常无需手动禁用对方;展开查看全部 4 种安装方式