dsh-opentunnel:爲 DSH Web GUI 提供公網 HTTPS 入口

前言

DeepSeek Harness(DSH)的 Web 界面默認只監聽本機環回地址,用手機或外網瀏覽器訪問時,常見做法是 VPN、在路由器上開端口,或把 token 鏈接手工轉發出去。DSH 進程每次重啓都會輪換 Web token,收藏夾或舊二維碼容易變成 401 dsh web authentication required,體驗也不穩定。

@ikauann/dsh-opentunnel 是社區維護的 DSH 插件(分類:聯網工具),通過 OpenTunnel 爲 Web GUI 掛一條可隨時開關的公網 HTTPS 路由,並在設置頁提供永久二維碼入口;中間用環回代理改寫 Host/Origin,避免爲外網 Host 單獨放寬 DSH 的 API 圍欄。下文介紹其定位、安裝步驟與使用方式;事實均來自 GitHub 倉庫 的 README 與 package.json。

這是什麼

  • 名稱:@ikauann/dsh-opentunnel(npm 包名,當前資料中的版本爲 0.4.0)
  • 維護者:ikauann
  • 許可證:MIT
  • 定位:爲 DSH Web GUI 提供 OpenTunnel 公網路由——設置裏的開關、手機掃碼進站的永久 QR,以及守在本機 listener 前的權限改寫代理。
  • 運行要求:Node.js >=22(見 package.json 的 engines)

插件以當前 DSH 進程權限運行;安裝前應自行審閱源碼與許可證,並理解公網入口等同暴露本機上的智能體執行環境。

核心功能

設置頁開關與永久入口鏈接

在賬戶菜單、側欄底部的 Configurações → OpenTunnel(設置 → OpenTunnel)中可開關 Túnel público(公網隧道)。隧道默認關閉:可從外網訪問 agent 是一種需要主動開啓的狀態。

首次開啓約需 30 秒(創建隧道並通過 ACME 簽發證書);之後重新附着通常在數秒內完成。關閉開關後,公網路由立即失效。

永久入口形如 https://<host>/e/<código>(資料中的示例 hostname 爲 *.opentunnel.xyz)。用手機掃描二維碼即可打開該 URL;隧道側把入口碼換成當前進程的有效 token,DSH 下發 30 天有效期的簽名 cookie,之後手機可直接進入,無需再次掃碼。

DSH 啓動時還會在終端同一行打印本地 Web 與 opentunnel 鏈接,例如:

dsh web: http://127.0.0.1:3080/?token=…
dsh opentunnel: https://tqeae3hifged.opentunnel.xyz/e/390abeb82886223d2c5dca1485769813

同一鏈接會寫入 $DSH_HOME/opentunnel-link.txt(文件權限 600)。

/e/<código> 與 token 生命週期

DSH 打印的 Web token 是按進程的:重啓 DSH 會換 token,但隧道 hostname 與路徑不變,舊書籤或舊 QR 可能對同一 URL 返回 401。

入口碼保存在 $DSH_HOME/opentunnel.json,代理在每次打開時將其換成當前存活的 token,因此 DSH 重啓後鏈接形式仍可不變(仍依賴隧道 hostname 穩定——身份存放在 %USERPROFILE%\.local\share\opentunnel\(資料中的 Windows 路徑表述)——以及隧道處於開啓狀態)。

入口碼會過期(配置項 entryTtlDays,默認 7 天);打開設置頁或點擊 Novo link(新鏈接)會續期。已登錄設備靠 30 天 cookie,輪換入口碼不會踢掉已進站的手機,只會使舊鏈接失效。

環回代理與 Host/Origin 改寫

DSH 對 /api 有 Host/Origin 圍欄:接受環回、listener 綁定 IP 以及 trustedHosts(來自啓動參數 --trusted-host)。隧道會把訪客的 Host 原樣送到後端,導致圍欄對 /api 返回 403,GUI 無法加載後端。

插件在本機 listener 前增加環回代理,隧道指向該代理;代理將 Host 與 Origin 改寫爲 127.0.0.1:<porta>,其餘頭(含 sec-fetch-site)照常轉發,使請求在 DSH 看來等價於本地訪問,無需爲外網單獨加信任標誌。

需注意:cookie 綁定在 127.0.0.1:<porta> 上;若更改 listener 端口,舊 cookie 失效,但永久鏈接仍可工作並會簽發新 cookie。

若關閉代理改寫(rewrite: false),須以隧道 host 作爲可信主機啓動,例如資料中的 PowerShell 示例:

dsh --profile web --trusted-host tqeae3hifged.opentunnel.xyz --public-url https://tqeae3hifged.opentunnel.xyz

此模式下沒有 /e/<código>,需改用 DSH 每次重啓會更新的帶 token 鏈接。

