dsh-webdav-sync:用 WebDAV 在多臺設備間同步 DSH 配置

前言

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 服務配置,再做首次同步,之後按需設置自動同步。

  1. 打開「設置 → WebDAV 同步 → 設置」,填寫服務器地址、用戶名、密碼和遠程目錄,點「保存並測試」。標準 WebDAV 實現即可,README 中提到堅果雲、Nextcloud、ownCloud、羣暉等均可。
  2. 在「概覽 → 檢查差異」查看上傳 / 下載 / 衝突數量,確認結果符合預期。
  3. 點「立即同步」按當前方向與策略執行。衝突策略可選較新優先、本地優先、遠程優先或跳過。
  4. 「文件」頁按狀態篩選,逐文件查看原因。

同步方向有三檔:

  • 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

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

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

小夜