dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
让安卓/iPhone 手机在外面也能用浏览器原生页面打开本机的 DeepSeek Harness(DSH), 收「任务跑完」提醒,并在手机上给电脑发一句话就能召唤远程入口。
一套由插件 + 三个配套小服务组成的最小可用方案。不需要买域名、不需要改路由器、不租服务器。
语言:中文 · English
DSH 的 Web 界面默认只监听 127.0.0.1,手机碰不到。本方案做四件事:
| # | 能力 | 走什么 |
|---|---|---|
| 1 | 同 WiFi 用手机浏览器直接开 DSH | 本机反向代理(传达室)+ 自动续登录钥匙 |
| 2 | 出门用流量也想用浏览器原生页面 | 临时限时门(到点自动关,链接作废) |
| 3 | 任务跑完/出错主动提醒到手机 | 任意 Webhook 推送通道(企微群机器人等) |
| 4 | 手机发一句话就能召唤(在外面也能开门) | 机器人长连接(Bot ID + Secret,主动连出去) |
通知里的链接一律走公网(v0.3.0 起):发通知前,插件先看有没有还活着的临时门 (
doorMinRemainingMs默认0:只要没到期就复用,不重开门;复用时通知里只说明"门没关"、不重复给链接); 没有才自动开一扇(doorMinutes默认 480 = 8 小时)再把公网地址放进通知;门到点自动关、链接随即失效。 进门要带门钥匙(?gate=<gateKey>,32 字符随机串,跟门同生共死):只拿到域名打不开(401), 但拿到完整链接的人在门关之前都能进——这条边界详见docs/SECURITY.md第 2 节。 门没开成时宁可不带链接(附一句说明),也绝不推一条点不开的死链接。 为什么改:以前通知里放的是"手机可达地址前缀"(mobileBaseUrl,家里局域网 IP), 一出门在公网上根本不存在这个地址,点开必然打不开——这是 10-19 boss反馈的根因。
plugin/ # DSH 的 Cordis 插件(Host 半 + Client 半),本目录
├─ index.js # Host 半:生成手机入口链接、写 upstream、任务完成/出错推送
├─ client.js # Client 半:「手机远程」窄屏面板(工作区分区 + 忙闲 + 派活)
├─ cordis.patch.yml# 插件行配置(上传前请替换为 config.example.yml 的占位符写法)
├─ config.example.yml # 脱敏配置模板
├─ bot.example.json # 机器人凭据模板(脱敏)
├─ docs/ # 文档:踩坑 / 引导 / 架构 / 安全
└─ .gitignore # 排除真实凭据、日志、二进制
../phone-proxy.mjs # 传达室:51130 → 127.0.0.1:<DSH端口>(改写 Host/Origin)
../temp-door.mjs # 临时限时门:cloudflared 快速隧道,到点自动关
../bot/wecom-bot.mjs # 机器人长连接(示例实现:企业微信智能机器人)
三个配套服务各自独立、可单独使用。只用插件也能跑通第 1、3 条; 第 2 条要
temp-door.mjs,第 4 条要bot/。
plugin/ 目录用 DSH 的插件管理器装载(install_bundle,目标指向本目录)。config.example.yml):
pushWebhook:任意接受 POST JSON 的推送地址(企微群机器人 / 飞书自定义机器人 / 钉钉 / ntfy…);linkFile / mobileBaseUrl:入口链接落盘位置、手机可达的地址前缀。node phone-proxy.mjs,建议用系统计划任务托管(见 docs/GUIDE.md)。botId/secret 后 node bot/wecom-bot.mjs,手机发「开门」即召唤。细节步骤、分平台适配、验证清单见 docs/GUIDE.md。
| 文档 | 内容 |
|---|---|
| docs/TUTORIAL-WECOM.md | 企业微信部署教程:照着做就能跑通(含智能机器人长连接 + 群机器人推送 + 计划任务托管 + 排障表);英文版 TUTORIAL-WECOM.en.md |
| docs/GUIDE.md | 通用引导:从零到跑通、平台适配表、验证清单、排障 |
| docs/PITFALLS.md | 踩坑总结:我们实际踩过的每一个坑(现象 → 根因 → 对策) |
| docs/ARCHITECTURE.md | 架构与数据流、平台无关抽象(出口 Webhook / 入口 Bot) |
| docs/SECURITY.md | 安全须知、凭据管理、上传公开仓库前的脱敏清单 |
仓库里只放:
plugin/
├─ index.js client.js package.json icon.svg
├─ locale/{en,zh}.json
├─ config.example.yml # 配置模板(占位符)
├─ bot.example.json # 机器人凭据模板(占位符)
├─ README.md docs/*.md .gitignore
└─ companion/ # ← 上传前从上一级目录移入并脱敏(见下)
├─ phone-proxy.mjs phone-proxy-supervisor.mjs
├─ temp-door.mjs
└─ wecom-bot.mjs
上传前必须处理的三件事:
cordis.patch.yml(含真实工作路径 / 内网 IP / 推送频道)→ 用 config.example.yml 代替;*.json 真实配置(机器人 botId/secret、推送通道表)→ 用 bot.example.json 代替;companion/ 里的三个配套脚本已经是脱敏副本(推送出口改读 push.json 或环境变量 PUSH_WEBHOOK;机器人脚本的相对路径已按同目录改好),直接带上即可。更省事的做法:跑一键打包脚本,它自动剔除全部敏感文件与产物:
pwsh -File .\publish.ps1 -Target ..\..\dsh-phone-remote-publish生成目录即为可直接
git push的仓库内容。 提交前请逐条跑docs/SECURITY.md第 5.3 节的自检命令,全部应为"无匹配"。
本方案刻意不绑定某个 IM 平台,只要满足下面两条就能适配:
POST 一段 JSON。
企微群机器人、飞书自定义机器人、钉钉机器人、ntfy、Slack…均可。关键取舍:收消息一定要走长连接,不要走"平台把消息推到一个公网回调地址"。 后者要求一个固定不变的公网 HTTPS 地址——家庭宽带几乎做不到(详见
docs/PITFALLS.md第 1、3 条)。
手机远程实机演示(开门 → 手机浏览器原生页面进入 → 远程派活):media/phone-remote-demo.mp4
当前 v0.3.0(2026-10-19)。改了什么、每个版本修了哪些坑,见 CHANGELOG.md。
示例实现以企业微信为基准(官方 SDK @wecom/aibot-node-sdk)。
欢迎按 docs/ARCHITECTURE.md 的适配接口补其他平台。