AI & Tools #Open Source #Network #Productivity

Syncthing 實測:Mac 和 Windows 不靠雲端硬碟,自動同步資料夾

我用 Syncthing 連接 Mac 與 Windows,實際測試共享資料夾的雙向檔案同步,也記錄了加密設定錯誤與同步衝突。

7 min read/ Medium

前言

我想讓 Mac 和 Windows 長期共用同一個工作資料夾。Mac 這邊放進 Markdown、圖片或其他檔案,Windows 收到後也能直接修改,再把結果同步回來。

我最後拿 Syncthing 來處理。它會在多台裝置之間持續同步資料夾,不需要註冊帳號,也不必先把檔案上傳到雲端硬碟。裝置配對只是第一步,我另外建立一個共享資料夾,先從 Mac 放入測試檔,再讓 Windows 讀取並回傳另一個檔案。最後兩個測試檔都出現在 Windows 資料夾裡,Windows 建立的截圖也回到了 Mac。

Syncthing 和一般傳檔工具差在哪裡?

LocalSend 這類工具適合臨時把一個檔案送到另一台裝置;Syncthing 處理的是持續同步。只要兩台電腦都在線,其中一邊新增、修改或刪除檔案,另一邊的共享資料夾也會跟著變動。

它沒有中央雲端空間。檔案留在自己的裝置上,兩台電腦可以直接連線;遇到無法直連的網路環境時,也可能透過 Syncthing Relay 中繼,但傳輸內容仍會加密。這比較像自己管理的跨平台同步層,不是 Dropbox 或 Google Drive 的免費容量替代品。

Mac 安裝:Homebrew 一行完成

Mac 可以從官方下載頁選擇 syncthing-macos,也可以直接用 Homebrew。這次我用的是後者:

bash
brew install syncthing

安裝完成後執行 syncthing,瀏覽器會開啟本機管理頁 http://127.0.0.1:8384/。如果要讓它登入後常駐,可以改用:

bash
brew services start syncthing

這個管理頁預設只監聽本機。我這次沒有改 GUI 的監聽位址,兩台電腦的配對與同步也不需要把管理頁公開到區域網路。

Windows 安裝

Windows 端先到 Syncthing 官方下載頁。一般 Intel 或 AMD 的 64 位元電腦選 Windows Intel/AMD 64-bit;不想自己處理常駐啟動,也可以使用官方下載頁列出的 Syncthing Windows Setup 整合安裝程式。

這次 Windows 端執行的是 Syncthing v2.1.3、Windows 64-bit Intel/AMD。第一次啟動後同樣會開啟瀏覽器管理頁,並自動產生這台電腦的裝置 ID。

兩台裝置要互相加入

Syncthing 不靠帳號辨識裝置,每台電腦第一次啟動時都會產生一組裝置 ID。Mac 要加入 Windows 的 ID,Windows 也要加入 Mac 的 ID;只有單邊新增,兩台不會直接開始同步。

Windows 偵測到 Mac 後,首頁上方會出現「新裝置」通知。按下「新增裝置」前,先確認顯示的裝置名稱確實是自己的另一台電腦。

Windows Syncthing 偵測到 Mac 並詢問是否新增裝置

Windows 端收到 Mac 的裝置邀請,完整裝置 ID 已遮住

Mac 端按「新增遠端裝置」,貼上 Windows 的裝置 ID。裝置名稱只是方便自己辨認,可以填 Windows 的電腦名稱;一般配對不需要動到進階選項。

Mac Syncthing 新增 Windows 遠端裝置的設定畫面

Mac 端加入 Windows 裝置,識別碼與附近裝置資訊已遮住

兩邊都儲存後,Mac 已經能看到 Windows 顯示「已連線」,後面卻還寫著「未使用」。兩台電腦雖然找到彼此,但還沒有共享任何資料夾,所以檔案不會開始傳。

Mac Syncthing 顯示 Windows 遠端裝置已連線但尚未使用

裝置連線完成不等於資料夾已經同步,還要建立並共享資料夾

建立共享資料夾

我在 Mac 建立 SHUO TechBlog Syncthing Collab,再把它共享給 Windows。設定時會看到三個主要欄位:

  1. Folder Label 是管理頁顯示的名稱,可以用容易辨認的中文或英文。
  2. Folder ID 是兩台裝置辨認同一份共享的識別值,接受遠端分享時要保持一致。
  3. Folder Path 是這台電腦實際存放檔案的位置,Mac 和 Windows 不必使用相同路徑。

Folder ID 兩邊必須相同,但實際儲存路徑可以各放各的。我在「正在共享」選擇 Windows 並儲存,Windows 接受邀請、選好本機資料夾後,首頁便開始顯示同步進度。

Windows Syncthing 顯示共享資料夾為最新狀態

Windows 收到共享資料夾後顯示「最新」

真的丟檔案測一次

我先在 Mac 建立 mac-sync-proof.txt,Windows 收到後再建立 windows-sync-proof.txt。最後 Windows 檔案總管同時看得到兩個檔案,Windows 拍下的驗證截圖也自動回到 Mac。這才算完成雙向同步,不只是管理頁顯示裝置已連線。

兩邊都說對方斷線,原來是加密模式打架

第一次其實沒有成功。Mac 顯示 Windows 斷線,Windows 也顯示 Mac 斷線,看起來像兩邊都在怪對方。日誌裡真正的原因是共享資料夾的加密模式不一致:一邊準備交換一般資料,另一邊卻被設成 Receive Encrypted

這個選項是給不受信任裝置保存加密資料用的,不適合這次兩台自己的電腦互相編輯檔案。兩邊改回一般的 Send & Receive,共享設定也不填加密密碼後,不必重新配對,Syncthing 會自己連回來並繼續同步。

裝置 ID 可以公開嗎?

官方文件把裝置 ID 視為公開金鑰的一部分。只知道這串 ID,不能直接連進裝置或讀取檔案,因為兩邊仍要互相加入才能建立連線。不過啟用全域探索時,裝置 ID 可能被用來查到對應的 IP 位址,所以我在文章截圖裡仍然把完整字串遮掉。

真正不能外流的是 Syncthing 的 TLS 金鑰與設定檔。拿到那些檔案的人可能冒充你的裝置,連上已授權的遠端電腦。裝置遺失時,也應該立刻從其他裝置移除它的存取權。

它是同步,不是備份

Syncthing 會同步新增與修改,也會同步刪除。誤刪檔案後,刪除動作可能很快傳到其他裝置,因此不能把「另一台還有一份」當成完整備份策略。重要資料仍要另外做版本化備份,或至少為共享資料夾啟用 File Versioning。

兩台裝置同時修改同一個檔案時,Syncthing 會保留其中一份,並把另一份改名為帶有 sync-conflict、日期與時間的衝突檔。這次兩邊剛好同時改到同一份 Markdown,資料夾裡立刻多出一份衝突檔。內容沒有消失,但最後還是得自己判斷要留哪一份。之後我會避免讓兩台電腦同時修改同一個檔案。

一次只傳一個檔案,我還是會開 LocalSend。Syncthing 比較適合這次的狀況:Mac 和 Windows 需要長期共用同一批檔案,其中一邊改完,另一邊可以直接接著用。這篇文章使用的測試檔、圖片和影片,就是透過這個共享資料夾完成同步。