dsh-webdav-sync:用 WebDAV 在多台电脑间同步 DSH 配置

前言

在多台机器上使用 DeepSeek Harness(DSH)时,常见做法是手动拷贝 profile、凭据和插件清单,或把整份目录丢进网盘。profile 里的 YAML 与 package.json 容易和本机路径、密钥引用缠在一起;密钥又不在 profile 里,只在本机凭据服务中。单纯同步文件既难做合并,也容易把 WebDAV 密码和加密口令混进会被上传的配置。

下面介绍社区插件 dsh-webdav-sync(仓库 GaoHu1997/dsh-webdav)。它把「整份 setup」打成一份加密文件放到 WebDAV,在服务端按份做三方合并,而不是把 profile 目录镜像到服务器。

这是什么

dsh-webdav-sync 由维护者 GaoHu1997 发布,许可证 MIT,npm 包名与插件 id 均为 dsh-webdav-sync。设计思路来自 magpie 的 internal/davsync,在本仓库用 TypeScript 实现,面向 DSH 的 cordis.patch.yml 与 profile 的 package.json。

备份在离开本机之前用口令加密(AES-256-GCM + PBKDF2-SHA256,600000 轮)。服务器上自始至终只有密文,看不到模型目录、插件清单、API 密钥或密钥所属供应商。

同步哪些内容

同步按「份」(Part)切分,每台电脑可单独开关某一份是否参与本机读写:

份(Part) 来源 含义
models cordis.patch.yml 的 llm-pi-ai 行 模型供应商与模型
patch cordis.patch.yml 其余 loader 行 MCP、权限预设、UI 设置等其余 profile 配置
plugins package.json 的 dependencies 与 dsh.profile.bundles 已安装插件声明(不含 node_modules,另一台用 pnpm 重装)
dirs 用户在「同步内容」里选择的绝对路径目录 附加目录(默认份开关为关)
keys 凭据服务里被上述配置引用的 API 密钥 补全 apiKeyEnv / secretEnv 名字对应的托管存储值

不在同步范围内:cordis.patch.yml 的 agent-default-model 行(换模型频繁,跨机价值低);本插件自己的 loader 行在收集 patch 份时会被排除,避免 WebDAV 账号密码随 patch 上传。

合并规则:按份哈希、三方合并;冲突时较新的一份胜出,较旧的一份写入本机 sync/ 留档。上传使用记录的版本做 If-Match,避免被静默覆盖。keys 只写不删,两边都改时本机优先(凭据无 mtime)。

安装与启用

这是一个由 Host(Node)与浏览器设置卡片组成的 DSH 插件。在 profile 目录($DSH_PROFILE_DIR,或 $DSH_HOME/profiles/<profile>)执行:

pnpm add dsh-webdav-sync

若未通过 bundle 机制自动带上 loader,需在 cordis.patch.yml 中手动加入:

- insert:
    - id: dsh-webdav-sync
      name: 'dsh-webdav-sync'

id 与浏览器侧的 composition entry 一致;name 必须等于已安装的包名。装好后重新加载界面,Settings 会出现「WebDAV 同步」页,Plugins 页在 Host 服务本插件命名空间时也会显示同一张配置卡片。

配置与典型用法

配置写在 profile 下的 .dsh-webdav-sync/sync.json(文件权限 0600,目录 0700),不在 cordis.patch.yml 里。

  1. 填写 WebDAV 的 url、user、password(发给服务器的 HTTP Basic)。
  2. 设置 passphrase(仅本机用于加解密,不得与 WebDAV 密码相同)。
  3. 在「同步内容」中勾选要同步的份:models、plugins、patch、keys;需要附带 profile 外目录时打开 dirsEnabled,通过界面「选择目录」添加绝对路径(最多 5 个目录,每目录最多 2000 文件 / 8 MiB)。
  4. autoEvery 控制自动同步间隔(分钟):-1 表示仅手动「立即同步」;可选值包括 3、15、30、60。
  5. 保存后执行同步;另一台电脑安装同一插件、指向同一 WebDAV 路径,用同一加密口令解密并合并。

url 示例(填文件夹地址或服务器根均可,尾斜杠可有可无):

{
  "url": "https://dav.jianguoyun.com/dav/",
  "user": "me@example.com",
  "password": "…",
  "passphrase": "…",
  "autoEvery": 15,
  "models": true,
  "plugins": true,
  "patch": true,
  "keys": true,
  "dirs": [],
  "dirsEnabled": false
}

部分服务商需要额外 HTTP 头(如 User-Agent、X-Api-Key 或 Bearer),可在 headers 里按「名字: 值」一行一条填写;若已写 authorization,则不再自动补 Basic。

可选 本机转发(relayEnabled):在 127.0.0.1 的 relayPort(默认 3426)监听,复用同一套上游 url / 认证配置,便于本机其他客户端走回环访问;本地 Basic 账号 relayUser / relayPassword 仅保存在本机。

密码与口令只存在于 sync.json 与运行中 Host 内存;浏览器卡片仅收到 passwordSet / passphraseSet,不会下发明文。关闭「记住密码」后磁盘上不保留 password,重启 Host 需重新输入。换 WebDAV 地址或用户名且未提交新密码时,不会把旧密码误用到新账号。

适用场景与注意

适合需要在办公室电脑、家用机或多台 Linux/macOS 开发机之间对齐 DSH 模型列表、插件清单、MCP 与权限类 patch、以及凭据引用的用户。附加目录适合同步笔记、提示词或脚本等固定绝对路径下的文件;恢复时写回同一路径,同步不会删除目录内已有文件。

使用前请注意:

  • 插件逻辑在 当前 DSH Host 进程权限下读写 profile、凭据服务($DSH_HOME/.credentials.yaml)与用户选择的目录;安装前请阅读 源码与许可证,确认符合你的安全策略。
  • WebDAV 账号只接触密文 bundle;真正机密依赖你设置的 passphrase。丢失口令无法从服务器上的文件恢复明文。
  • 社区插件目录 SkillHub 上的 dsh-webdav 条目 与 DeepSeek / 幻方无官方从属关系;DSH 生态奉行「一切皆插件」,选用与否由你自行评估。

结尾

dsh-webdav-sync 把 DSH 跨机配置收敛为「一份加密文件 + 按份合并」,并单独处理 API 密钥与可选附加目录,减轻手工拷贝 profile 与凭据错位的问题。更多字段说明与设计决策见仓库 README 与 docs/decisions/。

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

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

小夜