dsh-server-login
安全与治理pointer-a/dsh-server-login
面向公网的多租户 DSH 托管平台 —— 部署到一台公网服务器后,多个用户注册并经管理员审核,各自获得一套相互隔离的 deepseek-harness(DSH)环境,随时通过域名安全访问。
- communication
- dsh-plugin
README
dsh-server-login
面向公网的多租户 DSH 托管平台 —— 部署到一台公网服务器后,多个用户注册并经管理员审核,各自获得一套相互隔离的 DeepSeek Harness(DSH)环境,随时通过域名安全访问。
以 DSH 插件市场 的 cordis-plugin 形态分发,遵守 STANDARD.md。
它解决什么
DSH 本身是单用户本地工具,没有认证、没有多租户隔离、Web 远程访问缺认证层。dsh-server-login 在其之上补一层服务端登录 + 多租户编排:管理员审核注册用户,每个用户落到自己的文件桌面,按文件夹启动 DSH、选择启用哪些插件,通过域名访问,且彼此文件隔离(已适配手机端)。
核心能力
- 登录与审核:管理员先行(
bootstrap-admin),用户注册后需管理员审核通过;独立管理台 UI。 - 每用户隔离的 DSH 环境:主 DSH 负责正常工作;崩溃时按需拉起一次守护 DSH 修复并自动重启;装插件重启时守护执行主 DSH 给出的 post-restart 命令。
- 登录桌面:文件浏览 / 建文件夹 / 上传;按文件夹启动 DSH;每文件夹独立勾选启用的插件(自动检测该用户 profile 中已安装的插件,持久化并注入 cordis patch)。
- 域名访问:默认域名 + 每用户子路径
/u/<userId>/dsh/;自定义域名 + nginx 配置生成接口。 - 硬隔离(Linux):每用户独立 OS 账号(
setuid降权),0700目录真正隔离跨用户读。
部署形态(二选一)
同一套代码,靠 DSH_SERVER_LOGIN_DEPLOY_MODE 切换:
| 模式 A:直接部署(单服务器) | 模式 B:K8s + 容器化 | |
|---|---|---|
| 形态 | 单机裸机,child_process + setuid/iptables | 多机 ACK,每用户独立 Pod |
| 数据 | SQLite(本机文件) | PostgreSQL(CloudNativePG) |
| 隔离 | 软隔离 / OS 账号硬隔离 | Pod 网络 + SecurityContext + NetworkPolicy |
| 弹性/HA | 无(单点) | 控制面 3 副本 + leader election,DSH Pod 自动重建 |
| 交付 | git clone + 脚本 | kubectl apply -f deploy/ |
模式 B 已完整落地(Phase 0–4):每用户 DSH Pod(dsh + tcp-bridge sidecar)+ file sidecar(8082)+ Headless Service + NetworkPolicy;控制面 3 副本 + Lease 选主 + reconcile + 崩溃接管;NAS(CNFS) 共享卷 + PSA restricted + ResourceQuota。详见 docs/k8s-deployment.md(部署教程)与 docs/k8s-deploy.md(踩坑/部署流程)。
架构总览(模式 A)
用户浏览器 → nginx(TLS) → 编排服务(Fastify + SQLite,单进程)
├─ 认证 / 审核 / 桌面 / 域名 API
└─ /u/<userId>/dsh/* → 子 DSH(127.0.0.1:动态端口)
每用户子 DSH(主 + 按需守护)只绑回环端口,由编排服务反向代理对外。
编排服务以 child_process 按用户 spawn DSH 子进程,端口随机分配、崩溃自动重启。完整设计见 docs/blueprint.md。模式 B(k8s)的架构见 docs/k8s.md。
快速开始(模式 A)
npm install
npm run build # tsc → lib/
node lib/cli.js bootstrap-admin --username admin --password '<强密码>' --db ./dev.local.db
node lib/cli.js --port 3080 --db ./dev.local.db
访问 http://127.0.0.1:3080/:登录 / 注册 / 管理台 / 桌面(详细部署流程见 docs/deployment.md)。
k8s 模式 B 的部署请参考 docs/k8s-deployment.md,本文档介绍皆为模式 A。
配置
| 环境变量 | 默认 | 说明 |
|---|---|---|
DSH_SERVER_LOGIN_PORT | 3080 | 编排服务绑定端口 |
DSH_SERVER_LOGIN_DATA_ROOT | ~/.dsh-server-login | 每用户 home/workspace 根(生产 /var/lib/dsh-server-login) |
DSH_SERVER_LOGIN_DSH_BIN | dsh | 子 DSH 可执行 |
DSH_SERVER_LOGIN_ISOLATION_MODE | soft | soft 软隔离 / account 账号级硬隔离(Linux,需 root) |
DSH_SERVER_LOGIN_BASE_UID | 100000 | 账号级隔离的 uid 基数 |
DSH_SERVER_LOGIN_SECURE_COOKIES | false | HTTPS 部署设为 true |
DSH_SERVER_LOGIN_DEPLOY_MODE | local | local 单机 / k8s 每用户 Pod(模式 B) |
DSH_SERVER_LOGIN_DB_URL | 空 | Postgres DSN;设置即启用 Postgres(k8s 必填) |
其余可调项(dshCommand、spawnAsUserCommand、restartBackoffMs、sessionTtlSeconds、maxUploadBytes,及 k8s 专属的 k8sNamespace/dshImage/controlPlaneImage/egressCidrs 等)见 src/config.ts 与各文档。
文档
- docs/blueprint.md — 技术设计(拓扑 / 数据模型 / API / 双 DSH)
- docs/deployment.md — 模式 A:Linux 生产部署(账号级隔离 / nginx / systemd)
- docs/k8s.md — 模式 B:K8s + 容器化多机 HA(定案方案)
- docs/k8s-deployment.md — 模式 B:分步部署教程(ACK/CNFS/CNPG)
- docs/k8s-deploy.md — 模式 B:踩坑记录(部署流程 + 根因排查)
- docs/domain-config.md — 域名与 nginx 配置示例
- docs/troubleshooting.md — 常见问题排查(502 / 404 / SSL / 401 / 端口冲突)
安全
默认软隔离(每用户 $DSH_HOME + session cwd + 沙箱写隔离)。Linux 生产部署建议开启账号级硬隔离(每用户 OS 账号,闭合同 UID 越权读)。详见 docs/deployment.md。
问题反馈与支持
这是我开发的第一个正式项目,功能可能还不够完善,非常欢迎大家提出意见和反馈! 如果你在使用过程中遇到问题,或者有改进建议,欢迎提交 Issue:
- 🐛 遇到 Bug:请描述你的复现步骤、报错信息、以及运行环境(系统/DSH 版本等)
- 💡 功能建议:请说明你的使用场景和你期望的效果
- 📖 文档疑问:指出 README 中看不懂或描述不清的地方
我会尽量在 1~2 天内回复,确认有效的问题会尽快修复并发布更新。 感谢你的支持!🌟