dsh-server-login:爲 DSH 提供多租戶託管、審覈與隔離

前言

DSH 本身適合本地、單用戶場景:啓動後在本地文件和密鑰環境中運行。但如果把 DSH 部署到一臺公網服務器,供多人長期使用,就需要補上幾件事:誰能登錄、誰被允許使用、每個用戶能否看到彼此文件、每個用戶的 API Key 如何分開保存、如何按域名或子路徑訪問各自的 DSH。

dsh-server-login 針對這些場景,在一臺服務器上提供多租戶 DSH 託管。多個用戶註冊後,由管理員審覈通過,各自獲得一套相互隔離的 DeepSeek Harness(DSH)環境,並可通過域名訪問。

定位

  • 倉庫:https://github.com/pointer-a/dsh-server-login
  • 許可證:MIT
  • 一句話定位:面向公網的多租戶 DSH 託管平臺
  • 主要能力:登錄審覈、每用戶隔離 DSH、網頁桌面、按文件夾插件、多形態訪問、API Key 隔離、本地單機或 k8s 部署

它解決的核心問題,是把原本偏本地單機的 DSH,放進一套可審覈、可隔離、可遠程訪問的服務端託管流程裏。

核心功能

登錄與審覈

bootstrap-admin 用於創建首個管理員。普通用戶註冊後,需要管理員審覈通過才能登錄。

禁用用戶時,會同時刪除其會話,並停止該用戶運行中的 DSH。

每用戶隔離 DSH

每個用戶對應一套相互隔離的 DSH 環境。主 DSH 常駐對外服務;當它崩潰時,會按需拉起一次守護 DSH 進行修復,並自動重啓主實例。

網頁桌面

普通用戶登錄後會進入網頁桌面,可以完成文件瀏覽、新建、上傳等操作,並按文件夾啓動 DSH。

所有路徑會經過兩層圍欄校驗:先做詞法包含校驗,再逐段拒絕符號鏈接分量,用於防止越出用戶根目錄。

每文件夾插件

系統會檢測該用戶 profile 中已安裝的插件,並按文件夾勾選啓用。啓用狀態會持久化,並注入 cordis patch。

多形態訪問

支持三類訪問形態:

  • 默認子路徑:/u/<userId>/dsh/
  • 每用戶子域名:<用戶名>.<baseDomain>,支持 HTTP + WebSocket
  • 自定義域名:提供 nginx server {} 生成接口

憑據隔離

每個用戶擁有命名 API 密鑰庫。API Key 使用 AES-256-GCM 加密落庫,落庫形態是 references-not-secrets。

更換 key 後會自動重建實例;spawn 時只注入當前啓用的 key。

部署模式

支持兩種部署模式:

  • local:單機部署
  • k8s:每用戶 Pod

安裝與運行

已覈實資料中未給出官方 dsh plugin add ... 形式的安裝命令。項目 README 給出的是 git clone、構建、運行的本地流程。

前置條件:

  • Linux 服務器
  • Node ^22.19≥24
  • 已安裝 DSH CLI

先克隆倉庫並完成構建:

git clone https://github.com/pointer-a/dsh-server-login.git
cd dsh-server-login
npm install && npm run build            # tsc → lib/

npm run build 會把代碼構建到 lib/

創建首個管理員:

node lib/cli.js bootstrap-admin --username admin --password '<強密碼>' --db ./dev.local.db

這個管理員用於登錄管理臺。

啓動編排服務:

node lib/cli.js --port 3080 --db ./dev.local.db

環境變量均可省略;同名 CLI flag,如 --port--db--isolation-mode,優先級更高。

典型用法

完成上面的步驟後,打開:

http://127.0.0.1:3080/

按下面步驟走一遍完整鏈路:

  1. admin 登錄管理臺。
  2. 註冊一個普通用戶。
  3. 回到管理臺審覈通過該用戶。
  4. 普通用戶重新登錄,進入網頁桌面。
  5. 在桌面上傳文件、新建文件夾,點擊「在此文件夾啓動 DSH」。
  6. 在「管理密鑰」填入自己的 DeepSeek API Key。

本地試跑可以驗證登錄、審覈、桌面、啓動這條鏈路。如果要打開 DSH 聊天界面,還需要配置域名與每用戶子域名。

k8s 部署模式

除本地單機模式外,項目也支持 k8s 每用戶 Pod 模式。啓用 k8s 模式時,需要配置相關變量,例如:

DB_URL
DSH_IMAGE
CONTROL_PLANE_IMAGE

這些配置項用於支撐容器化部署和每用戶 Pod 的生成。

安全與審計

已覈實的安全相關做法包括:

  • 會話使用不透明隨機 token,僅 SHA-256 哈希落庫
  • cookie 使用 HttpOnly + SameSite
  • HTTPS 下增加 Secure
  • 密碼使用 scrypt 加鹽哈希,並採用常數時間比較
  • 每用戶 API key 使用 AES-256-GCM 加密落庫
  • 主密鑰來自環境變量,或 <dataRoot>/secret.key,文件權限爲 0600
  • 文件操作先做詞法包含校驗,再逐段拒絕符號鏈接分量
  • 註冊、登錄、審覈、改密鑰等動作寫入 audit_log

隔離分層包括:

  • 軟隔離
  • 賬號級硬隔離:OS 賬號 + setpriv 降權
  • 端口守衛:iptables owner-match
  • k8s Pod 邊界

適用場景與注意

適合:

  • 需要把 DSH 部署到公網服務器,供多人分別使用
  • 需要註冊、審覈、禁用用戶
  • 需要每個用戶有獨立桌面、獨立文件目錄、獨立 API Key
  • 需要通過子路徑、子域名或自定義域名訪問 DSH
  • 需要在本地單機或 k8s 兩種形態之間選擇

注意:

  • 作爲 DSH 插件/服務端形態,它會在當前 DSH 進程權限下運行。安裝和啓用前,應檢查源碼與許可證。
  • 本地試跑可以驗證登錄、審覈、桌面、啓動鏈路,但完整打開 DSH 聊天界面還需要域名和每用戶子域名配置。
  • API Key 會加密落庫,但仍屬於敏感憑據,建議按生產環境要求管理主密鑰和數據目錄權限。

結尾

dsh-server-login 的價值在於把 DSH 從本地單用戶工具,擴展到一套可管理、可審覈、可隔離的多租戶託管服務。它以 MIT 許可證發佈,倉庫地址爲:

https://github.com/pointer-a/dsh-server-login
羽毛球分组比赛记分
小程序二维码

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

小夜