🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

云端中继服务 april-jk/dsh-relay

DeepSeek Harnessv0.3.0
april-jk76 天前有提交已提供中文文档扫描:含敏感能力

为手机遥控插件提供端到端加密的远程连接中转

34.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add april-jk/dsh-relay
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · ui
装得上吗
npm 包存在但缺 main/exports/bin 入口声明,源码安装也可能起不来
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 76 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-relay @ 0.3.0
✓Node 引擎要求 22.x · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 04:57:11

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 10 处,展示前 10 条)
  • 读取密钥环境变量
    src/server.ts:59
    const adminPassword = process.env.ADMIN_PASSWORD ?? "";
  • 写入本地文件
    src/server.ts:112
    mkdirSync(dirname(dbPath), { recursive: true });
  • 读取本地文件
    src/web.ts:89
    res.end(readFileSync(join(webRoot, "app/remote-unavailable.html")));
  • 读取本地文件
    src/web.ts:93
    const body = readFileSync(join(webRoot, relative));
  • 发起网络请求
    web/admin/admin.js:15
    const response = await fetch(path, {
  • 发起网络请求
    web/app/app.js:49
    const response = await fetch(path, {
  • 发起网络请求
    web/app/sw.js:393
    const response = await fetch("/web-ticket", {
  • 发起网络请求
    web/app/sw.js:532
    return fetch("/remote/unavailable.html");
  • 发起网络请求
    web/app/sw.js:535
    return await tunnel.request(path, event.request);
  • 发起网络请求
    web/app/sw.js:541
    return recovered.request(path, event.request).catch(() => new Response("Secure tunnel failed", { status: 502 }));
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 端到端加密中转
  • 远程连接中转

README

由 DeepSeek 最新模型翻译生成
dsh-relay DeepSeek Harness 插件基础设施: 本 Relay 为 DSH Mobile 插件提供远程连接能力;该插件已向 DeepSeek Harness 官方插件仓库提交,并已发布到官方社区的插件展示区。 用于 DSH 手机遥控 MVP 的云端 Relay。 公共生产地址:https://relay.dshmobile.online。0.1.9 默认只路由端到端加密的 sealed tunnel,不接收 DSH 业务明文。 浏览器访问 直接访问 Relay 根地址会跳转到 /app/。该页面支持账号登录、注册、配对、设备列表,以及在 Safari 中打开原有 DSH Web UI。浏览器使用 Web Crypto 实现 sealed-tunnel-v1,密钥只保存在本机 IndexedDB 与当前 Service Worker 内存中。Relay 仍然只能看到账号与设备关系、连接时间、密文长度和流量时序。 Companion 生成的二维码是 https:///app/#/pair?code=...&key=...。iPhone 相机可以直接打开;# 后的配对码与密钥不会发送到 Relay。已配对电脑还可以在 DSH 设置页生成浏览器访问码 #/web-pair?
展开完整文档(README 剩余 1 节)
dsh-relay

DeepSeek Harness 插件基础设施: 本 Relay 为 DSH Mobile 插件提供远程连接能力;该插件已向 DeepSeek Harness 官方插件仓库提交,并已发布到官方社区的插件展示区。

用于 DSH 手机遥控 MVP 的云端 Relay。

公共生产地址:https://relay.dshmobile.online。0.1.9 默认只路由端到端加密的 sealed tunnel,不接收 DSH 业务明文。

浏览器访问

直接访问 Relay 根地址会跳转到 /app/。该页面支持账号登录、注册、配对、设备列表,以及在 Safari 中打开原有 DSH Web UI。浏览器使用 Web Crypto 实现 sealed-tunnel-v1,密钥只保存在本机 IndexedDB 与当前 Service Worker 内存中。Relay 仍然只能看到账号与设备关系、连接时间、密文长度和流量时序。

Companion 生成的二维码是 https:///app/#/pair?code=...&key=...。iPhone 相机可以直接打开;# 后的配对码与密钥不会发送到 Relay。已配对电脑还可以在 DSH 设置页生成浏览器访问码 #/web-pair?device=...&key=...,手机和多个浏览器可以分别保存同一台电脑的 E2EE 密钥并同时使用,不会互相解绑。旧版 JSON 二维码仍可由移动 App 解析,但新 Companion 默认生成浏览器链接。

远程页面依赖 HTTPS、Service Worker、Web Crypto 与 WebSocket。生产部署必须设置 PUBLIC_RELAY_URL=https://实际域名,并保持 ALLOW_LEGACY_WEB_PROXY=0。

管理后台

后台地址是 /admin/。只有同时设置以下两个部署 Secret 时才启用:

ADMIN_USERNAME=relay-admin
ADMIN_PASSWORD=使用密码管理器生成的独立强密码

管理会话使用独立的 HttpOnly、SameSite=Strict Cookie,不与普通用户会话复用。后台显示用户总数、新增用户、近 30 天活跃用户、已绑定与在线设备、访问会话趋势和最近访问记录。它不显示或保存 DSH 请求路径、任务文本、模型输出、HTTP 正文、WebSocket Frame、IP、token 或 E2EE 密钥。

本地运行

cp .env.example .env
npm install
npm run build
npm start

默认监听地址是 http://127.0.0.1:8787。生产环境必须将 DATABASE_PATH 设置到持久化存储。任何公网部署都应提供 HTTPS/WSS;Relay 不会持有或记录隧道业务明文。

版本发布

每个 Pull Request 和分支 Push 都会由 GitHub Actions 使用 lockfile 安装依赖,并执行构建、测试和生产依赖审计。推送与 package.json、package-lock.json 中版本完全一致的标签(例如 v0.1.9)后,GitHub Release 会自动创建。

每个 Release 提供包含预编译 dist/、部署文件和生产依赖清单的 .tar.gz 与 .zip,并附带 SHA256SUMS。同一工作流还会发布 ghcr.io/april-jk/dsh-relay: 与 :latest。只有最高的稳定 SemVer 标签可以更新 latest;已有版本镜像和 Release 资产不能被不同内容覆盖。解压后先运行 npm ci --omit=dev,再运行 npm start;原生依赖会针对目标平台安装,而不是打包 CI 环境中的二进制。

Railway

从本目录创建 Railway Service,将 JWT_SECRET 设置为至少 32 字节的随机值,并挂载持久卷到 /data。生产环境缺少该 Secret、长度不足或仍使用文档占位值时,Relay 会拒绝启动。设置 DATABASE_PATH=/data/relay.sqlite。添加 HTTPS 自定义域名,例如 relay.dshmobile.online,然后在移动应用和 Companion 中使用该地址。Companion 会自动把 https:// Relay URL 转换为设备连接所需的 wss://。

同时设置 PUBLIC_RELAY_URL 为完整 HTTPS Origin。需要后台时,再通过 Railway Secret 单独设置 ADMIN_USERNAME 与 ADMIN_PASSWORD;不要把真实值写入 .env.example、Git 或部署日志。

在 Railway 中设置 TRUST_PROXY=1,让限流使用 Railway 可信代理提供的第一个地址。直接暴露 Node 进程时应保持禁用。

MVP 有意采用单实例架构。在引入共享存储前,必须使用 SQLite 持久卷,并且只能运行一个 Relay 副本。

使用 Docker 私有部署

cp .env.example .env

设置一个至少 32 字节的随机 JWT_SECRET,然后启动单实例 Relay:

docker compose up -d --build
curl http://127.0.0.1:8787/health

在 8787 端口前配置 HTTPS 反向代理。除非该代理会覆盖客户端转发请求头,否则保持 TRUST_PROXY=0。relay-data Volume 保存 SQLite 状态,必须备份。在移动应用中选择 Relay 服务器 并输入公网 HTTPS Origin;电脑端使用相同的 DSH_RELAY 地址启动 DSH。

资源限制

Relay 会限制 sealed session 数量、密文字节、Frame 速率、握手时间与空闲时间。默认值适用于 MVP 部署,可以通过环境变量调整:

| 环境变量 | 默认值 | 限制范围 |
| MAX_API_BODY_BYTES | 65,536 | JSON API 请求体 |
| MAX_WS_PAYLOAD_BYTES | 4,194,304 | 单个入站 WebSocket Frame |
| API_RATE_LIMIT_PER_MINUTE | 300 | 每个客户端地址的 API 请求 |
| AUTH_RATE_LIMIT_PER_MINUTE | 20 | 每个客户端地址的额外鉴权限制 |
| PAIR_RATE_LIMIT_PER_MINUTE | 30 | 每个客户端地址的额外配对限制 |
| WS_UPGRADE_RATE_LIMIT_PER_MINUTE | 120 | 每个客户端地址的 WebSocket Upgrade |
| MAX_SECURE_TUNNELS_GLOBAL | 512 | 单个 Relay 实例的并发 sealed session |
| MAX_SECURE_TUNNELS_PER_DEVICE | 8 | 每台电脑的并发 sealed session |
| MAX_SECURE_TUNNEL_BYTES | 536,870,912 | 每个 sealed session 的累计密文字节 |
| SECURE_FRAME_RATE_LIMIT_PER_MINUTE | 2,400 | 每个访问会话的 sealed frame |
| SECURE_TUNNEL_IDLE_TIMEOUT_MS | 300,000 | sealed session 空闲超时 |
| SECURE_HANDSHAKE_TIMEOUT_MS | 10,000 | E2EE 握手超时 |

以下限制只在显式设置 ALLOW_LEGACY_WEB_PROXY=1、启用已弃用明文代理时生效:

| 环境变量 | 默认值 | 限制范围 |
| TUNNEL_RATE_LIMIT_PER_MINUTE | 600 | 每个客户端地址的转发 HTTP 请求 |
| MAX_TUNNEL_BODY_BYTES | 2,097,152 | 单个 legacy HTTP 请求 |
| MAX_TUNNEL_RESPONSE_BYTES | 33,554,432 | 单个 legacy HTTP 响应 |
| MAX_PENDING_HTTP_PER_DEVICE | 32 | 每台电脑的 legacy 并发 HTTP 隧道 |
| MAX_TUNNEL_WS_PER_DEVICE | 16 | 每台电脑的 legacy 并发 WebSocket 隧道 |
| MAX_PENDING_HTTP_GLOBAL | 512 | 单实例 legacy 并发 HTTP 隧道 |
| MAX_TUNNEL_WS_GLOBAL | 256 | 单实例 legacy 并发 WebSocket 隧道 |

限流计数有意保存在实例本地,与 MVP 单实例架构保持一致。过期的 Refresh Token、配对会话、访问会话和事件会在启动时清理,此后每 15 分钟清理一次。

移动版本策略

公开接口 GET /app/version?platform=android|ios 用于驱动移动应用的更新提示。每个平台可以独立配置:

APP_ANDROID_LATEST_VERSION=0.2.0
APP_ANDROID_MINIMUM_VERSION=0.1.3
APP_ANDROID_DOWNLOAD_URL=https://play.google.com/store/apps/details?id=io.github.apriljk.dshremote
APP_ANDROID_RELEASE_NOTES=Improved remote session stability.
APP_IOS_LATEST_VERSION=0.2.0
APP_IOS_MINIMUM_VERSION=0.1.3
APP_IOS_DOWNLOAD_URL=https://apps.apple.com/app/id0000000000
APP_IOS_RELEASE_NOTES=Improved remote session stability.

提高 LATEST_VERSION 会显示可关闭的更新提示。只有必须阻止旧版使用时才提高 MINIMUM_VERSION。提高任一版本前,必须先配置有效的平台下载地址。

许可证

MIT
预览分享卡片长什么样 ↓april-jk/dsh-relay
分享 · DeepSeek Harness Hub
april-jk/dsh-relay

为手机遥控插件提供端到端加密的远程连接中转

这是你的仓库?认领条目

回到顶部