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
羽毛球分组比赛记分
小程序二维码

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

小夜