安裝與啓用

安裝方式是在 web profile 的 package.json 中聲明依賴並加入 bundle,然後執行官方給出的安裝與重啓命令(資料原文,勿自行拼接其它 dsh plugin add 形式)。

  1. 編輯 $DSH_HOME/profiles/web/package.json,加入依賴與 bundle。若從 GitHub 安裝(非本地 link:),依賴寫爲 github:ikauann/dsh-opentunnel,並在 dsh.profile.bundles 中包含包名 @ikauann/dsh-opentunnel:
{
  "dependencies": {
    "@ikauann/dsh-opentunnel": "github:ikauann/dsh-opentunnel"
  },
  "dsh": {
    "profile": {
      "bundles": ["…", "@ikauann/dsh-opentunnel"]
    }
  }
}

(若使用本地路徑開發,可將依賴改爲 "link:C:/caminho/para/dsh-opentunnel" 等形式,bundle 條目保持不變。)

  1. 安裝依賴並重啓 DSH(服務端 bundle 與客戶端模塊僅在新的 boot 中加載):
$env:DSH_HOME="$HOME\.dsh"
dsh plugin --profile web install
dsh --profile web

Linux/macOS 用戶將 DSH_HOME 與路徑按本機環境替換即可;命令邏輯相同。

典型用法

經過上面的安裝與重啓後,按 README 中的順序操作:

  1. 打開 Web GUI,進入 設置 → OpenTunnel。
  2. 打開 公網隧道開關;首次等待約 30 秒直至路由就緒。
  3. 用手機掃描頁面上的 QR,或從終端輸出、opentunnel-link.txt 複製 https://<host>/e/<code> 鏈接。
  4. 用畢關閉開關,公網路由隨即拆除。

管理面 REST 路由(均需 header x-dsh-opentunnel,由 Host 注入)包括:GET /opentunnel/state、POST /opentunnel/enable、POST /opentunnel/disable、GET /opentunnel/link、GET /opentunnel/qr、POST /opentunnel/rotate。入口路由 GET /e/<código> 僅在隧道側、經代理可達,成功時 302 到 /?token=<當前 token>。

訪問審計寫入 $DSH_HOME/opentunnel-access.log(可在設置頁查看尾部;文件約 512 KB 自動輪轉)。

主要配置項

以下默認值與含義來自 README 配置表(在插件配置或 profile 中覆蓋,具體掛載方式以 DSH 與插件文檔爲準):

鍵 默認 作用摘要
enabled false 首次 boot 的初始狀態;之後以設置頁開關爲準
rewrite true 是否啓用 Host/Origin 改寫代理;關則需 --trusted-host
entryTtlDays 7 入口碼有效期
persist true 是否將開關與入口碼寫入 $DSH_HOME/opentunnel.json
printLink true 路由附着時是否在終端打印鏈接
accessLog true 是否記錄 opentunnel-access.log

完整鍵表(含 routeName、profile、api、proxy、rewritePort、targetPort、panelPath、linkFile 等)見倉庫 README 的「Configuração」一節。

適用場景與注意

適合誰:需要在不裝手機專用 App、不配 VPN、不在家用路由器上開端口的前提下,偶爾用手機瀏覽器或遠端 HTTPS 訪問同一臺機器上的 DSH Web GUI 的開發者。

安全(資料原文要點):

  • 無 token 且無有效入口碼時,公網 URL 對請求返回 401。
  • 永久鏈接相當於長期憑據:持有者相當於獲得本機 agent 上的代碼執行面;應在 entryTtlDays 內視需要輪換,並使用 Novo link 立即作廢舊碼。
  • 入口碼爲 128 位,不出現在模型上下文中;QR 以 SVG 經認證頁面 fetch 呈現,而非可被第三方記錄的 <img src> 外鏈。
  • TLS 在本進程終止,私鑰不離開本機。

限制:OpenTunnel 官方 CLI(Rust)在資料中僅提供 Linux 與 macOS 二進制;Windows 上該插件使用 TypeScript SDK(Node)。README 在「Limitações」之後內容在抓取稿中截斷,細節以倉庫最新說明爲準。

生態說明:DSH 奉行「一切皆插件」;SkillHub 目錄頁 爲社區收錄站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-opentunnel 把「公網 HTTPS + 設置開關 + 穩定 /e/ 入口 + 環回代理」收成一套可復現流程,針對的是 DSH Web 默認只服務本機、且進程 token 易變的問題。若要查看分類與簡介,可打開目錄頁;安裝、配置與安全細節以 GitHub 爲準。

  • 目錄頁:https://www.skillhub.cn/plugins/ikauann/dsh-opentunnel
  • GitHub:https://github.com/ikauann/dsh-opentunnel
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