dsh-plugin-login-gate:为 DeepSeek Harness 增加密码登录与 HTTPS 反向代理

前言

DeepSeek Harness (dsh) 的 Web UI 默认没有登录页,且仅允许回环地址访问。当需要将 dsh 暴露给局域网或其他设备时,直接访问存在安全隐患。本插件在 dsh 前置一道密码登录闸门,并提供 HTTPS 反向代理功能,同时修复了局域网跨设备访问时的部分已知问题。

核心功能

  • 密码登录:支持单密码场景,密码文件明文存储,修改即时生效。
  • HTTPS 自签:使用自签证书加密传输,浏览器提示后可继续访问(与常见 NAS 体验一致)。
  • 协议跳转:输入 IP:端口 访问 http 时自动跳转至 https。
  • 会话安全:使用 httpOnly Cookie,会话存储于内存,浏览器关闭即失效。
  • 流式能力:完整转发 SSE / WebSocket,不影响 dsh 的实时输出与会话列表。
  • 同端口双协议:单一端口同时处理 HTTP 跳转与 HTTPS 服务。
  • 零依赖:仅依赖 peer 依赖 @deepseek-ai/cordis,无运行时 npm 依赖。

安装与启用

安装过程涉及获取插件、注册配置、生成证书及设置密码。

  1. 获取插件
    克隆仓库到本地,或下载 zip 解压。
    git clone https://github.com/Wayne036/dsh-plugin-login-gate.git
将插件目录放入 dsh 可访问的位置。
  1. 注册到 profile
    编辑 dsh 的 cordis.patch.yml(如 ~/.dsh/profiles/web/cordis.patch.yml),追加配置。若插件未安装到 node_modules,可将 name 指向插件目录的绝对路径。
    - insert:
        - id: login-gate
          name: 'dsh-plugin-login-gate'
          config:
            port: 3081
            passwordFile: 'C:/dsh/login-gate/password.txt'
            certFile: 'C:/dsh/login-gate/cert.pem'
            keyFile: 'C:/dsh/login-gate/key.pem'
            assetsDir: 'C:/dsh/login-gate/assets'
  1. 生成证书
    使用 openssl 生成自签证书(有效期 10 年)。
    openssl req -x509 -newkey rsa:2048 \
      -keyout key.pem -out cert.pem -days 3650 -nodes \
      -subj "/CN=DeepSeek-Harness-Login" \
      -addext "subjectAltName=IP:127.0.0.1,DNS:localhost,IP:<你的局域网IP>"
  1. 设置密码
    创建密码文件,内容为登录密码(明文)。
    echo '你的密码' > C:/dsh/login-gate/password.txt
  1. 配置 pnpm-workspace(安装依赖时可能需要)
    若安装依赖 node-pty(dsh 终端能力)时遇到构建脚本被拦截的问题,在 dsh profile 目录下创建或编辑 pnpm-workspace.yaml,放行构建脚本。
    allowBuilds:
      node-pty: true
  1. 重启 dsh
    重启 dsh Web UI,浏览器访问 http://<IP>:<port>,应自动跳转至 https 登录页。

配置项

键 必填 默认 说明
host 否 0.0.0.0 监听地址
port 否 3081 登录闸门入口端口
targetHost 否 127.0.0.1 转发目标地址
targetPort 否 3080 dsh Web UI 端口
passwordFile 是 - 密码文件路径(明文)
certFile 是 - TLS 证书 PEM 路径
keyFile 是 - TLS 私钥 PEM 路径
assetsDir 否 包内 assets/ 登录页素材目录
maxSessions 否 64 最大并发登录会话数
lanPatch 否 false 局域网跨设备访问修复开关

局域网跨设备访问修复

本插件针对局域网访问时的三类已知问题进行了修复。

BUG 1:模型配置页报 HTTP 403

原因:dsh 的信任围栏检查请求头的 Host / Origin,反向代理转发时若携带局域网地址会被拒绝。
修复:插件在代理层自动重写 Host / Origin 为回环地址,无需手动处理。

BUG 2:设置页报 settings are unavailable

原因:浏览器端 isLoopback 判定仅支持 localhost / 127.x,导致设置页镜像使用 memory 持久化。
修复:开启 lanPatch 后,插件会在启动时自动打补丁,将私有网段 IP 判为 isLoopback。此补丁仅修改客户端派生状态,不影响服务端信任围栏。

BUG 3:WebSocket 握手失败

原因:转发 WebSocket 升级时,Upgrade / Connection 头被剥掉,导致 RFC 6455 校验失败,事件流无法建立。
修复:转发 101 响应前自动补回这两个头。

补丁说明

lanPatch 默认关闭。开启后,插件会修改 dsh 的 node_modules 内部文件以打补丁。dsh 更新或重装后补丁会失效,需重新运行:

node node_modules/dsh-plugin-login-gate/patch-dsh-lan.js

安全说明

  • 密码存储:密码以明文形式存储在本地文件中,请确保文件权限仅当前用户可读写。
  • 证书信任:自签证书不被浏览器信任,请勿将此入口暴露到公网,仅限局域网/内网使用。
  • 会话管理:会话存储于内存,dsh 重启后所有设备需重新登录。

已知限制

  • 单密码、无多用户体系。
  • 无登录失败锁定机制。
  • 自签证书 10 年有效期,到期需重新生成。
  • lanPatch 修改 dsh 源码,更新 dsh 后需重打补丁。
羽毛球分组比赛记分
小程序二维码

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

小夜