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