Self-hosting my photos with Immich

Michael Stapelberg

用 Immich 自架我的照片

對於我使用的每一項雲端服務,我都希望能在本地保留一份資料,用於備份並保持自主性。不幸的是,gphotos-sync 工具在 Google 限縮 OAuth 範圍後,於 2025 年 3 月停止運作,因此我必須為現有的 Google Photos 設定尋找替代方案。在這篇文章中,我將說明如何架設 Immich,這是一套可自行託管的相片管理工具。

成果如下:幾張來自 NixCon 2025 的(Live)照片:

網頁瀏覽器中的 Immich 螢幕截圖

步驟 1. 硬體

我在我的 Ryzen 7 Mini PC(ASRock DeskMini X600) 上執行 Immich,它在閒置時耗電不到 10 W,且擁有充足的資源可供 VM 使用(64 GB RAM、1 TB 磁碟)。你可以在我 2024 年 7 月的部落格文章中閱讀更多相關內容:

我安裝了 Proxmox,這是一套開放原始碼的虛擬化平台,用來將這台迷你伺服器切分成多個 VM,不過你當然也可以直接在任何伺服器上安裝 Immich。

步驟 2. 安裝 Immich

我建立了一台名為「photos」的 VM,配置 500 GB 磁碟空間、4 個 CPU 核心以及 4 GB 記憶體。

若要進行初次匯入,你可以配置更多的 CPU 和記憶體,但就一般使用而言,這樣的資源已經足夠。

我依照這篇部落格文章的說明,在該 VM 上(以宣告式)安裝了 NixOS

接著,我啟用了 Immich,設定如下:

services.immich = {
  enable = true;
};

此時 Immich 已可在 localhost 上使用,但由於 NixOS 預設會啟用防火牆,因此無法透過網路存取。我可以啟用 services.immich.openFirewall 選項,但我實際上希望 Immich 僅能透過我的 Tailscale VPN 存取,這樣就不需要開放防火牆——相反地,我使用 tailscale serve 將流量轉送至 localhost:2283

photos# tailscale serve --bg http://localhost:2283

由於我已啟用 Tailscale 的 MagicDNSTLS 憑證自動佈建,現在我可以在電腦、筆電或手機的瀏覽器上開啟 https://photos.example.ts.net

步驟 2. 初次匯入照片

一開始,我嘗試使用官方的 Immich CLI 來匯入照片:

% nix run nixpkgs#immich-cli -- login https://photos.example.ts.net secret
% nix run nixpkgs#immich-cli -- upload --recursive /home/michael/lib/photo/gphotos-takeout

可惜上傳過程並不穩定,在發生逾時後必須手動重新啟動數次。後來我才發現,這是因為 Immich 伺服器會執行縮圖產生、中繼資料擷取或人臉偵測等背景工作,而這些背景工作會拖慢上傳速度,甚至導致上傳因逾時而失敗。

另一個問題是,即使上傳完成後,我才發現 Google Photos 的 Google Takeout 封存檔會將中繼資料存放在原始圖片檔旁邊的獨立 JSON 檔案中:

Takeout:Google Photos 格式

可惜 immich-cli 並不會處理這些檔案。

幸好,有一套很棒的第三方工具 immich-go 解決了這兩個問題!它會在上傳前暫停背景工作,並在上傳完成後重新啟動,運作效果好得多,而且它會盡力解析 Google Takeout 封存檔。

我如下執行 immich-go,效果非常好:

% immich-go \
  upload \
  from-google-photos \
  --server=https://photos.example.ts.net \
  --api-key=secret \
  ~/Downloads/takeout-*.zip

步驟 3. 安裝 Immich iPhone App

我的新照片主要來源是手機,因此我在 iPhone 上安裝了 Immich App,透過 Tailscale 網址登入我的 Immich 伺服器,並透過右上角的圖示啟用新照片的自動備份。

我不太確定這些設定是否正確,但看起來相機拍攝的照片通常會歸到 Live Photos,而 Recent 應該會涵蓋其他檔案……?!

如果有人知道答案,煩請傳個說明(或連結!)給我,我會更新這篇文章。

我也強烈建議關閉 Immich 的通知,否則每當它在背景上傳圖片時,你都會收到通知。這些通知並非背景上傳正常運作所必需,這一點已獲 一位 Immich 開發者在 Reddit 上證實。請依序開啟 SettingsAppsImmichNotifications,並取消勾選通知權限:

步驟 4. 備份

Immich 關於備份的文件 提供了一些不錯的建議。Immich 開發者建議備份 UPLOAD_LOCATION 的完整內容,在 NixOS 上即為 /var/lib/immich。其中 backups 子目錄包含 SQL 傾印檔,而 uploadlibraryprofile 這三個目錄則包含所有使用者上傳的資料。

因此,我設定了一個 systemd timer,透過 rsync/var/lib/immich 複製到我的電腦上,而該電腦已納入 3-2-1 備份策略

還缺少什麼?

Immich(目前?)並未包含相片編輯功能,因此若要旋轉或裁切圖片,我會先下載圖片,再使用 GIMP 處理。

若要分享圖片,我仍會將它們上傳到 Google Photos(視分享對象而定)。

為什麼選擇 Immich 而不是……?

在自行託管的影像管理工具領域中,最有前景的兩個選項似乎是 ImmichEnte

我的感覺是,在我的同溫層中 Immich 較為熱門,而 Ente 給我的印象是其範疇遠大於我的需求:

Ente 是一項提供完全開放原始碼、端對端加密平台的服務,讓你無需信任服務供應商即可將資料儲存在雲端。在此平台之上,我們目前已打造了兩款應用程式:Ente Photos(Apple 與 Google Photos 的替代方案)以及 Ente Auth(已停止維護的 Authy 的雙重驗證替代方案)。

我不需要端對端加密的平台。我在傳輸層(Tailscale)與磁碟層(LUKS)已有加密,不需要再增加複雜度。

結論

Immich 是一款令人愉悅的應用程式!它的速度非常快,整體運作也相當穩定。

初次匯入過程很順暢,但前提是要用對工具。理想上,官方的 immich-cli 可以再改進。或者,也許可以讓 immich-go 成為官方工具。

我覺得在 iPhone 上自動備份太難設定,這部分也可以改進。

但除了這些一開始的小障礙之外,我沒有其他抱怨。

原文由 Michael Stapelberg 發布

本文章由 muse-spark-1.2-contributor 進行翻譯