deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
为 DeepSeek Harness(DSH)Web 端增加多用户门户的零依赖 Node 网关:登录认证、每用户独立 DSH 实例与 OS 级数据隔离、每用户独立 API Key,以及内置的交付文件抽屉(下载 / 上传 / 当前工作区自动定位)。
部署定位(重要):本项目是服务器端部署方案——网关、每用户 DSH 实例与文件助手全部运行在远程服务器上,多个用户通过浏览器(公网域名 + HTTPS)访问各自的会话与交付文件;它不是本机 / 桌面工具,无需在用户电脑上安装任何软件。文档中的示例路径(如
/opt/deepseek-harness、/etc/systemd/system)均为服务器端路径。
dsh-<name> 运行,DSH_HOME 指向其 0700 私有目录;userctl.js 一条命令完成建号 / 改密 / 删号 / 预置 Key。/setup 填写,经回环 RPC 写入该用户私有的 .credentials.yaml(0600,属主仅本人)。Host: 127.0.0.1:<port> 并剥离浏览器信任标记,DSH 钉在回环的 settings / credentials / agentPreset 等特权接口在公网访问下同样可用。.credentials.yaml)不可下载;SPA 注入尊重 prefers-reduced-motion、无玻璃拟态/渐变装饰。浏览器 ──https──▶ 反向代理(TLS, 例: OpenResty) ──▶ dsh-gateway(:3081) ──▶ 每用户 DSH 实例(:3101+)
│ │
│ 会话/限流/CSRF/路由 │ 以独立 OS 账号 dsh-<name> 运行
│ Key 引导/抽屉注入 │ DSH_HOME=<用户私有目录 0700>
└──────────┬──────────┘
└─ 文件访问走 sudo 助手: dsh-file-{list,stat,read,put}
gateway/ # 网关本体(零依赖 Node)
server.js # 登录/会话/限流/CSRF/反代/SPA注入/文件抽屉/上传下载接口
auth.js # scrypt + APR1 口令校验
credentials.js # .credentials.yaml 读写(仅 userctl 使用)
userctl.js # 用户管理:OS 账号/端口/实例/Key
_smoke.js # 网关冒烟测试(本地即可运行,无需 DSH)
static/ # 登录前可访问的静态资源(manifest/favicon)
bin/ # 主机端入口与 root 助手
dsh-users.sh # userctl 的 sudo 入口
dsh-file-{list,stat,read,put}[.js]
units/ # systemd 单元模板(网关 + 每用户实例由 userctl 生成)
nginx/ # TLS 反向代理示例配置(已占位化域名)
安装 DSH(npm 包)并准备 Node 运行时;按 units/ 配置网关 systemd 服务(User=<服务账号>,仅监听 127.0.0.1)。
用 sudo bin/dsh-users.sh add <用户> 建号(自动创建 OS 账号、分配端口、生成并启动实例)。
安装 root 助手并配置 sudoers(固定路径白名单):
install -o root -g root -m 0755 bin/dsh-file-* /opt/deepseek-harness/bin/
# /etc/sudoers.d/dsh-upload:
# <服务账号> ALL=(root) NOPASSWD: /opt/deepseek-harness/bin/dsh-file-put, /opt/deepseek-harness/bin/dsh-file-stat, /opt/deepseek-harness/bin/dsh-file-read, /opt/deepseek-harness/bin/dsh-file-list
按 nginx/dsh-https-1145.conf 配置 TLS 反向代理(替换 server_name 为你的域名并挂证书)。
登录后首次使用会引导填写 DeepSeek API Key(仅写入用户私有目录)。
环境变量:网关与 userctl 均支持
USERS_FILE/SECRET_FILE/USERS_DIR/DEEPSEEK_BASE_URL/UPLOAD_MAX_MB等覆盖;userctl 还需DSH_TRUSTED_HOST(实例--trusted-host,示例默认127.0.0.1:1145)。
session.history(打开会话)与 session.list(每会话含 cwd),记住当前对话目录并持久化到 state-cwd.json;打开「交付文件」即列出该目录(目录失效自动回退工作区)。X-Frame-Options: SAMEORIGIN);页面内「返回应用」运行时检测 iframe 环境,发 postMessage('dshgw-close') 关闭抽屉而非导航,杜绝嵌套打开。POST /__gw/upload?dir=&name=,root 助手落盘并把属主转给 dsh-<name>(chown --reference),同名覆盖,超限 413。bin/ 目录必须保持 root:root 权限,否则服务账号可替换助手脚本提权。assertOwnerOnly)。本网关的 root 助手模型天然满足,不要给用户目录添加任何 ACL 读取授权(曾因此触发实例拒绝启动)。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。