「Immich」是一款開源的自架雲端相簿服務,提供網頁及手機APP,協助整理照片。
對不想依賴商業相簿服務的人來說,Immich十分適合部署到NAS或私人伺服器,用於備份與整理照片,使用起來體驗不輸「Google相簿」這類商業相簿服務,可做為Google相簿替代品。
以下是Immich的圖示。開發者alextran1502說很喜歡日本文化,Immich的圖示即修改自日本戰國時期的織田家家徽,他還景仰吉川英治《新書太閤記》中豐臣秀吉的精神。
2024年, Immich專案加入FUTO組織,由全職開發者負責軟體開發。
本文讓Ivon介紹Immich的安裝與使用方式。
1. Immich特色功能#
優點#
Ivon用下來,覺得Immich功能做得很像Google相簿,繼承Google相簿簡單的特色,該有的功能都有:讀取Exif、公開共享相簿、回憶集錦(歷史上的今天)、臉部辨識、定時備份、支援中文界面等等。
網頁界面的操作邏輯很像Google相簿,拖動右邊的軸線檢視照片時間軸
點選照片後查看相機、地點資訊
上傳照片後,Immich會自動掃描人臉
以及將照片繪製在世界地圖上
Immich支援以檔案名稱搜尋照片。AI會識別照片中的物件,讓使用者可以用關鍵字搜尋
Immich還會挑選過去的照片,在照片列表最上方顯示回憶集錦(歷史上的今天)
備份的時候Immich提供二種模式:你可以上傳照片讓Immich自動整理,或者手動把照片放到硬碟資料夾分類,並讓Immich掃描,將照片顯示在網頁。
對於喜歡用硬碟資料夾整理照片的用戶,Immich能讓你在網頁直接依照資料夾結構去找照片。
Immich最大強項在於提供手機APP,可以當一般的相簿APP使用。
主界面手機和伺服器的照片會顯示在一塊,並用「雲朵」圖示標示哪些圖片尚未上傳。
當然,用來分別檢視手機資料夾的照片也是可以的。
Immich的APP方便備份照片到伺服器,可選擇定時背景排程備份,支援RAW檔和原況照片。
Immich支援多用戶登入,可以給各個用戶設定照片容量配額。
支援只備份特定手機資料夾(相簿),而非把DCIM資料夾的照片都傳上去。
Immich光這點就比類似產品 PhotoPrism有誠意多了,後者竟然到現在還在叫使用者認命用PWA網頁程式。
缺點#
Immich標籤系統不若PhotoPrism明瞭,雖然Immich可以用「顏色」、「物件」標籤下去搜尋照片,但是他不會像PhotoPrism把掃描到的標籤列成一個完整清單,標籤也沒辦法自己新增。
中文支援尚不齊全,雖然中文界面有了,但是地圖搜尋依然顯示的是英文地址。
Immich跑AI辨識的時候比PhotoPrism吃資源,CPU常常跑到100%;PhotoPrism在資源調度方面比較穩定。
2. 安裝Immich#
撰文當下的Immich版本:v1.119.1
2.1. 設定伺服器端#
硬體需求部份,Immich官方建議CPU至少2核心、RAM至少4GB。
官方文件有提到Docker、Kubernetes、Unraid的裝法。其中Docker-compose是最簡單的方式。
於Linux電腦安裝 Docker
建立存放資料的目錄。
mkdir immich-app
cd immich-app
- 參考 官方文件,取得官方範本。此docker-compose內含Immich所需的各項服務,包含反向代理。
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
Immich的環境變數都寫在
.env
裡面了,官方建議把TYPESENSE_API_KEY
改成隨機產生的數字,或者維持預設。啟動容器服務
docker compose up -d
用瀏覽器開啟
http://localhost:2283
或http://電腦區域IP:2283
,存取Immich網頁界面,一開始要用電子郵件註冊管理員帳號。上傳照片(方法後述),你就可以點選右上角大頭貼 → 管理 → 作業,將所有選項都設定為「活躍」,開始掃描分類照片。
如果你覺得圖片辨識不夠精準的話,那麼請在右上角大頭貼 → 管理 → 機器學習設定 → 智慧搜尋 → Clip模型,改用較大的多語言模型
immich-app/nllb-clip-large-siglip__v1
。停止Immich全部容器服務的指令:
cd immich-app
docker compose down
- 更新容器的指令:
docker compose pull
2.2. 設定外部網路存取Immich#
Immich只要有電腦網頁就可以用,手機推薦用APP存取。
不過若是要從外面的網路連線到Immich伺服器怎麼辦呢?我會使用
內網穿透軟體。設定好內網穿透後,你就可以用http://電腦虛擬區域IP:2283
存取遠端Immich伺服器了。
2.3. 適時關閉吃資源的服務#
影像辨識和影片轉檔是Immich最吃資源的服務,如果用不到可以將其關閉。
關閉影像辨識:右上角大頭貼 → 管理 → 設定 → 機器學習設定,將所有服務取消打勾。
關閉影片轉檔:用意是讓影片能在網頁更快載入,但是影片太多會轉檔很久。如果要關閉的話,點選右上角大頭貼 → 管理 → 設定 → 影片轉碼,將轉碼策略改為「不轉碼」。
3. 手動上傳照片至Immich#
使用者必須先將照片整理,「上傳」到Immich的資料庫。
也就是說,日後照片是直接上傳照片到Immich的資料庫,不做任何資料夾分類。
此方法適合手機備份照片。
如果你不喜歡這麼做,那麼請參考下一節「掃描現有照片資料夾」。
開啟APP後登入Immich伺服器帳號。
點選右上角雲朵上傳圖示,點選Backup Album,選取要備份的資料夾。預設是手機全部照片(Recent)。Android的話可以個別設定要備份的資料夾。
接著下面有二個備份方式,Foreground Backup是一開啟APP便自動上傳,Background service是自動在背景備份。
一切設定好後,點選Start Backup。
目前Immich的備份邏輯:Immich備份後會自動計算校驗值,標記已經上傳的照片,這樣就不會重複上傳了。
照片上傳後,本機照片不會刪除。如果要保留伺服器照片,只刪除本機照片的話,你要手動用其他APP刪本機照片。
如果在Immich APP裡面按刪除,則該照片會從伺服器和本機一併刪除。
另外,只有選取備份的手機資料夾,才會跟伺服器的照片一起顯示在時間軸上。
4. 掃描現有照片資料夾#
此功能稱作外部圖庫(Library),Immich預設的Library是UPLOAD
,不能刪除。針對喜歡手動用資料夾分類照片的使用者,你可以新增多個Library,直接掃描現有的硬碟資料夾,讓Immich讀取並彩現在網頁,不會對照片做任何變更,這樣就不用重新上傳照片了。
- 首先,停止Immich服務
cd immich-app
sudo docker compose down
- 編輯
docker-compose.yml
,加入照片所在資料夾的路徑,使其成為Docker volume。例如我有/run/media/user/TOSHIBA1TB/DCIM
這個照片資料夾,就要在immich-server:
下面的volumes
區塊新增唯讀volume:
immich-server:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /run/media/user/TOSHIBA1TB/DCIM:/run/media/user/TOSHIBA1TB/DCIM:ro
- 啟動容器服務
sudo docker compose up -d
回到網頁界面,點選右上角大頭貼 → 管理 → 使用者 → 外部圖庫,新增圖庫,加入資料夾路徑
點選掃描開始掃描照片
在右上角大頭貼 → 管理 → 作業頁面,可以看照片掃描分類的進度。
5. 將Google相簿的照片搬家至Immich#
這裡我提供二種搬家方法。
嚴格來說,你沒辦法「線上」搬移Google相簿的照片到Immich,你必須先將Google相簿的照片下載到電腦,才能搬移至Immich。
如果你想把Google相簿跟Immich照片分開處理 → 使用Library方法
如果你把Google相簿跟Immich照片融合在一起 → 使用Immich CLI上傳
Library方法#
自動掃描Google相簿資料夾新增照片。
使用 GoogleTakeoutHelper整理下載照片,將其變成一個資料夾
參考上面 #4 的步驟,把Google相簿所在照片的資料夾變成Library,再讓Immich掃描。
Immich CLI上傳#
根據 官方文件,Immich有提供命令列工具Immich CLI,用於批次上傳照片到伺服器。適用本機有大量照片的場合,例如剛從Google相簿下載回來的照片。
使用 GoogleTakeoutHelper整理下載照片。
到Immich網頁界面 → 右上角大頭貼 → 帳號設定 → API金鑰,產生新金鑰
使用Docker跑Immich CLI。依序輸入Google相簿所在資料夾路徑、金鑰、Immich伺服器位址,便可以上傳整個資料夾的照片檔案到Immich了。
sudo docker run -it --rm -v "/Google相簿所在資料夾/:/import" ghcr.io/immich-app/immich-cli:latest upload --recursive --key "你的金鑰" --server http://192.168.1.216:2283/api