dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness Network — public forwarding for a local dsh web UI over *.ds.hn: a dsh plugin + self-hosted WSS relay behind Cloudflare, with optional end-to-end encryption.
English · 中文
把本机运行的 DeepSeek Harness(dsh)网页界面,通过 *.ds.hn 子域名安全地开放到公网,并由登录门禁把守。安装插件、在本地打开 dsh,设置里的表单会让你填一个子域前缀和一个密码——这两项就是凭据。无需 token、无需环境变量、无需任何预置。还可选设置一个端到端密码加密流量,连中继运营者也只能看到密文。
⚠️ dsh 内置 bash 与文件系统工具,公网可达的 dsh 界面就是一个远程 Shell。 中继的登录门禁不是可选项,不要关掉它。请使用高强度密码,敏感场景优先启用端到端加密。
(子域, 密码) → 插件即认领子域并连接。凭据持久化到 dsh 自己的 ~/.dsh/settings.yaml,重启自动重连。/api 请求体与事件流:PBKDF2-SHA256(21 万次)→ AES-256-GCM。访客在浏览器里输入一次即可,可按设备记在 localStorage(永不传输)。已对 dsh 0.1.5-rc.1 实测通过(同时保持对更早版本可用)。
从 dsh 0.1.2-rc.1 起,dsh 给应用外壳和每一次 /api 调用都加了一道签名的、
与 Host 绑定的浏览器会话 cookie:浏览器要靠打开 dsh 打印的那个带 token 的启动
URL 才能换到它,其余一律 401 dsh web authentication required。公网访客不可能
持有这个 cookie——他们浏览器里的 cookie 属于公网域名,而 agent 回放的每个请求
Host 都被改写成了 loopback,dsh 又是按请求到达时的 Host 校验 cookie 的。所以
agent 改为向 dsh 自己的 connection 服务取本进程的启动 token,在 loopback 上兑
换一次,再把拿到的 cookie 盖在每一个回放请求和隧道内的 WebSocket 升级上。这个
cookie 始终不出本机:中继和访客浏览器都看不到它,访问控制仍然由中继的登录把关。
面对没有这道围栏的旧版 dsh,agent 会自动识别并保持原有行为。
dsh ≥ 0.1.2 必须搭配 agent 0.4.0。 更早的 agent 只会把一个 401 页面转发出去。 中继无需改动——修复完全在 agent 侧,已部署的中继同时服务两者。
浏览器 alice.ds.hn
│ HTTPS
▼
Cloudflare 边缘 (*.ds.hn 代理 / 橙色云) 免费 DDoS、WAF、TLS、
│ 回源 Anycast、隐藏源站
▼
中继 relay (你的服务器, @dshn/relay) 登录门禁 + 子域认领表;
│ 每设备一条多路复用 WSS 只搬运字节
▼
dshn (dsh 插件, 在用户机器上) 把 HTTP + WS 重放给 dsh,
│ http://127.0.0.1:<dsh 端口> Host/Origin 改写为环回
▼
dsh (本地网页服务) 信任门禁看到的是一个环回请求
/api 浏览器信任门禁把它当作任意运行时选定子域的本地同源请求接受——这正是「子域来自表单而非组合」得以成立的原因。访问由中继登录把守,而非该门禁。| 包 | 是什么 | 运行在哪 |
|---|---|---|
@dshn/protocol | 两端共同编译的 WSS 帧协议 | 共享 |
@dshn/agent | dsh 插件:设置表单 + 出站隧道 + 状态挂件 + e2e | 用户机器,dsh 之内 |
@dshn/relay | 登录门禁 + 认领表 + 子域路由 + HTTP/WS 桥接 | 你的服务器,Cloudflare 之后 |
认领表(packages/relay/src/claims.ts)目前是信任首次使用;账号化的控制面日后替换它。
从 npm 安装(推荐——一条命令,完全自包含):
dsh plugin --profile web add @dshn/agent
dsh --profile web
或从最新 GitHub Release 下载预构建 tarball:
curl -L -o dshn.tgz \
https://github.com/jsdvjx/dshn/releases/latest/download/dshn.tgz
dsh plugin --profile web add ./dshn.tgz
或从源码构建:
pnpm install && node scripts/build-dist.mjs
dsh plugin --profile web add ./dist/dshn
dsh --profile web
随后在本地打开 dsh,进入 设置 → 公网转发,填写子域前缀与密码(可选端到端密码),点连接。用同一个访问密码即可从手机登录。每个子域最多跑一个 agent——相同凭据的两个 agent 会互相争抢。
agent 环境变量(全部可选,均有合理默认值):
| 变量 | 默认值 | 用途 |
|---|---|---|
DSHN_ENABLED | 1 | 设为 0 则加载插件但不启用 |
DSHN_RELAY_HOST | relay.ds.hn | 中继地址;直连(绕开 Cloudflare)用 wss://origin.ds.hn:8787 |
DSHN_ORIGIN_CA | — | 钉扎自签名直连源站证书的 PEM |
DSHN_STATE | ~/.dsh/dshn-agent.json | 旧版状态文件(凭据现在存于 settings.yaml) |
DSH_HOME | ~/.dsh | dsh 主目录 |
你不必用 ds.hn——整套都能跑在你自己的域名上。中继以 @dshn/relay(npm)及 Docker 镜像发布;在设置表单里选 自托管、填入中继地址即可指过去(也可用 DSHN_RELAY_HOST)。完整指南(含 DNS 与 TLS 各选项):SELF-HOSTING.md。
# 你的服务器 —— 唯一必填的只有 apex;登录密钥自动生成并持久化,
# claims 与密钥都放在 --data-dir 里
npx @dshn/relay --apex tunnel.example.com --data-dir /var/lib/dshn
# 你的 dsh —— 或直接在 设置 → 公网转发 → 自托管 里填
DSHN_RELAY_HOST=wss://tunnel.example.com dsh --profile web
Cloudflare:把 *.ds.hn(橙色云代理)指向中继源站。请把源站加固为仅接受 Cloudflare——按 Cloudflare IP 段做防火墙,并启用 Authenticated Origin Pulls(mTLS)。因为 Cloudflare 约 100 秒关闭空闲 WebSocket,两端每 25 秒心跳——已内置。若要承载持续大流量的直连隧道,加一条灰云(仅 DNS)origin.ds.hn A 记录,并让 agent 用 DSHN_RELAY_HOST + DSHN_ORIGIN_CA 指过去。
对 dsh 0.1.5-rc.1 端到端可用。已知不足:偶发的隧道套接字断开会让该连接上的在途请求失败(尚无请求重放);持续大流量下 Cloudflare 可能重置隧道(改用直连源站方案);CF 免费版 100 MB 请求上限会截断较大的 dsh 图片上传;单个隧道帧上限 128 MB,低于 dsh 自己的 300 MB 请求体上限,因此超过该大小的端到端加密响应会失败;端到端加密的 /api 响应体不压缩(密文压不动);认领表仍是信任首次使用、无账号层;生产环境应把中继源站锁定到 Cloudflare IP 段并启用 Authenticated Origin Pulls。