🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多租户认证网关 slywalker2006/dsh-passwords

DeepSeek Harnessv2.7.8
slywalker200624 天前有提交已提供中文文档扫描:含敏感能力

让多人远程共用 DeepSeek Harness,按账号管理工作区、会话和用量账号登录 · 工作区与会话授权 ·…

56.5/100
综合分
69
GitHub 星标
664
npm 周下载
—/5
用户评分

数据截至 2026/10/10 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-passwords
npm 源 · dsh-passwords 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-passwords @ 2.7.8
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 20:43:59

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-general@deepseek-ai/dsh-client-ui-slots
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

功能亮点

  • 远程访问与自动HTTPS
  • 子用户权限与配额
  • 沙箱强制隔离

把 DeepSeek Harness 变成多租户平台的服务级网关:远程访问 + 自动 HTTPS、子用户权限与配额、沙箱强制隔离、加密认证、审计日志。

v2.7.82026-10-10
· 更新公告: 1. 兼容 DSH 0.2.1-alpha.2:9 个 @deepseek-ai/dsh* 开发依赖、npm-shrinkwrap.json、安装器与内置 Docker 默认运行时统一升级并锁定到官方 alpha.2;声明范围保持 >=0.2.1-alpha.1 =0.2.1-alpha.1 <0.2.2-0。 2. 新功能(Issue #38):目录授权并入单一的「可读目录」范围(allowedFolders),读写与创建合并为同一范围——能读就能在里面创建,不能读就不能创建。所有者用受限目录浏览器分配,根目录来自 MCP_GATEWAY_DIRECTORY_PICKER_ROOTS(未设置时默认用户主目录;文件系统根目录永远不作为起点,因此不会枚举整块磁盘)。允许列表内的内容可读;开启「工作区创建权限」后,这些可读目录同时也是创建范围,子用户能在其中新建文件夹并注册为工作区;列表之外既不可读也不可创建。[] 保持原有的不受限目录语义,['__deny__'] 全部拒绝;关闭开关只拒绝创建,可读范围保留。 3. 新功能(Issue #39 与多用户协作改进):listAssignableWorkspaces() 改用批量标题快照,只对没有标题的会话读取 surface;三个超时/TTL 键接入托管环境,并新增可选的清单 TTL,修复工作区视图 504 和权限保存 502。权限更新立即撤销旧版与 Remote 订阅的投递资格,缩短撤销窗口,同时沙箱强制生效;每个 workspaceFiles/changes 帧都重新校验工作区、归属与敏感路径边界;归档/取消归档响应和 Remote 归档更新立即刷新子用户会话列表投影,较慢的旧列表响应无法回滚更新的归档状态。 4. 优化与修复:修复 Issue #36 安装器非 root 首次安装——DSH_PASSWORDS_ENV_FILE 指向尚不存在的 .env 时,不再触发「自动 HTTPS 需要 root」的拦截并在插件注册前退出;仅当自动 HTTPS 明确关闭(0/false/no)或提供自管证书对时,才允许非 root 首次安装,默认/on/未知取值以及单边或空白证书仍需 root,默认安装目录改为 $HOME/dsh-passwords。为 alpha.2 适配可选的 bind-all 补丁(命令行与 WebServer 的通配监听守卫,含状态检查、关闭还原与回滚;默认监听限制不变);npm 包纳入 docs/,Docker 镜像新增就绪探针和构建期版本断言。 验证:本地 npm run build 通过;node --import tsx --test "test/**/*.test.ts" 全量 1049 项:1048 通过 / 0 失败 / 1 跳过(Windows 符号链接用例按平台预期跳过);npm pack --dry-run 内容检查通过(79 个文件,无 .env/data/setup-key 泄漏)。测试服务器实际部署 2.7.8 / DSH 0.2.1-alpha.2,healthz/readyz/login 均 200、patch 四项全绿。Docker 镜像内置 DSH 0.2.1-alpha.2(应用 2.7.8),单条 docker run(含 -e SETUP_KEY)完成首次配置(302)与登录(302),镜像已推送 :2.7.8 / :latest(digest sha256:039cf7db96331f10e0408bbaecabfd3f0e0b001d610464eff515a7bab9e9d57b)。 验证:本地 npm run build 通过;node --import tsx --test "test/**/*.test.ts" 全量 1049 项:1048 通过 / 0 失败 / 1 跳过(Windows 符号链接用例按平台预期跳过);npm pack --dry-run 内容检查通过(79 个文件,无 .env/data/setup-key 泄漏)。测试服务器实际部署 2.7.8 / DSH 0.2.1-alpha.2,healthz/readyz/login 均 200、patch 四项全绿。Docker 镜像内置 DSH 0.2.1-alpha.2(应用 2.7.8),单条 docker run(含 -e SETUP_KEY)完成首次配置(302)与登录(302),镜像已推送 :2.7.8 / :latest(digest sha256:039cf7db96331f10e0408bbaecabfd3f0e0b001d610464eff515a7bab9e9d57b)。 同步发布 npm 官方包与 D
v2.7.72026-10-03
· 更新公告: 1. 兼容基线调整为 DSH 0.2.1-alpha.1:开发依赖、npm-shrinkwrap.json、安装器与 bundled Docker 默认运行时统一锁定官方 alpha.1;版本门禁收窄为单条 patch 线 >=0.2.1-alpha.1 =0.2.1-alpha.1 <0.2.2-0,接受 alpha.1 起的 0.2.1 预发布版与稳定版,停用 0.1.x / 0.2.0 线、0.2.1-alpha.0 及所有 0.2.2+;patch off 回滚旁路仍留在门禁之外。 2. 修复 Issue #35:未认证的精确 /favicon.ico 请求现在返回 204(不渲染、不重定向、不写 cookie),浏览器自动发起的 favicon 请求不再轮换 CSRF cookie;GET /gateway/login 现在只在现有 CSRF cookie 校验失败时轮换 token;字面量 Origin: null 被显式归类,仍按 fail-closed 拒绝;格式错误的多字节签名 cookie 不再让网关进程崩溃。 3. 修复 /gateway/api/download 中跨子用户的越权提权:归属检查在文件夹白名单之外重新校验,只被分配共享父目录的子用户无法再下载其他子用户的文件;删除自建工作区时回收自动授予的文件夹权限,同时保留所有者分配的授权。 4. 修复真实浏览器同源登录 403(Referrer-Policy 从 no-referrer 改为 same-origin),并修复会话归属、SSE 过滤(LF/CRLF/CR 与拆分 UTF-8 块)、Remote mux 缓冲和插件生命周期问题;Docker 安装现在只需一条 docker run 命令,-e SETUP_KEY 即首次运行设置密钥。 验证:本地 npm test 708/708、node test/issue-35-standalone.mjs、npm run build、npx tsc -p tsconfig.json --noEmit、git diff --check 通过;隔离环境真实 DSH 0.2.1-alpha.1 宿主 + 网关 E2E 9/9 通过;测试服务器部署验收通过(healthz/readyz/login 200、patch 四项全绿);Docker 镜像内置 DSH 0.2.1-alpha.1,单条 docker run(含 -e SETUP_KEY)完成首次配置与登录验证,镜像已推送 :2.7.7 / :latest。 验证:本地 npm test 708/708、node test/issue-35-standalone.mjs、npm run build、npx tsc -p tsconfig.json --noEmit 与 git diff --check 通过;隔离环境真实 DSH 0.2.1-alpha.1 宿主 + 网关 E2E 9/9 通过;测试服务器部署验收通过(healthz/readyz/login 200、patch 四项全绿);Docker 镜像内置 DSH 0.2.1-alpha.1,单条 docker run(-e SETUP_KEY)完成首次配置与登录,已推送为 :2.7.7 / :latest。 同步发布 npm 官方包与 Docker 镜像 skywalker237234/dsh-passwords:2.7.7 / :latest(内置 DSH 0.2.1-alpha.1)。 本次发布同步发布 npm 包与 Docker 镜像 skywalker237234/dsh-passwords:2.7.7 / :latest(内置 DSH 0.2.1-alpha.1)。
v2.7.62026-09-29
· 更新公告: 1. 兼容 DSH 0.2.0-rc.1,并保留 0.2.0 线 alpha/beta/rc 与稳定版的兼容门禁。 2. 修复 Issue #33:解决 Windows spawn EINVAL、部署目录 EBUSY/EPERM、配置优先级和自动更新重复安装问题。 3. 兼容大多数普通插件:普通 HTTP/Remote 与已加载 WebSocket 面向子用户开放;子用户可使用主用户分配的工作区并新建会话,SSH/终端等宿主敏感能力仍仅主用户可用。 4. 修复工作区/会话授权、403/502/503、沙盒、上传下载、目录选择器、插件清单、配置漂移、回滚和多项跨平台生命周期问题;主子用户统一使用网页 browse 目录选择器。 · 发布说明: 1. 兼容 DSH 0.2.0-rc.1,同时保留 0.2.0 线 alpha/beta/rc 预发布版与稳定版的兼容门禁。 2. 修复 Issue #33:Windows spawn EINVAL、部署目录 EBUSY/EPERM、配置优先级和自动更新重复安装。 3. 兼容大多数普通插件:普通 HTTP/Remote 与已加载 WebSocket 面向子用户开放;子用户可使用主用户分配的工作区并新建会话,SSH/终端等宿主敏感能力仍仅主用户可用。 4. 修复工作区/会话授权、403/502/503 响应、沙盒、上传下载、目录选择器、插件清单、配置漂移、回滚和多项跨平台生命周期问题;主子用户统一使用网页 browse 目录选择器。 验证:本地 npm test 649/649、构建、类型检查、Windows Issue #33 定向测试、README 安装流程打包验证通过;本地 Windows DSH 0.2.0-rc.1 HTTP 启动与 dsh-passwords 自动拉起通过;测试服务器分配工作区 E2E 20/20 通过;Docker 镜像内置 DSH 0.2.0-rc.1 并完成运行验证。 验证:本地 npm test 649/649、构建、类型检查、Windows Issue #33 定向测试、README 安装流程打包验证通过;本地 Windows DSH 0.2.0-rc.1 HTTP 启动与 dsh-passwords 自动拉起通过;测试服务器分配工作区 E2E 20/20 通过;Docker 镜像内置 DSH 0.2.0-rc.1 并完成运行验证。 同步发布 npm 官方包与 Docker 镜像 skywalker237234/dsh-passwords:2.7.6 / :latest(内置 DSH 0.2.0-rc.1)。 本次发布同步上线 npm 包与 Docker 镜像 skywalker237234/dsh-passwords:2.7.6 / :latest(内置 DSH 0.2.0-rc.1)。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-passwords 让多人远程共用 DeepSeek Harness,按账号管理工作区、会话和用量账号登录 · 工作区与会话授权 · 用量配额 · 审计日志 · 中英双语 适用场景 · 功能 · 快速开始 · 首次配置 · 卸载 · 自动 HTTPS · 部署拓扑 · 配置参考 · 常见问题 · 安全与隐私 · 参与贡献 适用场景 | 你想做什么 | dsh-passwords 提供什么 | | 小团队共用服务器上的 DSH | 独立登录账号、子用户管理与用量配额 | | 只把指定项目或对话分享给他人 | 工作区白名单与逐会话授权 | | 集中管理远程访问 | 登录限流、审计日志,以及宿主机自动 HTTPS 或反代部署 | 核心使用流程:主用户创建子账号 → 分配工作区、会话和额度 → 子用户登录并使用获授权的资源。
展开完整文档(README 剩余 1 节)
dsh-passwords

让多人远程共用 DeepSeek Harness,按账号管理工作区、会话和用量账号登录 · 工作区与会话授权 · 用量配额 · 审计日志 · 中英双语

适用场景 · 功能 · 快速开始 · 首次配置 · 卸载 · 自动 HTTPS · 部署拓扑 · 配置参考 · 常见问题 · 安全与隐私 · 参与贡献

适用场景

| 你想做什么 | dsh-passwords 提供什么 |
| 小团队共用服务器上的 DSH | 独立登录账号、子用户管理与用量配额 |
| 只把指定项目或对话分享给他人 | 工作区白名单与逐会话授权 |
| 集中管理远程访问 | 登录限流、审计日志,以及宿主机自动 HTTPS 或反代部署 |
核心使用流程:主用户创建子账号 → 分配工作区、会话和额度 → 子用户登录并使用获授权的资源。

功能

- 登录认证:首次配置创建主用户;网页与受保护的 API 需要登录,会话 12 小时有效
- HTTPS 部署:宿主机直接部署支持自动申请与续期证书、HTTP 跳转 HTTPS(需公网域名可解析及 80/443 可达);Docker 默认由外层反代提供 HTTPS
- 多租户:一个主用户加任意多个子用户,账号管理全部在 dsh 设置页完成
- 权限与配额:目录白名单(可读取目录 allowedFolders)、逐会话开关、每小时 token 上限、每日时长上限、沙盒三档、上传与下载开关、SSH 与终端开关、封禁
- 会话授权:工作区权限不自动包含其中全部会话,主用户逐会话授予;归档状态在工作区列表与会话列表间保持一致
- 运维视图:主用户可查看全部工作区与会话,下载非敏感普通文件
- 审计与安全:登录限流与锁定、审计日志、SQLite 中用户名及审计敏感字段加密、密码 bcrypt 哈希、登出即吊销会话
- 设置页卡片:远程设置补丁重载、软件更新、账号与权限管理、站内留言,全部中英双语

界面截图

| 账号管理 | 权限与配额 |

| dsh 主界面 · 登录后 | 聊天 / 留言 |

| 登录页 · 浅色 | 登录页 · 深色 | 登录页 · English |

快速开始

前置条件

- Docker:需要 Docker Engine 或 Docker Desktop 和一个 DeepSeek API key;镜像内置 DSH,不需要先在宿主机安装 Node.js 或 dsh。
- 宿主机:运行环境需要 Node.js 22.19+(22.x)或 24+、可正常运行的 dsh、git 与 pnpm;一键安装器会检查依赖并按需安装,手动注册插件需要 pnpm。
- DSH 版本:版本门禁接受 >=0.2.1-alpha.1 <0.2.2-0,当前开发依赖与 Docker 默认运行时锁定 0.2.1-alpha.2。通过版本门禁不等于范围内每个版本都已实测,详见版本兼容。

当前发布版本为 2.7.8,Docker 镜像内置 DSH 0.2.1-alpha.2;源码检出以 package.json 为准。

推荐:Docker 本地试用

先启动容器,再通过浏览器创建主用户。以下多行命令适用于 bash,请将两个密钥占位值替换为自己的值:

docker run -d \
--name dsh-passwords \
--restart unless-stopped \
-e DEEPSEEK_API_KEY=sk-你的key \
-e SETUP_KEY=自己设定的强随机串 \
-p 127.0.0.1:3088:3088 \
-v dsh-home:/data/dsh \
-v dsh-passwords-state:/data/dsh-passwords \
skywalker237234/dsh-passwords:2.7.8

Windows PowerShell 可使用同一条命令的一行形式:

docker run -d --name dsh-passwords --restart unless-stopped -e "DEEPSEEK_API_KEY=sk-你的key" -e "SETUP_KEY=自己设定的强随机串" -p 127.0.0.1:3088:3088 -v dsh-home:/data/dsh -v dsh-passwords-state:/data/dsh-passwords skywalker237234/dsh-passwords:2.7.8

在运行 Docker 的机器上打开 http://127.0.0.1:3088,输入你设置的 SETUP_KEY 创建主用户,此后使用账号密码登录。这个地址只在 Docker 宿主机本机可访问;若容器运行在远程服务器上,请通过 SSH 端口转发访问,或配置 nginx / Caddy 的 HTTPS 反代。

省略 -e SETUP_KEY 时,容器会生成随机密钥;首次配置前用下面的命令读取,配置成功后该文件自动删除:

docker exec dsh-passwords cat /data/dsh-passwords/setup-key.txt
新数据卷首次初始化会把传入的 SETUP_KEY 写入卷内 .env;改变该环境变量不会重建已有账号,Docker 运行时仍按下方的环境变量优先级取值。容器默认监听 0.0.0.0:3088,上面的端口映射只向宿主机回环地址发布;公网 HTTPS 由外层反代提供。

2.7.8 镜像内置 DSH 0.2.1-alpha.2,验收记录见 v2.7.8 发布说明。部署后确认 /gateway/healthz、/gateway/readyz 返回 ok:true,并实际登录验证子账号授权;健康检查不能代替权限验收。

Docker 进阶配置与数据目录

- 自定义端口、域名或第三方端点时,可复制 docker/.env.example 为 docker/.env,通过 --env-file docker/.env 传入。Compose 可使用 docker compose --env-file docker/.env -f docker/docker-compose.yml up -d。
- Docker 使用容器专用模板。根目录 .env.example 用于宿主安装,其端口、TLS 与数据库路径默认值不同,不能直接作为容器的 --env-file。
- 公网反代时建议设置 MCP_GATEWAY_PUBLIC_HOST 为实际访问的域名;外层反代需要保留外部 Host 并支持 WebSocket。
- dsh-home 保存 DSH profile;dsh-passwords-state 保存 .env、数据库与相关状态。两个卷应持久保留,清理方式见卸载。
- 分容器部署时给 dsh 容器加 MCP_DSH_PATCH_ALLOW_BIND_ALL=1;DSH 0.2.1-alpha.2 的 dsh-web-app 仍需要该补丁才能绑定 0.0.0.0。

宿主机安装

安装器会完成依赖安装、编译、生成或补齐缺失密钥、注册插件与应用补丁,并沿用已有配置。以下入口任选一个;不要另外执行目录网站可能提供的 dsh plugin add,本项目需要安装器或手动注册脚本精确注册。

1. Linux / macOS 一键安装

curl -fsSL https://raw.githubusercontent.com/slywalker2006/dsh-passwords/main/install.sh | sudo bash

下载式安装默认使用 /opt/dsh-passwords;非 root 运行时默认改用 $HOME/dsh-passwords(/opt 需要 root),两种情况都可用 DSH_PASSWORDS_DIR 指定可写目录。识别到已有安装时会就地重跑。

2. 从 Git 仓库安装

git clone https://github.com/slywalker2006/dsh-passwords && cd dsh-passwords
sudo bash install.sh

此入口使用当前源码目录,适合长期维护配置与数据。

3. npm 全局安装或升级

首次安装:

npm install -g dsh-passwords@2.7.8
sudo dsh-passwords install

Windows 省略 sudo。从更早版本升级时,更新全局包后重跑 dsh-passwords install 注册插件并应用补丁;已有 .env 与数据库不会被覆盖。

npm 全局目录会随包升级替换。长期部署应将 DSH_PASSWORDS_ENV_FILE 指向稳定位置,或使用 Git 安装方式。nvm / Homebrew 的 Node 可能不在 sudo 的 PATH 中。

4. Windows 安装器

下载仓库里的 install.bat 双击运行。下载式安装默认使用 %USERPROFILE%\dsh-passwords。

宿主机首次安装或补齐缺失密钥时会打印 SETUP_KEY,并保存到安装目录的 setup-key.txt;重复安装沿用已有密钥,不会再次打印。随后按下面的首次配置流程创建账号。

首次配置

1. 宿主机用户启动 dsh:dsh web;Docker 内的 dsh 随容器自动启动。
2. 按部署方式打开网关地址,首次访问进入配置页:

| 部署方式 | 浏览器访问地址 |
| 宿主机自动 HTTPS | 启动日志打印的公网 HTTPS 地址,默认 https://<公网IP>.sslip.io,或你配置的域名 |
| Docker 本机试用 | Docker 宿主机上的 http://127.0.0.1:3088 |
| nginx / Caddy 等反代 | 外层反代配置的 HTTPS 域名 |
| 显式 HTTP 模式 | 启动时选择的监听地址与端口;脚本默认 http://127.0.0.1:8080 |

3. 输入 SETUP_KEY 创建主用户,此后使用账号密码登录。
4. 在设置页创建子账号、授予工作区与会话权限,并用子账号验证实际访问范围。

首次配置成功后,标准流程会删除 setup-key.txt 并轮换 .env 中的 SETUP_KEY。会话、内部接口与数据库加密密钥按现有配置保留;自定义部署应确认 .env 可写,并将 .env 与数据库一并备份。

卸载

宿主机安装可在 dsh-passwords 安装目录执行:

node dist/cli.js uninstall
全局 npm 安装也可直接执行: dsh-passwords uninstall

该命令只从 DSH web profile 移除 dsh-passwords 的 link 与 bundle,并回滚本插件管理的 dsh 补丁;其他插件和 bundle 会保留。完成后按提示重启 dsh-web。

卸载不会删除安装目录、.env、数据库、TLS/ACME 证书或其他插件。profile 依赖重建或补丁回滚失败时会恢复原 profile,避免留下半卸载状态。Docker 部署请按所用 Compose 或容器编排停止并移除容器;不要删除命名卷,除非也要永久清除数据。
Docker 内的「保命技能」不会自删容器。确需永久清除所有容器数据时,Compose 可执行 docker compose down -v;上面的 docker run 部署可先执行 docker rm -f dsh-passwords,再执行 docker volume rm dsh-home dsh-passwords-state。这些操作会删除数据卷,执行前请备份。

自动 HTTPS

此节适用于宿主机直接部署;Docker 默认使用 HTTP,由外层反代提供 HTTPS。

默认探测公网 IP,使用 <IP>.sslip.io 域名向 Let's Encrypt 申请证书;有自己的域名时在 .env 设置 MCP_GATEWAY_DOMAIN。需要 DNS 正确解析、外部可访问 80/443,且这些端口未被其他服务占用。程序读取证书的实际到期时间,每天检查一次,在剩余有效期不超过 30 天时尝试续期并热加载。签发失败拒绝启动;续期失败时继续使用仍有效的旧证书并后台重试。

| 错误码 | 含义 | 处理 |
| 30 | 证书签发失败 | 检查 80/443 放行与占用情况,确认能连通 Let's Encrypt |
| 31 | 拿不到公网 IP 或域名 | 设置 MCP_GATEWAY_DOMAIN,或使用 HTTP 模式 |
| 32 | 端口被占用 | 更换 MCP_GATEWAY_PORT 或释放端口 |

本项目的自动签发流程申请的是域名证书,默认域名为 <IP>.sslip.io。请访问启动日志中的 HTTPS 地址;直接访问裸 IP 的 HTTPS 地址可能出现主机名不匹配。默认 80 端口入口会跳转到证书对应的域名。

部署拓扑

| 场景 | 做法 |
| 公网宿主机,DNS 与 80/443 可达 | 使用自动 HTTPS,访问日志中打印的域名 |
| 已有域名证书 | .env 填 MCP_GATEWAY_TLS_CERT / MCP_GATEWAY_TLS_KEY,无需 80 端口 |
| 已有 nginx / Caddy 反代 | 宿主网关设 MCP_GATEWAY_AUTO_TLS=0、MCP_GATEWAY_HOST=127.0.0.1、MCP_GATEWAY_PORT=8080;反代提供 HTTPS、保留外部 Host 并转发 WebSocket |
| Docker 公网部署 | 容器内默认 0.0.0.0:3088,宿主映射到 127.0.0.1:3088,由 nginx / Caddy 提供 HTTPS |
| Cloudflare Tunnel | Tunnel 指向本机网关 HTTP 端口,由公网入口提供 HTTPS;若使用 Cloudflare 普通代理,另行配置源站 TLS |
| 本地或受信内网,无自动签发条件 | 显式使用 HTTP 模式,按需要设置监听地址 |

自动签发使用 http-01 验证,签发与续期期间 80 端口需要从外部可达。

HTTP 模式

宿主机默认启用自动 HTTPS;Docker 默认在容器内使用 HTTP,由外层反代负责公网 HTTPS。宿主机本地或受信内网需要 HTTP 时,可显式启动:

node scripts/start-http.mjs [端口] [监听地址] # 默认 127.0.0.1:8080,需确认提示

或在 .env 写入 MCP_GATEWAY_AUTO_TLS=0、MCP_GATEWAY_PORT=8080 与 MCP_GATEWAY_HOST=127.0.0.1,由 dsh 启动时拉起网关。需要内网其他机器访问时,再显式选择相应监听地址;HTTP 传输不加密,公网入口应提供 HTTPS。

HTTP 模式不依赖公网 IP、DNS、ACME 或外部 CDN;首次安装仍需 npm/GitHub 可访问,或提前准备项目包、依赖缓存与本地 DSH。模型对话仍需配置模型提供方(例如 DEEPSEEK_API_KEY);没有可用模型服务时,登录、权限、文件与管理功能可运行,但不会产生模型回复。

设置页卡片

登录后打开设置,能看到「dsh-passwords · 密码门」卡片。

| 功能 | 使用者 | 说明 |
| 重载补丁 | 仅主用户 | dsh 升级后设置页异常时一键重打补丁并重启网页服务 |
| 软件更新 | 状态所有人可见,操作仅主用户 | 自动检查、限速下载、空闲后安装重启,详见下节 |
| 修改密码 / 用户名 | 本人;主用户可操作任何人 | 改密后旧会话全部失效 |
| 子用户管理 | 仅主用户 | 创建、删除子用户 |
| 子用户权限 | 仅主用户 | 目录白名单(可读取目录,用受限目录浏览器分配)、逐会话授权、token 与时长上限、沙盒、上传下载开关、SSH 与终端开关(默认关闭,主用户显式授权,撤销即时生效)、WebSocket 路径授权、封禁 |
| 聊天 / 留言 | 所有登录用户 | 支持标签;子用户消息默认私信主用户,仅主用户可广播 |
| 退出登录 | 所有登录用户 | 登出当前账号 |

子用户目录权限:目录范围唯一由「可读取目录」(allowedFolders)决定,主用户通过受限目录浏览器为子用户分配。该浏览器只在配置的浏览起点内逐级浏览,起点来自 MCP_GATEWAY_DIRECTORY_PICKER_ROOTS,未配置时默认用户家目录,全盘根永不作为起点,绝不从整机根枚举。白名单内的目录即可读;开启「新建工作区权限」后,同一批可读目录也是创建范围,子用户可在其中新建文件夹并将本人新建文件夹登记为工作区;白名单外不可读,也无法创建。空数组(「所有目录」)沿用既有「不限目录」语义;需要禁止所有目录时使用 ['__deny__'] 哨兵。关闭「新建工作区权限」只禁止创建,保留可读范围。路径校验同时检查词法路径与真实路径,拒绝符号链接逃逸和其他子用户的工作区子树。

密码要求:至少 12 位,含大写、小写、数字、符号。

软件更新

- 版本发现走 GitHub Release,包始终从 npm registry 下载并按 dist.integrity 的 sha512 校验
- 自动模式:每 24 小时检查,发现新版本后限速下载,平台连续空闲 1 小时后安装重启;主用户可手动跳过等待
- 手动模式:检查只发现版本,第一次点击触发下载,第二次点击安装重启
- 安装保留 .env、data/、数据库、TLS 与 profile,失败自动回滚
- Docker 更新需显式配置 MCP_DSH_DOCKER_SELF_UPDATE=1 与 Compose 相关变量,未配置时只显示宿主机手动命令;Docker socket 等同授予容器宿主控制权限,仅在可信部署启用

配置参考

| 变量 | 默认 | 说明 |
| SETUP_KEY | 安装脚本生成(Docker 可用 -e SETUP_KEY 指定) | 首次配置密钥,配置成功后自动轮换 |
| MCP_JWT_SECRET | 从 SETUP_KEY 派生 | 会话签名密钥,生产环境建议 openssl rand -hex 32 独立设置 |
| MCP_INTERNAL_SECRET | 从 SETUP_KEY 派生 | 网关内部管理接口密钥(dsh 插件通知网关用),与 JWT 域分离派生;显式设置后不要随意更换 |
| MCP_DB_PATH | 宿主 ./data/platform.db;Docker /data/dsh-passwords/platform.db | SQLite 数据库路径;相对路径锚定 .env 所在目录(DSH_PASSWORDS_ENV_FILE 指向的目录),而非进程工作目录 |
| MCP_DB_ENC_KEY | 安装器生成;手动留空时使用 SETUP_KEY 作为主密钥派生 | 用户名及审计敏感字段的加密密钥;没有自动密钥迁移,不能直接替换。数据库与密钥需配套备份,并分别保护 |
| MCP_GATEWAY_HOST / MCP_GATEWAY_PORT | 0.0.0.0 / 宿主自动 HTTPS 443、HTTP 模式 8080、Docker 3088 | 网关监听地址与端口;Docker 默认 0.0.0.0:3088,示例通过宿主端口映射限制为 127.0.0.1:3088;宿主 HTTP 反代需显式设回环地址 |
| MCP_GATEWAY_UPSTREAM | http://127.0.0.1:3080 | dsh 网页地址,插件自动指向 |
| MCP_GATEWAY_UPSTREAM_TLS_VERIFY | 开 | 上游 dsh 为 HTTPS/WSS 时校验其证书;0 关闭(仅调试,勿用于生产) |
| MCP_GATEWAY_SSH_ENDPOINTS | 空 | 登记 DSH 运行时未暴露的传统 HTTP/WS 端点;格式与权限见端点登记说明。 |
| MCP_GATEWAY_REDIRECT_PORT | 自动 HTTPS 时 80;关闭自动 HTTPS 时不监听 | ACME 验证与 301 跳转端口;显式 0 关闭 |
| MCP_GATEWAY_DOMAIN | 空 | 自定义域名,留空用 <公网IP>.sslip.io |
| MCP_GATEWAY_AUTO_TLS | 宿主机开;Docker 镜像默认 0 | 0 关闭自动 HTTPS(容器内默认 HTTP,由外层反代提供 HTTPS) |
| MCP_GATEWAY_TLS_CERT / MCP_GATEWAY_TLS_KEY | 空 | 自有证书,优先于自动 HTTPS |
| MCP_GATEWAY_PUBLIC_HOST | 空 | 固定跳转地址,防 Host 伪造 |
| MCP_GATEWAY_ACME_EMAIL / MCP_GATEWAY_ACME_STAGING | 空 / 关 | 证书提醒邮箱 / LE 测试环境 |
| 高级调优 | 内置默认值已针对普通安装验证;运维覆盖项见 docs/advanced-tuning.md,普通用户无需填写 |
| MCP_DSH_ROOT | 自动探测 | dsh 安装目录 |
| MCP_DSH_SETTINGS_FILE | 自动探测 | dsh settings.yaml 路径,网关与 dsh 不在同一台机器时显式指定;留空按 DSH_HOME/settings.yaml 等候选位置探测 |
| MCP_DSH_RESTART_SERVICE | Linux dsh-web;Windows 空 | 重载补丁后的 systemd 服务名;Windows 自动更新安装后需手动重启 DeepSeek Harness |
| MCP_DSH_AUTO_UPDATE | 开 | 部署级自动更新总开关 |
| MCP_DSH_UPDATE_MAX_BPS | 1MiB/s | 自动下载限速,只能调低 |
| MCP_DSH_DOCKER_SELF_UPDATE / _COMPOSE_DIR / _COMPOSE_FILE / _IMAGE / _SOCKET | 关 / 空 | Docker 应用内更新的启用开关与 Compose 配置 |
| MCP_DSH_PATCH_ALLOW_BIND_ALL | 关 | 分容器拓扑允许 dsh web 绑定 0.0.0.0(0.2.1-alpha.2 的 dsh-web-app 仍未原生放行,仍需该子补丁) |
| DSH_PASSWORDS_ENV_FILE | 空 | 手动指定 .env 路径 |

环境变量与 .env 的优先级按安装方式不同:Docker 内以容器环境变量(--env-file docker/.env)优先于卷内 .env;宿主安装相反,部署 .env 中的托管键优先于进程中继承的同名环境变量。Docker 的 SETUP_KEY 同样遵循运行时环境变量优先级;首次配置后使用账号密码登录,改变该变量不会重建账号。

高级 Remote mux、网关超时和 inventory 覆盖项的默认值与兼容解析见 docs/advanced-tuning.md。普通用户无需配置这些变量;已有部署中的覆盖值仍会读取,不会被自动改写。

常用命令

node dist/cli.js audit --limit 20 # 最近 20 条审计日志
node dist/cli.js patch status # 远程设置补丁状态
node dist/cli.js patch # 重载补丁并重启 dsh-web
node dist/cli.js serve-gateway --port 9000 # 只更改端口,TLS 模式仍由配置决定
DSH_PASSWORDS_NO_AUTOSTART=1 dsh web # 禁止网关自动拉起
curl -s https://地址/gateway/healthz # 存活检查
curl -s https://地址/gateway/readyz # 就绪检查,含数据库

常见问题

登录页一直显示首次配置

用户表为空,按提示输入 SETUP_KEY 重建主用户。

忘记主用户密码

停服后删除 users 表并重启:

node -e "const {DatabaseSync}=require('node:sqlite');const db=new DatabaseSync('data/platform.db');db.exec('DELETE FROM users;')"

错误码 30 / 31 / 32

见「自动 HTTPS」一节的错误码表。

非 root 绑定 443 失败

Linux 下 1024 以下端口需要 root,改用 MCP_GATEWAY_PORT 高位端口并自行做端口转发。非 root 首次安装还须显式关闭自动 HTTPS(MCP_GATEWAY_AUTO_TLS=0)或提供自管证书,否则安装器会要求 root;下载式安装的默认目录会从 /opt 改到 $HOME/dsh-passwords,也可用 DSH_PASSWORDS_DIR 指向其它可写目录。

dsh 报 duplicate loader entry id

dsh plugin add 会把所有声明 bundle 的依赖加入 bundles 层导致冲突。卸载后改用 node scripts/register-plugin.mjs 精确注册。

数据库文件泄露是否有风险

仍有风险。密码保存为 bcrypt 哈希,用户名及审计的 IP、User-Agent、详情等字段加密;留言正文、部分权限配置和工作区路径等内容不属于这项字段加密保护。密码哈希也可能被离线猜测。请分别保护数据库和 .env 密钥,并在备份时保留相匹配的版本。

能否更换 MCP_DB_ENC_KEY

当前没有自动密钥迁移功能,不能直接替换生效的密钥,否则历史加密字段将无法解密。手动配置且尚未完成首次配置时,留空的加密主密钥来自 SETUP_KEY,此时也不要直接更换 SETUP_KEY。

加载插件慢 / 访问慢

网关为内容哈希匹配的静态资源设置一年期 immutable 缓存,减少重复下载;实际速度取决于资源大小、服务器负载与网络。排查时可先测量 TLS 握手时间:

curl -so /dev/null -w "TLS:%{time_appconnect}s\n" https://地址/gateway/login

再结合浏览器网络面板中的资源耗时、服务器日志与 DSH 上游响应时间定位瓶颈。

手动安装

手动安装适用于已准备好 Node.js、兼容 DSH、git 与 pnpm 的用户。源码插件版本以 package.json 为准;DSH 版本要求见版本兼容。使用下面的精确注册脚本,不额外执行 dsh plugin add。

1. git clone https://github.com/slywalker2006/dsh-passwords && cd dsh-passwords
2. npm install && npm run build
3. cp .env.example .env,把 SETUP_KEY 改为 openssl rand -hex 24 生成的随机串
4. node scripts/register-plugin.mjs 注册插件
5. node dist/cli.js patch 应用补丁,找不到 dsh 目录时用 MCP_DSH_ROOT 指定

之后启动 dsh,网关自动拉起,按「首次配置」完成初始化。

安全与隐私

账号密码只存 bcrypt 哈希;用户名及审计的 IP、User-Agent、详情等字段加密落盘。此处是字段加密,不是整个 SQLite 文件加密;工作区、DSH 会话文件与其他磁盘数据也不因此自动加密。宿主机启用自动 HTTPS 时,首次证书签发失败会拒绝启动。

- 连续失败锁定按轮次退避,1 到 60 分钟封顶;主用户不受多 IP 轮换的全局锁死影响
- 同一 IP 15 分钟内 30 次失败触发 IP 级节流 30 分钟,应对跨用户名密码喷洒
- 登出即服务端吊销 token;改密、改名后全部旧会话失效
- 第三方插件运维面端点仅主用户可用;SSH 与终端能力默认关闭,需主用户显式授权(撤销即时生效);上传与下载按权限门控,新子用户默认禁用下载
- 请求超时与并发连接上限抵御 slowloris;路径归一化拦截 %2f、双重编码等变体
- 首次配置成功后自动删除 setup-key.txt 并固化独立密钥变量

语言

界面中英双语,跟随 dsh 语言设置。登录页右上角可手动切换并持久化,CLI 跟随 LANG / LC_ALL。

版本兼容

| 项目 | 版本与验证范围 |
| 已发布 Docker 镜像 | 2.7.8 + DSH 0.2.1-alpha.2 |
| npm / 源码安装 | npm 使用指定包版本,源码安装使用检出版本;升级步骤见宿主机安装 |
| 从 2.7.7 升级 | 更新全局包或源码检出后重跑安装器并重启 dsh;.env、数据库与 DSH profile 均保留 |
| DSH 版本门禁 | >=0.2.1-alpha.1 <0.2.2-0:接受 alpha.1 起的 0.2.1 预发布与稳定版,拒绝 0.1.x、0.2.0、0.2.1-alpha.0 与 0.2.2+ |
| 开发与 Docker 默认 DSH 基线 | 锁定 0.2.1-alpha.2;范围内其他版本通过门禁不等于已完成部署验收,升级前需验证登录、授权、文件与插件流程 |

参与贡献

- 提交问题前请阅读 社区规范清单,并使用 问题模板 或 功能模板
- 代码贡献请阅读 CONTRIBUTING.md,使用 PR 模板,保持改动聚焦并附测试证据
- 提交前跑 npm ci --include=optional && npm run build && node --import tsx --test "test/*/.test.ts"(需先构建),CI 会在 Node 22/24 上自动执行

贡献者

觉得有用就点个 Star。

报告问题 · 查看 Releases · npm 包 · Awesome 收录

License

GNU GPL v3.0 only,完整文本见 LICENSE。

本项目是 dsh 的独立扩展,与 DeepSeek 无隶属关系。
预览分享卡片长什么样 ↓slywalker2006/dsh-passwords
分享 · DeepSeek Harness Hub
slywalker2006/dsh-passwords

让多人远程共用 DeepSeek Harness,按账号管理工作区、会话和用量账号登录 · 工作区与会话授权 ·…

回到顶部