以前 Google 為了推 Pixel 手機,都會推出買 Pixel 送無限 Google 相簿空間。一開始這個優惠是永久的,但隨著時間演進,Google 發現永久免費雲端服務根本是個錢坑,從 Pixel 6 開始取消了永久無限空間,改成一年限時免費,再之後可能是發現市占率夠高,就不送無限空間,改成送期間免費的 Google One 會員了。
不過,我以前買的 Pixel 3 還是有無限空間,雖然不像 Pixel 初代可以無損上傳,但是壓縮畫質對我來說也挺夠用了,而且我在自己家也有自架 immich 當相片備份,所以 Google Photos 就當第二備份、在家以外的地方也讀取也比較快。

過往我都是用 Syncthings 將各裝置中的照片或影片串流到 Pixel,再由 Pixel 統一上傳到 Google Photos 跟 immich,不過這樣每次新增新的裝置都要重新到 Pixel 那邊去設定,有點麻煩。
所以這次決定重新設定串流的架構,先用 immich 收集好備份的照片,再用 Syncthings 傳到 Pixel 備份到 Google Photos 備份。
Run Immich
我是用 docker compose 把整個服務跑起來的。
不過因為之前我就已經架好 Immich Server 了,所以這裡就留 官方的安裝連結 給閱讀到這段話的人去自己裝囉。
文章的說明非常詳盡,很簡單就能架好。
Run Syncthing
Syncthings 也是用 docker compose 去安裝就可以了,但是這裡有一些細節需要去處理。
我先貼出我的 docker compose,其中有幾項是依照自己環境去更改:
services: syncthing: image: lscr.io/linuxserver/syncthing:latest container_name: syncthing hostname: immich-backup-server environment: - PUID=0 # 使用者 ID (通常是 1000) - PGID=0 # 群組 ID (通常是 1000) - TZ=Asia/Taipei volumes: # 設定檔存放位置 (存放在目前目錄下的 config 資料夾) - .runtime//config:/config # 掛載 Immich 的照片資料夾 - {IMMICH_UPLOAD_LOCATION}/library/admin:/data/immich_photos
ports: - 8384:8384 # Web GUI - 22000:22000/tcp # synchronization (TCP/UDP) - 22000:22000/udp - 21027:21027/udp # local device discovery restart: unless-stoppedImmich Upload Location
{IMMICH_UPLOAD_LOCATION} 應該不用說,請依照架設 immich 時設置的儲存位置去填 (.env 的 UPLOAD_LOCATION)。
另外,library 底下第一層會存放各使用者的備份文件,而 admin 是登入的第一個帳號,其他使用者則是用 UUID 表示。如果要備份其他使用者的圖片的話,可以自己把 admin 改成其他路徑。
PUID/PGID
PUID 和 PGID 是伺服器上擁有那些照片檔案的使用者跟群組 ID ,如果設錯的話會導致 Syncthing 要讀取檔案時,權限不對會被 deny。
所以這裡我們要確認 Syncthing 使用的 PUID 必須跟 Immich 寫入檔案時使用的 ID 一致。
我們可以利用以下指令來找 ID:
cd {IMMICH_UPLOAD_LOCATION} # 一樣填入自己 immich UPLOAD_LOCATIONls -ns會看到類似這樣的輸出:
4 drwxr-xr-x 3 1000 1000 4096 Nov 20 10:00 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxo4 drwxr-xr-x 5 1000 1000 4096 Nov 20 10:00 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx4 drwxr-xr-x 4 1000 1000 4096 Nov 20 10:00 admin我們要注意的是第四跟第五組數字,
- 第 4 組數字是 UID (User ID) -> 這就是要填入
PUID的值 - 第 5 組數字是 GID (Group ID) -> 這就是要填入
PGID的值
關閉 Syncthing 外網登入
啟動容器後,進入 Syncthing 的管理網頁 (http://localhost:8384),進行以下設定:
- 點擊右上角的齒輪 Actions -> Settings
- 切換到 Connections 分頁
- 取消勾選以下三個項目:
- Enable NAT Traversal :不需要,因為我們只在內網提供服務。
- Global Discovery:這最重要,取消後就不會向 Syncthing 的公開伺服器廣播我們的位置。
- Enable Relay:強制點對點傳輸,不繞經第三方伺服器。
- 保留勾選 唯一的一個項目:
- Local Discovery:這是唯一需要留著的,讓兩台機器在同一個 WiFi/網段下能自動看見彼此。
](https://static.jcxyis.com/images/LGNtfIwnhN.webp)
設置 Immich - Pixel Syncthing 同步
Pixel 下載 Syncthing,因為 Syncthing 官方的 Android App 停止維護了,我們這裡安裝社群維護的 fork,一樣可以在 Google Play 上找到。
將 Pixel 跟 Immich 配對。
設置備份資料夾,
為了避免以前的圖片重新上傳,我 prefer 以每年的資料夾去做上傳。
](https://static.jcxyis.com/images/Bv2AQhLWyk.webp)
設置 Folder Type,讓 Pixel 那邊刪掉東西不會影響到 Immich 檔案
- 發送端 (Server) Folder Type 設為 Send Only
- 接收端 (Pixel) Folder Type 則設 Receive Only
](https://static.jcxyis.com/images/qQaMtgVAaf.webp)
後記
這樣設定以後,如果我從其他裝置上傳圖片的話,只要安裝好 immich,甚至用網頁打開上傳也行。immich server 會把這些照片丟到 Pixel 做上傳,方便很多。
不過我也發現,如果 Pixel 裡面有存一些其他圖片,不想要一股腦兒的全部備份裝置裡面所有圖片的話, Google Photo 會以最末端的資料夾為單位,讓你選取要不要備份這個資料夾。對於使用這套系統建立的備份來說,等於是每天都有新的資料夾要加入白名單,超級不方便。
我自己是直接設成全部備份了,沒有這問題。不過如果要解決問題的話,Immich 有選項可以更改上傳路徑格式,可以把一年甚至無限時間的照片全部擠成一坨,可以參考官網文件 https://docs.immich.app/administration/storage-template/