前言¶
DSH 的目錄、Profile、Agent 預設基本都落在本地磁盤上。換一臺機器或者重裝系統之後,settings.yaml、AGENTS.md、profiles/*/cordis.patch.yml 這些東西都要手工重裝重配一遍;Profile 裏的 pnpm-lock.yaml 和依賴鎖也沒法直接複製過去。自己接 WebDAV 寫腳本同步,又要處理忽略規則、衝突判定和刪除保護,容易寫出一堆只適配自己機器的代碼。
下面介紹的 2315137135/dsh-webdav-sync 就是專門做這件事的插件:只同步配置與清單,不碰設備本地數據,並在「設置 → WebDAV 同步」裏提供了一個檢查面板,用來解釋每個文件爲什麼被同步或被忽略。它由 2315137135 維護,分類爲聯網工具,純 JavaScript 實現,無需構建。
插件定位¶
一句話說清:在多臺設備之間,通過標準 WebDAV 服務同步 DSH 的配置與插件清單,同時提供忽略規則、路徑檢查器和衝突策略。
它不是通用的文件同步工具。默認同步範圍限定在「配置與清單」這一類文件,sessions/、storages/、附件、憑證和依賴目錄都不參與;這樣做的目的是避免把某臺設備上的本地狀態廣播到其他設備。
倉庫地址:https://github.com/2315137135/dsh-webdav-sync
社區目錄頁:https://www.skillhub.cn/plugins/2315137135/dsh-webdav-sync
同步範圍¶
先明確同步什麼,比直接開跑更重要。插件默認範圍如下:
| 範圍 | 路徑 |
|---|---|
| 主設置 | settings.yaml |
| 指令 | AGENTS.md |
| Profile | profiles/*/cordis.patch.yml、cordis.yml、package.json、pnpm-lock.yaml、pnpm-workspace.yaml |
| Agent 預設 | .agent-presets/** |
| 額外範圍 | 面板「設置 → 額外同步範圍」,每行一個 glob |
幾個容易踩的點:
- Profile 的
package.json與鎖文件會把 git 依賴帶到其他設備,目標設備執行一次插件安裝或pnpm install即可。 link:/file:安裝的本地插件不會隨同步遷移,面板會單獨告警。- 依賴目錄、會話、附件和憑證默認不同步,插件自身建議從 GitHub 安裝。
默認忽略規則¶
忽略規則按順序匹配,後出現的優先;! 前綴可以重新包含。默認規則包括:
sessions/、storages/、attachments/、dsh-runtimes/、webdav-sync/**/node_modules/、**/.git/、**/.cache/profiles/*/.dsh-market/、profiles/*/.plugin-manager/logs/.credentials.yaml(可在面板開啓)、.env、.anonymous-user-id、settings.yaml.imported***/*.log、**/*.tmp、系統文件
面板的「忽略規則」頁可以調整範圍與規則,路徑檢查器能實時回答「這個路徑爲什麼同步 / 爲什麼忽略」;「文件」頁則按狀態篩選,並對誤同步的文件提供一鍵追加忽略規則。所有規則和每條命中原因都可見,不是黑盒。
安裝與啓用¶
從 GitHub 安裝,純 JavaScript,無需構建。在 DSH 裏執行:
plugin_manager install_bundle
target: github:2315137135/dsh-webdav-sync
也可以使用 git+https://github.com/2315137135/dsh-webdav-sync.git,或克隆到本地後用絕對目錄安裝。安裝後刷新 Harness 頁面,菜單裏就會出現「設置 → WebDAV 同步」。
需要說明的是,這個插件以當前 DSH 進程的權限運行。安裝前應先打開源碼檢查一下(倉庫爲 MIT 許可),確認 client.js、index.js 等文件與你的部署環境沒有衝突。
典型用法¶
先做 WebDAV 服務配置,再做首次同步,之後按需設置自動同步。
- 打開「設置 → WebDAV 同步 → 設置」,填寫服務器地址、用戶名、密碼和遠程目錄,點「保存並測試」。標準 WebDAV 實現即可,README 中提到堅果雲、Nextcloud、ownCloud、羣暉等均可。
- 在「概覽 → 檢查差異」查看上傳 / 下載 / 衝突數量,確認結果符合預期。
- 點「立即同步」按當前方向與策略執行。衝突策略可選較新優先、本地優先、遠程優先或跳過。
- 「文件」頁按狀態篩選,逐文件查看原因。
同步方向有三檔:
two-way:雙向,默認push:只上傳pull:只下載
刪除行爲默認是「保留另一側文件」,也就是說某臺設備刪了文件,不會把其他設備上的刪掉。需要在面板中顯式切換爲「同步刪除」。即使切換爲同步刪除,一次計劃中超過 3 個本地刪除也會被攔截並保留,避免遠程異常導致本地被批量清空。
憑證、自動同步與 Agent 工具¶
憑證和傳輸安全的處理方式:
- 密碼保存在
$DSH_HOME/webdav-sync/config.json,文件權限0600;留空表示沿用已保存的密碼。 - 也可以用環境變量
DSH_WEBDAV_PASSWORD提供密碼,配置文件中不落盤。 - 傳輸使用系統 TLS 校驗;自簽證書需要在面板中顯式開啓「忽略 TLS 證書校驗」。
- 只支持 Basic Auth 和標準 WebDAV 方法(PROPFIND / GET / PUT / DELETE / MKCOL)。
自動同步:把間隔設爲大於 0 的分鐘數即可,修改後立即生效;設爲 0 關閉。
Agent 工具有三個:webdav_sync_status、webdav_sync_plan、webdav_sync_run。
已知邊界¶
先看這些限制,決定它是否適合你的場景:
- 逐文件同步,沒有跨文件事務;中斷後再次同步會按基線補齊。
- 遠程身份優先使用 ETag;服務器不返回 ETag 時退化爲大小 + 修改時間。
- 單文件默認上限 2 MB,可在面板調整;超過上限的文件會被跳過並在「文件」頁標出。
- 不處理文件名大小寫衝突與符號鏈接。
衝突判定基於每個設備上次成功同步的基線(本地狀態文件)。首次在新設備上同步時,如果遠程存在基線清單,會用它初始化比較,避免把所有文件誤判爲衝突。這一點對首次接入很重要。
開發與測試¶
倉庫自帶測試,純 Node 運行:
node --check index.js
node --check client.js
node test/ignore.test.js
node test/plan.test.js
node test/sync.test.js
node test/client-render.test.js
node test/client-i18n.test.js
node test/live-sync.mjs # 需要 DSH 正在運行,使用臨時本地 WebDAV 服務
node --test test/ 在某些受限環境會因無法創建子進程而失敗;直接運行單個測試文件即可。
小結¶
dsh-webdav-sync 解決的是配置漂移問題:把「哪些文件要同步、爲什麼忽略、衝突怎麼判」這套邏輯固化進插件,並提供可檢查的面板,而不是讓每個使用者維護一套自己的同步腳本。它以當前 DSH 進程權限運行,同步範圍默認保守,適合有多臺設備、且希望配置可復現的 DSH 開發者。
目錄頁:https://www.skillhub.cn/plugins/2315137135/dsh-webdav-sync
GitHub:https://github.com/2315137135/dsh-webdav-sync