toby-bridges/api-relay-audit
toby-bridges/api-relay-audit从 DeepSeek Harness 对 AI API 中转站和 LLM 代理运行本地安全审计,生成 Markdown 报告,覆盖提示词注入、模型替换信号、工具调用改写、错误泄漏、流完整性和按 profile 启用的 Web3 风险。
English | 简体中文
让多人远程共用 DeepSeek Harness,按账号管理工作区、会话和用量 账号登录 · 工作区与会话授权 · 用量配额 · 审计日志 · 中英双语
适用场景 · 功能 · 快速开始 · 首次配置 · 卸载 · 自动 HTTPS · 部署拓扑 · 配置参考 · 常见问题 · 安全与隐私 · 参与贡献
你想做什么 · dsh-passwords 提供什么 小团队共用服务器上的 DSH · 独立登录账号、子用户管理与用量配额 只把指定项目或对话分享给他人 · 工作区白名单与逐会话授权 集中管理远程访问 · 登录限流、审计日志,以及宿主机自动 HTTPS 或反代部署
核心使用流程:主用户创建子账号 → 分配工作区、会话和额度 → 子用户登录并使用获授权的资源。
allowedFolders)、逐会话开关、每小时 token 上限、每日时长上限、沙盒三档、上传与下载开关、SSH 与终端开关、封禁账号管理 · 权限与配额 ·
dsh 主界面 · 登录后 · 聊天 / 留言 ·
登录页 · 浅色 · 登录页 · 深色 · 登录页 · English · ·
>=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 为准。
先启动容器,再通过浏览器创建主用户。以下多行命令适用于 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.8Windows 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。.env.example 用于宿主安装,其端口、TLS 与数据库路径默认值不同,不能直接作为容器的 --env-file。MCP_GATEWAY_PUBLIC_HOST 为实际访问的域名;外层反代需要保留外部 Host 并支持 WebSocket。dsh-home 保存 DSH profile;dsh-passwords-state 保存 .env、数据库与相关状态。两个卷应持久保留,清理方式见卸载。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 installWindows 省略 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;重复安装沿用已有密钥,不会再次打印。随后按下面的首次配置流程创建账号。
dsh web;Docker 内的 dsh 随容器自动启动。部署方式 · 浏览器访问地址 宿主机自动 HTTPS · 启动日志打印的公网 HTTPS 地址,默认 https://.sslip.io,或你配置的域名 Docker 本机试用 · Docker 宿主机上的 http://127.0.0.1:3088 nginx / Caddy 等反代 · 外层反代配置的 HTTPS 域名 显式 HTTP 模式 · 启动时选择的监听地址与端口;脚本默认 http://127.0.0.1:8080
SETUP_KEY 创建主用户,此后使用账号密码登录。首次配置成功后,标准流程会删除 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。这些操作会删除数据卷,执行前请备份。
此节适用于宿主机直接部署;Docker 默认使用 HTTP,由外层反代提供 HTTPS。
默认探测公网 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 或释放端口
本项目的自动签发流程申请的是域名证书,默认域名为 .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 端口需要从外部可达。
宿主机默认启用自动 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 位,含大写、小写、数字、符号。
dist.integrity 的 sha512 校验.env、data/、数据库、TLS 与 profile,失败自动回滚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 · 空 · 自定义域名,留空用 .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 同样遵循运行时环境变量优先级;首次配置后使用账号密码登录,改变该变量不会重建账号。