# 配置与运维 DSH 多用户服务是服务端业务扩展:在公司或团队服务器运行一套 DSH,成员通过浏览器登录,各自管理会话和文件;管理员统一管理账号、能力权限与用量额度。根地址 `/` 为管理员登录入口,`/lan/` 为成员入口。模型、工具插件、Skills、MCP 和 Agent 预设由宿主提供,再按成员授权。宿主凭据保留在服务端。 每个部署使用自己的服务器地址和端口,不连接插件作者的服务器,也不限定为局域网使用。未配置 `memberOrigin` 时,插件从当前主机识别私有 IPv4 地址并沿用 DSH 端口;多网卡、反向代理或自定义域名环境可明确配置 `memberOrigin` 和 `memberAliases`。成员入口为 `http://<本部署局域网IP>:<端口>/lan/`。服务脚本还会生成当前主机的 `.local` 别名,是否可用取决于成员设备的名称解析支持。管理员从服务器自己的 DSH 界面复制成员入口并分发账号。当前默认仍为 HTTP,成员设备无需安装证书;传输加密风险仍保留。 通过域名或反向代理提供服务时,按实际 HTTP(S) 地址配置 `memberOrigin`,需要额外别名时配置 `memberAliases`。入口可达后仍须使用账号登录,能力和目录范围仍由管理员授权。默认脚本继续使用局域网地址,不会自动开放公网端口。 ## 部署到自己的服务器 插件直接安装到已有 DSH,成员通过浏览器使用。模型、工具、终端、代码执行与沙箱均由 DSH 提供;插件不引入额外执行器、网络代理或系统工具要求。 下面是可选的独立部署脚本,使用 Python 3 和用户级 systemd。它只负责服务托管与定时备份,已有 DSH 部署无需使用,也不要求成员拥有 sudo 权限。 ```sh cd /你自己的插件目录 npm install --ignore-scripts python3 ops/install-service.py dsh-lan ``` 安装脚本会将本地插件接入本机的 `lan` profile,按实际安装目录生成服务;WSL 的 Windows 启动项使用当前发行版、Linux 用户和 home,不包含作者的用户名或路径。命令输出的是此部署的成员地址。`dsh-lan status/stop/restart` 查看、停止或重启同一服务。首次由服务器管理员初始化账号并在共享环境执行隔离检查,再创建成员账号。已有 DSH 部署也可通过原生插件管理器安装此包,按该部署对外提供的地址配置入口;不要把所有者启动 token 分发给成员。 服务器入口必须能从成员所在网络访问;自动发现地址不能代替系统的路由或防火墙设置。直接接入已有 DSH 时,成员入口的主机名应与所有者界面不同,提供的服务脚本已通过回环所有者监听和局域网入口处理这一区分。 插件启用后,服务根地址显示管理员登录页,只接受插件管理员账号密码,普通成员不能进入。登录后打开 `/lan/admin/`;已有有效管理员登录时可直接进入。此页面沿用受角色限制的 DSH 界面,不授予宿主所有者权限。成员仍从 `/lan/` 登录。首次管理员只能从服务器本机已授权的 DSH 界面初始化;本机 DSH 的原生认证保持生效,登录页不提供匿名初始化或所有者 token 交换。 未配置账号默认继承宿主配置。模型、工具、插件、Skills、MCP、Agent/权限预设可设为继承或自定义;自定义空列表表示禁用。终端、文件、附件、任务、子 Agent、交互有独立开关。额外目录由 admin 明确授权,权限变化会停止该账号当前执行资源。 「多用户服务」入口位于 DSH 主侧栏、自动化任务下方。点击后打开独立浮窗,管理员左侧导航为「我的账号、我的能力、成员管理、会话与文件、共享模型、共享环境、品牌外观、用量统计」;普通成员显示「我的账号、我的能力、会话与文件、用量统计」。设置菜单中的旧工作区入口及顶部多层标签已移除。页面采用统一标题、简短说明和内容区,表单沿用官方设置页的左右设置行布局,功能权限使用 DSH 原生开关。 「我的能力」按账号保存个人开关和 Skills、MCP、Agent 预设、工具插件、执行权限预设的选择。管理员授权决定上限,个人偏好只能收窄;未授权项不可自行开启,恢复默认也只使用当前已授权能力。保存时校验版本以避免多页面覆盖,并撤销本人旧执行资源;重新打开会话按新偏好运行。此操作不安装或启停服务器插件、MCP,不修改其他人的选择。 新建账号、邀请成员使用独立浮窗,内容区可滚动,底部保留操作按钮。新建账号分为「账号信息、权限设置」两步;邀请复用同一流程,先填可选显示名,再设置权限。下一步仅校验和切换,最后统一提交;返回上一步保留输入,失败后保留草稿。信息页按内容收缩高度,新建账号的用户名与显示名并排,小屏改为单列。未保存输入关闭时提示确认;邀请生成后显示完整邀请链接与完成按钮,隐藏已提交表单。链接自动填入注册页,令牌随后从地址栏清除;邀请记录可查看状态、撤销和重新签发,重新签发不影响已加入的成员。工作区和账号授权侧栏使用 DSH 原生设置页相同的字号、文字色、间距和选中样式。 两种流程的权限页使用 720px 宽度,模型和授权方式合为一行,能力计数与标题同行,功能行距保持紧凑;信息页保留 840px 宽度,窄屏均受视口宽度约束。 成员授权侧栏分为「基础权限、账号设置」两组,页面为「模型权限、能力权限、用量与并发、目录访问、账号状态、登录安全」。「能力权限」与「我的能力」复用分类标签、原生开关设置行和资源复选列表,内部分类为「功能、技能权限、MCP 服务、Agent 预设、工具插件、执行权限」。各页及分类保留独立配置和未保存草稿;复选项保留原生表单与键盘行为。输入框、下拉框和文本框统一使用可见边框和浅底色,操作按钮显示边框与背景,并保留悬停、焦点和禁用状态。 可将其他成员的模型、能力与目录授权复制到新建、邀请或编辑草稿;身份、角色、密码、状态、额度及个人偏好不会随之复制。「能力权限 → 查看已保存的生效范围」区分管理员授予、个人选择和账号生效值,并说明受限原因。成员列表及成员选择器采用服务端搜索、筛选与分页,保存后保留当前查询。账号更新校验修订号,旧表单不能覆盖新的权限或状态,冲突时保留草稿,显式重新加载后再编辑。 成员在「我的账号 → 修改登录密码」输入原密码及新密码。成功后撤销该账号全部登录并停止原生执行资源,需重新登录。管理员在「账号状态」修改显示名与角色;交接时先提升接任者,再调整原管理员,最后一位启用的管理员不可禁用或降级。角色变更也会撤销旧登录。 成员列表每行通过「管理」编辑或归档账号。归档会撤销登录并停止该账号的执行资源,保留会话、文件、授权和用量;账号从默认列表移入「已归档」。恢复时沿用归档前的启用或停用状态,不自动重启任务。当前登录账号及最后一位启用管理员不可归档。只有已归档账号可永久删除,确认时需输入完整用户名;删除仅移除登录账号,会话、文件及用量继续保留,管理员可在「会话与文件」按已删除账号查看。账号本身无法恢复;同名新账号会分配新的身份和目录,不继承旧数据。 忘记所有插件管理员密码时,在服务器本机打开并通过 DSH 自身授权的原生宿主网页,在插件登录页选择「恢复管理员」,输入现有管理员用户名和新密码并确认。此入口只允许重置现有管理员,不会把成员提升为管理员,也不会删除账号或内容;普通成员入口、根地址的公开登录页与桌面转发入口均不提供此权限。 管理员可在 DSH 原生「插件」页查看宿主可管理的 profile,添加插件、启停和卸载均复用原生管理器及其保护规则。局域网接口逐次校验管理员身份和 CSRF,仅转发已知插件管理方法;普通成员只读取插件清单,不能管理宿主插件。宿主未提供可管理 profile 时仍保留原生不可用状态。 账号编辑中的「用量与并发」可设置并发 Agent 任务数、每日与每月 tokens 上限。留空不限,0 暂停新任务,现有账号默认不限。主 Agent、子 Agent 和计划任务的运行计入并发;tokens 按北京时间自然日/月回读原生日志,包括重试、压缩和子 Agent,已有消息的重复提交保持幂等。设置 token 上限时,相关周期有未知用量或日志不可读会暂停新请求,避免把未知值当作零。到达上限拒绝新请求;正在执行的请求完成后结算,因此最终用量可能超过上限,不预估或强行截断在途请求。修改额度不会撤销现有执行。成员可在「我的账号」页查看自己的额度与周期用量。 admin 在 DSH 主侧栏的「多用户服务 → 会话与文件」统一管理所有账号(含停用账号)的会话和个人目录。先选择成员,再切换会话或文件。会话支持搜索分页、改名、停止、归档与恢复;点击会话名称进入 DSH 原生对话页,点击文件名使用原生文件预览,管理预览期间只读;点击「结束预览」会返回工作区浮窗中的原成员、目录、筛选、分页及滚动位置。文件管理支持新建、上传下载、文本编辑、替换、重命名、移动和确认删除。传输分块进行,管理页文本编辑限 256 KiB,查看能力沿用原生文件预览。已经绑定会话的工作目录保留原位置,可管理其中的文件和子目录。管理员操作复用当前 DSH 原生服务,不因查看而启动目标账号的 Agent;普通成员仍只能访问自己的授权资源。 普通成员复用同一「会话与文件」页面管理本人会话、文件和文件夹,没有成员切换器。服务端将每次操作绑定当前登录账号,拒绝指定其他账号;自己的会话直接进入原生对话,自己的文件采用临时只读预览,结束后返回原管理位置。新建、上传下载、编辑、改名、移动和回收站同样支持自己的文件及文件夹;文件功能被管理员或本人关闭时,文件入口与服务端操作同时禁用,会话管理仍可使用。 会话列表默认隐藏没有消息的空会话,仅显示未归档项;不删除任何会话。通过「高级筛选」可查看全部或仅空会话,并组合运行状态、归档状态、搜索范围、更新日期和排序。搜索支持名称、成员和会话 ID,多个关键词同时匹配。文件页搜索当前目录,支持文件/文件夹类型、扩展名、更新时间及排序;文件夹共用「管理」入口,可打开、重命名、移动、回收和恢复。筛选在服务端分页前完成,切换条件回到第一页;结束原生预览后恢复管理弹窗及本次查询条件、目录和位置。 会话、文件和文件夹列表的「管理」使用按钮旁的 DSH 原生操作菜单,支持键盘、Escape 和点击外部关闭。重命名、移动、新建文件夹和删除确认使用紧凑表单;名称输入框自动聚焦,取消后回到原按钮。文本编辑使用独立编辑窗口,预览返回后焦点回到发起查看的管理按钮。 正常会话右侧的文件列表支持右键菜单,也可在聚焦文件后按 Shift+F10 或菜单键。文件可查看、编辑文本、下载、替换、重命名、移动和移入回收站;文件夹可打开、重命名、移动和移入回收站。操作直接使用现有文件管理弹窗,完成后刷新原列表。二进制文件不提供在线文本编辑;只读预览中仅可查看或打开,不提供写入操作。后端根据当前账号的会话归属解析路径,继续校验权限、文件版本和符号链接。 管理员及成员登录页直接复用「品牌外观」中侧栏预览的 Logo、名称和标签,无需单独配置;保存后重新打开登录页即可生效。标签清空后同步隐藏。 文件预览时,右侧原生文件树显示目标文件所在目录,支持展开子目录和打开文件。目录读取与变更监听使用本次登录的临时只读授权;结束预览后恢复原文件树并停止预览监听,不修改会话的实际工作目录。 文件页高级筛选中的「空文件夹」支持全部显示、隐藏空文件夹和仅空文件夹。空指目录内没有任何项目,隐藏文件和子目录也计入;不沿符号链接检查其他目录。默认隐藏空文件夹;「恢复默认」和「清除条件」同样回到隐藏空文件夹。过滤会同步更新总数与分页。 管理员删除文件或目录会先移入该账号的回收站,可从文件操作栏打开并恢复到原位置;同名目标和符号链接路径会拒绝恢复,保留回收站原件。目录内容与链接一并保留,不沿链接访问外部数据。永久删除有独立确认。回收记录持久化,服务重启后仍可恢复。部分目录树恢复失败时保留原件和已经创建的副本,不覆盖其他文件;移除冲突项后可重试。 ## 已有 DSH 服务接入 在现有 profile 中从市场安装并启用插件后,主服务继续监听本机 `127.0.0.1`。插件中的成员入口与管理员登录均由这一服务提供;下列转发仅把局域网请求送到同一监听端口,不启动另一份 DSH。 填写当前 profile 名称、服务器局域网 IP 和 DSH 启动时显示的端口,在服务器上运行: ```sh profile="你的profile名称" lan_ip="你的局域网IP" dsh_port="你的DSH端口" node "${DSH_HOME:-$HOME/.dsh}/profiles/$profile/node_modules/@sunbigfly/dsh-multi-user-service/ops/relay.mjs" "$lan_ip" "$dsh_port" ``` 保持转发进程运行,或由服务器已有的服务管理器托管。成员访问 `http://局域网IP:端口/lan/`,管理员访问根地址。多网卡时,在插件配置中把 `memberOrigin` 明确设为该局域网地址;需要加密时可使用已有的 HTTPS 反向代理。主机路由和防火墙仍需允许该局域网端口。 ## 备份与还原 升级前保留一份完整备份。`0.3.0` 可读取 `0.1.0` 的账号和邀请,沿用原有 ID、会话及目录;新版本会记录账号修订号和邀请使用状态。回退旧版本时,应配套恢复升级前备份。 `0.4.0` 继续兼容原有账号;执行归档或删除后会新增账号生命周期和历史身份记录,回退 `0.3.x` 时须配套恢复升级前备份。删除账号不清理磁盘数据。 安装或更新服务定义使用 `python3 ops/install-service.py`。定时器每天北京时间 03:35 开始尝试;当 Agent、后台作业、终端或管理上传仍活动时跳过,之后每小时重试,当天成功后跳过。备份先暂停新执行并正常停服务,完成或失败后恢复服务。文件位于项目外 `~/.local/share/dsh-lan-backups/`,目录 0700、备份 0600,保留最近 7 份。 备份包含 `.dsh` 的宿主配置、凭据、账号授权、归属、原生会话和附件,所有已映射个人/旧项目目录,以及服务配置、启动命令和当前插件源码包。依赖、日志与运行时 socket 不打包;还原环境需安装对应版本的 DSH 与插件依赖。共享目录中未纳入个人目录的外部数据需由其所有者另行备份。备份包含凭据,请只在服务器管理员环境保存和使用。 ```sh dsh-lan-backup create dsh-lan-backup verify /备份文件的完整路径.tar.gz dsh-lan-backup restore /备份文件的完整路径.tar.gz --destination "$HOME/dsh-restore-review" ``` `restore` 要求新目录,逐项校验文件清单与 SHA-256,文件在 `scopes/`,`manifest.json` 记录原位置;链接最后创建,不能借链接把提取过程导向外部路径。`plugin/package.tgz` 与可用的依赖锁文件用于核对和恢复同版本插件。 正式回迁须先 `dsh-lan stop`,再显式添加 `--in-place`,并指定一个新的 `--destination`。命令拒绝仍有 DSH 进程的环境;把原目录改名为同级安全副本,复制还原数据,失败时回迁已有副本。安全副本位置记在备份目录的恢复回执中,保留供人工核对;命令不会自行启动服务。确认原位置和插件版本后再运行 `dsh-lan`。验收演练仅回迁合成目录,正式数据保持原位。 admin 可在 DSH 主侧栏的「多用户服务 → 品牌外观」分别设置共享 Logo、侧栏名称、侧栏标签和首页标语,也可取消勾选「显示“预览版”标签」以隐藏首页标签,所有成员统一使用,默认显示。Logo 支持 HTTP(S) 图片地址或上传 SVG、PNG、JPEG、WebP,上传原文件不设字节限制,自动优化到展示所需尺寸并转为展示图片。侧栏组件固定为 24 × 24,首页 Logo 高度最多 34、宽度最多 120,均保持比例、不裁切;名称最多 40 字、标签最多 16 字、标语最多 80 字。侧栏标签清空后隐藏。保存后当前页立即应用,其他页面刷新后同步;点击「使用默认外观」再保存即可恢复 DSH 原生品牌并显示预览版标签。外观单独存储,保存不会停止会话。 沿用宿主原生前端、网关、LLM、工具、问答/审批、Agent、调度器、压缩、统计和导出。插件管理账号、授权、会话归属、文件入口与用量,不替换 DSH 的 sandbox、subprocess、shell 或 PTC 执行器,不额外启动成员网络代理。 会话与文件入口按账号控制访问,管理员可管理成员内容。命令、终端、代码和网络采用 DSH 原生权限与沙箱;工作目录不是系统级成员隔离,脚本可能读取目录之外的文件。共享目录授权用于文件入口和文件工具,命令与脚本仍按所选 DSH 原生策略执行。 ## 发布与兼容 插件当前版本为 `v0.4.1`,已在 **DSH `0.2.1-rc.2`**、Linux/WSL 服务器上验证,其他 DSH 版本尚未验证。需要 Node.js `22+`;成员端只需浏览器。 发布源采用固定提交的 Git 仓库,市场索引以 HTTPS 提供。DSH 插件页刷新索引后可检查更新;兼容读取初版账号和邀请,新增账号修订号与邀请状态;原有会话和文件目录保持。回退旧版本时需配套恢复升级前备份。 ## 验证与恢复 环境为 DSH `0.2.1-rc.2`,5 项直接依赖;发布内容以打包预检为准。 ```sh npm run check DSH_LAN_CONTRACT_MODULES=/path/to/your/dsh/node_modules npm test npm pack --dry-run --json ``` 边界见 [CONTRACT.md](../CONTRACT.md)。开发仓库中的 `ACCEPTANCE.md` 保存具体环境的验收记录,不随插件安装包分发。历史私有归档、运行账号、会话、日志、凭据和本地验收产物也不打入安装包。 产品显示名称为「DSH 多用户服务」,安装包为 `@sunbigfly/dsh-multi-user-service`。旧包 `@sunbigfly/dsh-lan-workspace` 应在原 profile 停用、卸载后再安装新包;独立部署安装脚本会先移除旧包引用再接入新包。存储命名空间、`lan` profile、`dsh-lan` 命令和 `/lan/` 路径保留,账号、会话与文件仍在原位置。 安装包包含「工具权限归属」和「DSH 多用户服务」两个组件。前者在 DSH 工具系统之前记录工具来源,为后者的成员权限判断提供依据;两者共同构成一项多用户服务。