kk99668/dsh-mobile-access ↗★ 0
dsh-mobile-access
dsh bundle: serve the DeepSeek Harness Web GUI to a phone through your own domain and server — token gate + supervised SSH reverse tunnel
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:kk99668/dsh-mobile-access说明文档
阅读完整 README ↗dsh-mobile-access
English | 中文
dsh 手机远程访问组合包:通过你自己的域名和公网服务器,把 Web GUI 提供给手机访问。cordis.patch.yml 叠加在 Web 表层之上:把隧道服务的公共主机加入 connection 行的 /api 浏览器信任栅栏,并插入本包的 mobile-access 粘合插件。该插件在 webserver 之前启动一个本地令牌网关(src/gate.ts)和一个受监管的 SSH 反向隧道(src/tunnel.ts)通往中继服务器,提供 mobileAccess 服务(栅栏接受的公共主机),在 surfaceContext 为 true 时注册手机表层提示词段落与 bash 可见的 DSH_WEB_PUBLIC_URL 运行时变量,并在隧道建立后打印公共 URL(qrCode 为 true 时附带终端二维码)。中继服务器上由 Caddy 为域名终结 HTTPS 并反向代理进隧道;scripts/setup-server.sh 负责安装这一侧。分步部署手册见 DEPLOYMENT.md。
工作原理
phone ── https://dsh.example.com ──> Caddy (HTTPS, on your server)
└──> 127.0.0.1: (sshd reverse tunnel)
└──> local token gate (dsh process)
└──> http://127.0.0.1:
隧道是插件拥有的 ssh -N -R 子进程:按指数退避自动重连,稳定运行一段时间后重置退避,并随 fiber 一起消亡。网关提供了信任栅栏刻意不提供的认证层:每个请求和 WebSocket 升级都必须出示令牌(登录表单设置的 cookie,或 Basic/Bearer 凭据),才会被转发到 webserver。公共主机通过 mobileAccess 服务进入栅栏;补丁把该服务注入 connection 行的 inject,因此栅栏的配置表达式永远不会在主机存在之前求值。
弱网行为
手机链路是受限的一段(例如地铁通勤);隧道和中继服务器位于两端稳定的网络上。当这段链路劣化时,有三个机制保持 GUI 可用:
- 事件流有压缩(宿主支持时)。 WebSocket 下行链路协商
permessage-deflate(dsh 的web构建已内置),会话事件流(重复度高的 JSON)在手机链路上缩小数倍。浏览器会自动协商该扩展。 - 浏览器自动重连。 Web 客户端的连接控制器在信号中断时按指数退避(500 ms 起、倍增至 10 s 封顶)重新建立两条事件流,隧道中断或信号盲区无需刷新页面即可恢复。
- 隧道自我修复。
keepAliveIntervalSec/keepAliveCountMax让 ssh 快速感知中继失联(默认 30 s × 3 次探测),监管进程再按抖动退避(backoffBaseMs..backoffMaxMs)重启子进程。家庭上行不稳时,把keepAliveIntervalSec调到 10、backoffBaseMs调到 1000 可以缩短中断窗口,代价是少量额外探测包。