前言¶
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/
按下面步骤走一遍完整链路:
- 用
admin登录管理台。 - 注册一个普通用户。
- 回到管理台审核通过该用户。
- 普通用户重新登录,进入网页桌面。
- 在桌面上传文件、新建文件夹,点击「在此文件夹启动 DSH」。
- 在「管理密钥」填入自己的 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