本文介紹Syncthing的基礎使用方法,後面再講述如何透過內網穿透軟體實現無線、免Wifi的檔案同步方式。
1. Syncthing簡介#
Syncthing是由Jakob Borg等人開發的自由軟體,方便讓你在多裝置同步檔案。不論是電腦、手機、NAS都可以安裝。
例如我的使用情境:Android手機 ←→ Linux電腦 ←→ Windows電腦 ←→ Linux筆電,在這幾個裝置安裝Syncthing,就可以高速同步檔案。
同步的時候每個裝置都會收到一個檔案副本,裝置之間是互相同步的。
Syncthing是開源軟體,不需要註冊。流量無限制,上傳速度取決你的網速;資料傳輸全程加密,資料不會上傳到第三方伺服器。
可以用Wifi同步,也可以P2P,或是自架中繼伺服器(relay server),跨網域同步。
Syncthing同步的是整個資料夾,比方說讓手機跟電腦共享電腦上的
DCIM
資料夾,兩邊的檔案會互相同步。有點類似Google雲端硬碟「我的電腦」的功能,只不過所有檔案都存在你的裝置上,不會上傳到第三方伺服器。Syncthing也是一種無線傳檔案的手段,可以作為SMB、FTP伺服器的替代方案。
Syncthing支援各大作業系統,如果你有自架服務,還能用Syncthing進行資料同步。例如照片可從手機同步到伺服器,用再 Immich管理;或是在各個裝置間同步 Joplin筆記資料。
說到同步檔案,那麼Syncthing與自架雲端硬碟有何差別?為什麼要使用Syncthing而不是Nextcloud?請參見 Syncthing vs Nextcloud
2. 安裝Syncthing軟體#
Syncthing官方程式支援Linux/FreeBSD/Solaris/Windows/macOS/Android系統。
如果你的伺服器沒有圖形環境也可以裝Docker版,操作介面跟二進位版大同小異。
2.1. 二進位安裝檔#
至 官網按照你的系統下載Syncthing。
- Linux可以從套件管理器安裝Syncthing。
sudo apt install syncthing
- 我希望Syncthing是登入Linux桌面環境後才啟動,因此採用Desktop Entry,將其加入到自動啟動的列表
cd ~/.config/autostart
wget https://raw.githubusercontent.com/syncthing/syncthing/main/etc/linux-desktop/syncthing-start.desktop
如果你的Linux是當作伺服器用途,請改用 Systemd Unit方式來設定Syncthing系統服務。
重開機,登入,Syncthing應該就會在背景執行了。
Syncthing預設介面是透過網頁存取的。如果你想要桌面程式,Linux請用 Syncthing GTK。
2.2. Docker版#
將二進位檔放在容器執行。Docker方案適合部署在NAS或者沒有提供Syncthing套件的發行版。
撰寫docker-compose,把要同步的資料夾掛載到volumes
。此處Syncthing的頂層資料夾是/var/syncthing
。Network mode使用host mode。
version: "3"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
hostname: my-syncthing
environment:
- PUID=1000
- PGID=1000
volumes:
- /home/user/Syncthing:/var/syncthing
network_mode: host
restart: unless-stopped
2.3. 手機版APP#
Android到 F-Droid或 Google Play下載
iOS還沒有官方APP,僅有第三方開發的付費軟體 Möbius Sync
3. Syncthing初始設定#
Syncthing預設同步模式是雙向的,只要二台裝置在線上,一邊新增的檔案就會馬上傳送到另外一邊。刪除的話兩邊都會同時刪除。
讓我們先設定電腦上的Snycthing程式,再設定手機上的,測試二者同步情況。
請讓二個裝置處於同一個Wifi連線。
確認Linux電腦上的Snycthing有在執行後,開啟網頁介面
http://localhost:8384
首先按照指示到設定 → GUI,給Syncthing設定一組帳號密碼
點選儲存後頁面會重新載入,以剛剛新增的帳號密碼登入網頁界面。
現在是什麼都沒有設定的狀態。Syncthing左邊的面板是電腦要分享的資料夾,右上角的面板是本機上傳的狀態,右下角遠端裝置的狀態。
點選左邊Default Folder,按編輯,你會看到它用於同步的資料夾路徑是為
/home/user/Sync
,Sync
就是用於存放同步檔案的資料夾。
你可以自行新增其他同步資料夾,比方說新增~/Root
路徑,即指向/home/user/
下面的資料夾Root
。
另外,Syncthing伺服器的設定檔和log會存在/home/user/.local/share/state
Syncthing在同步的時候若遇到同樣名稱的檔案會直接蓋掉,你可以啟用「檔案版本控制」讓檔案不會馬上被刪除。
開啟檔案管理員,切換到要同步的
/home/user/Sync
資料夾,先放個檔案進去接著開放電腦防火牆通訊埠
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
sudo ufw allow 21027/udp
sudo ufw reload
在手機上開啟Syncthing APP,左邊滑進來,點選「顯示裝置識別碼」,複製下來
在Syncthing網頁介面點選右下角的「新增遠端裝置」,填入手機上顯示的識別碼
點選Default Folder,點編輯,切換到「正在共享」,勾選跟手機分享資料夾。
點選Syncthing網頁左邊的「全部重新掃描」嘗試同步到遠端裝置
手機應該會收到通知,點選同意連線
手機會收到新增資料夾的請求
給資料夾取名,再點選資料夾圖示(紅框處),設定手機上用於存放同步的資料夾。請在
手機內部儲存空間
建立Syncthing/Sync
結構的資料夾,再點選確定。幾秒後檔案就會同步到手機上了。網頁界面顯示「最新」代表雙方都已完成同步。
日後你想新增第三個裝置,同樣也是到電腦上的Syncthing點選「新增遠端裝置」。電腦的話記得開啟防火牆。
4. Syncthing的同步連線方式#
本節介紹Syncthing的同步原理和連線方式。每個Syncthing裝置都有一組隨機產生的識別碼。Syncthing在傳輸資料的時候會使用TLS加密連線。
首先是Wifi連線,Syncthing預設會啟用探索模式,二個的裝置在同一個Wifi下就能互相發現對方,進行P2P。
但若是位於不同網路(比方說手機連4G,電腦位於NAT後面),那就不可能P2P。這時連線高機率走官方中繼伺服器。儘管可以連線啦,但速度會很慢。
官方文件推薦的做法是通訊埠轉發(port forwarding),再讓你的電腦取得公網IP,使其能從外網存取。這樣就不需要走走官方中繼伺服器也可以讓二個裝置P2P,速度比較快。
而我是使用內網穿透的方式,來讓二個裝置P2P。
5. 內網穿透軟體搭配Syncthing使用#
我希望Syncthing不只是可以在內網傳輸,在外網也可以使用。甚至不需要Wifi也能連線。
就像使用BT軟體一樣,要讓不同網路的二個裝置P2P,你就得將裝置暴露到公開網路。
但是把電腦暴露給公網很危險,而且若有人可以整天掃我的通訊埠也怪可怕的,我不想讓裝置上的Syncthing伺服器可以被任意探索。
要解決以上問題,我用 內網穿透軟體TailScale或ZeroTier,用VPN的機制讓所有裝置處於虛擬內網,就不需要把電腦暴露給公共網路了,也不需要讓Syncthing開自動探索,加強安全性。
在裝好內網穿透軟體後,回到Syncthing網頁介面,點選右上角操作 → 設定 → 連線,關閉所有自動探索選項。
剛剛設定的手機同步資料夾應該不會斷掉,只不過你得點選遠端裝置,編輯 → 進階,把「位址」改成tcp://裝置的虛擬區域IP
才可以繼續同步。
6. 設定Syncthing單向同步#
跟雙向同步不同,「單向同步」就是指定一個資料夾,將其做單向傳輸。
比方說電腦新增一個~/Backup
資料夾,點選編輯 → 進階,將資料夾類型設為「僅接收」。這樣在手機新增該資料夾之後,就只會接收手機傳過來的檔案,而不會把電腦端的檔案也同步到手機上。