DSH 配置与插件同步:跨设备一致性的声明式备份

前言

在多台机器上使用 DeepSeek Harness(DSH)时,重装插件往往不难,真正费时间的是那些「声明式」状态:调好的模型 provider、插件版本锁定与各插件配置、API 密钥与 MCP 服务定义,以及 profile 里带注释和 !!js 的 cordis patch。手工拷贝目录容易漏项,也无法在冲突时做可控合并。

下面介绍维护者 alfredhuang211 发布的联网工具类插件 dsh-configandplugin-sync(社区目录分类:联网工具)。它把上述配置抽出来,经加密或脱敏后同步到 Git、WebDAV 或 S3 兼容存储;插件源码与 node_modules 永不参与同步,只记录可复现的安装规格。

这是什么

DSH 配置与插件同步(英文名 DSH Config & Plugin Sync)面向「多设备同一套 DSH 工作环境」的场景:在一台设备上采集本机 DSH 状态,写入远端存储;在另一台设备上预览差异后拉取或双向合并。

DSH 生态以「一切皆插件」为思路;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装第三方插件前,宜自行审阅源码与许可证。插件与 DSH Agent 一样,以当前 OS 用户权限运行。

同步范围

会同步的内容

内容 说明
DSH 基础配置 $DSH_HOME/cordis.patch.yml、profiles/<name>/cordis.patch.yml、cordis.yml、package.json;按 entry id 合并,保留注释与 !!js
模型 provider 从 LLM 条目抽取 providers 及 agent-default-model
插件清单 包名、版本、安装来源(npm/git/local-path/tarball/official 等)、启用状态;符合条件的 link: 可识别为 github:owner/repo#<commit>
插件配置 各第三方插件主条目配置;敏感键写入前剔除并标为 redacted
密钥 / 凭据 需口令,加密后同步(默认关闭)
MCP 服务 名称、transport、安装方式、command/args/url、header/env 名称等

不同步

  • 插件代码、node_modules、tarball 本体
  • 纯本地目录插件(link: / file:):仅在设备快照中记来源,restorable: false
  • 会话历史、日志、缓存

存储后端与布局

三种后端共用同一套文档布局,可随时从 Git 迁到 S3 等而无需改数据模型。

后端 典型场景 认证 并发
Git 要版本历史、多人审查 SSH / credential helper / HTTPS token 非 fast-forward 先合并,不强推
WebDAV NAS、Nextcloud、坚果云等 Basic 或 Bearer ETag + If-Match
S3 兼容 AWS S3、MinIO、R2、七牛等 AccessKey + SecretKey(+ 可选 session token) ETag / If-Match

远端根目录(默认前缀 dsh-config-sync/)结构大致如下:

dsh-config-sync/
├── manifest.json
├── profiles/<profile>/
│   ├── dsh-config.json
│   ├── providers.json
│   ├── plugins.json
│   ├── plugin-configs.json
│   ├── mcp.json
│   └── secrets.json          # 仅加密信封
├── devices/<deviceId>.json
└── snapshots/<profile>/<deviceId>/<ts>.json   # 最近保留 20 份

安装与启用

官方 README 给出的流程是本地构建后以 bundle 安装,而非简单的单行 dsh plugin add。

  1. 在插件目录内安装依赖并构建:
npm install
npm run build

构建产物包括 Host 端 lib/ 与 Web 端 lib/client.js。仓库说明:lib/ 需随 Git 提交,因 DSH 安装插件时会阻止依赖的构建脚本。

  1. 在 DSH 中安装该目录:
plugin_manager install_bundle  target: /绝对路径/dsh-configandplugin-sync
  1. 重启 DSH(或等待 HMR)。设置页会出现 DSH 配置与插件同步。

典型用法

首次配置与同步

  1. 设置页 → 配置:选择 Git / WebDAV / S3,填写地址与凭据(凭据仅存本机,见下文安全说明)。
  2. 点击 测试连接,确认返回 ok: true 且能读到 revision。
  3. 勾选同步范围(配置、provider、插件、插件配置、密钥、MCP),保存。
  4. 同步 标签 → 预览:查看将要上传/下载的条目与冲突,确认后执行。
  5. 在第二台设备重复 1–3,再 预览 → 恢复。

两台设备首次都有内容且同名条目不一致时,会进入冲突等待选择 local / remote / skip,而不是默默覆盖。

密钥与口令

密钥同步默认关闭。启用前需向插件提供口令,推荐顺序如下。

方式 A(推荐,桌面 App):设置 → 密钥 → 本机口令文件 → 保存。写入 ~/.dsh/dsh-configandplugin-sync/passphrase,权限 0600,不经环境变量,立即生效。

方式 B:启动时环境变量,例如 macOS:

open -a "DeepSeek Harness" --env DSH_SYNC_PASSPHRASE='你的口令'

方式 C:在 ~/.dsh/.env 中使用非 DSH_ 前缀的变量名(DSH 会拒绝 DSH_ / XDG_ / DYLD_ 前缀),例如 SYNC_PASSPHRASE,改完后需重启 DSH。

加密:scrypt 派生密钥 + AES-256-GCM;存储中只有 salt / iv / tag / 密文。口令不会写入配置或远端。

若在 cordis.patch.yml 里写了明文密钥,采集时会将敏感键替换为 *** 并告警;恢复时本机已有真实值则保留(preserveMaskedValues)。更稳妥做法是把凭据放进 ~/.dsh/.credentials.yaml,配置里只写引用名,由密钥段加密同步。

冲突与自动同步

同步引擎采用三方合并(本机基线、本地现值、存储现值)。cordis.patch.yml 上若两台设备改了不同 entry id,会先尝试按 id 合并;package.json 上不同依赖的改动也可自动合并,同一依赖版本冲突才需人工决策。删除类操作需 confirmDestructive。

设置页可开:启动时同步(默认延迟 15s)、定时(默认 30 分钟)、插件变更后(默认关,去抖 5s)。自动运行遇冲突会暂停;连续失败按 2 的幂退避,上限 1 小时。

Agent 工具

与设置页共用同一引擎,常用工具包括:dsh_sync_status、dsh_sync_inventory、dsh_sync_diff、dsh_sync_backup、dsh_sync_restore、dsh_sync_sync、dsh_sync_history、dsh_sync_secrets_status。默认多为预览,执行需显式 confirm。

安全与限制

  • 密钥加密后才离开设备;WebDAV/S3 密码等 HTTP 响应中为空串,提交空值表示保持原值。
  • 日志对常见 token、URL 内账号等做脱敏。
  • MCP 只同步 header/env 名称,不同步值。
  • 本机配置 ~/.dsh/dsh-configandplugin-sync/config.json 权限 0600。

已知限制(摘自 README):

  • 仅同步当前运行中的 profile。
  • 本地 link: 插件不复制代码,目标机需自行准备目录。
  • 回滚依赖本插件快照;Git 另有提交历史,但回滚仍走快照。
  • WebDAV/S3 无原生版本链时,历史页展示快照列表。

结尾

换机或双机并行开发 DSH 时,若你希望 provider、插件清单、MCP 与加密后的凭据保持同一套「可审查、可合并」的远端状态,而不把插件仓库打进备份包,可以按上文步骤安装 dsh-configandplugin-sync,先 测试连接 与 预览,再在两台设备上执行恢复或双向同步。

羽毛球分组比赛记分
小程序二维码

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

小夜