器:Immich部署與優(yōu)化指南)
1. 為什么要在樹莓派5上折騰私有照片服務(wù)器把照片放在別人的服務(wù)器上這件事我越想越不踏實。前幾年各家網(wǎng)盤輪番限速、會員漲價、甚至直接關(guān)停服務(wù)我身邊好幾個朋友都經(jīng)歷過“一覺醒來照片全沒了”的崩潰。后來大家開始用手機廠商自帶的云相冊結(jié)果免費空間只有5個G超了就得按月交錢而且照片壓縮得親媽都認不出來。更別提那些AI相冊功能動不動就要把你的照片上傳到云端做識別隱私這東西一旦交出去就收不回來了。所以當我拿到樹莓派5的時候第一個念頭就是能不能把這玩意兒變成我自己的AI照片服務(wù)器答案是不僅能而且體驗比我想象中好得多。樹莓派5這次升級幅度很大四核Cortex-A76處理器、最高8GB內(nèi)存、PCIe接口、雙4K輸出性能已經(jīng)摸到了入門級x86迷你主機的屁股。用它來跑照片管理、人臉識別、場景分類這些任務(wù)完全撐得住。這篇文章我會從零開始把整套方案拆開揉碎講清楚。包括硬件怎么選、系統(tǒng)怎么裝、照片管理平臺怎么挑、AI識別模型怎么部署、外網(wǎng)訪問怎么搞、備份怎么做。不管你是剛接觸樹莓派的新手還是已經(jīng)玩過幾塊板子的老鳥都能從里面找到能直接抄作業(yè)的步驟。我踩過的坑、試過的錯、最后跑通的配置都會毫無保留地寫出來。提示本文所有操作基于樹莓派5 8GB版本系統(tǒng)為64位Lite版。4GB版本也能跑但AI識別部分會吃力一些建議至少上8GB。2. 硬件選型與系統(tǒng)準備別在第一步就翻車2.1 樹莓派5到底選哪個版本樹莓派5目前有2GB、4GB、8GB、16GB四個內(nèi)存版本。如果你只是做照片存儲和簡單的相冊瀏覽4GB夠用。但一旦涉及到AI識別——比如人臉聚類、場景分類、OCR文字提取——內(nèi)存就是硬門檻。我實測下來8GB版本在跑人臉識別模型時內(nèi)存占用會沖到3.5GB左右4GB版本直接爆內(nèi)存系統(tǒng)開始瘋狂交換識別一張照片要等十幾秒。16GB版本當然更寬裕但價格已經(jīng)接近二手迷你主機了性價比不高。所以我的建議很明確8GB是甜點配置既能滿足AI需求又不會讓預算失控。存儲方面樹莓派5終于支持了PCIe接口可以通過M.2 HAT擴展板接NVMe固態(tài)硬盤。這個升級太關(guān)鍵了。以前用樹莓派4的時候照片庫一大機械硬盤的讀寫速度就成了瓶頸縮略圖加載慢得讓人想砸鍵盤。現(xiàn)在用NVMe固態(tài)順序讀取能跑到800MB/s以上隨機讀寫更是甩機械盤幾條街。我用的是一塊1TB的NVMe盤照片庫放了將近4萬張照片縮略圖滾動起來非常流暢。注意樹莓派5的PCIe接口默認是PCIe 2.0 x1帶寬有限。如果你買的是PCIe 3.0的固態(tài)它會降速運行但日常使用完全感覺不出來。別為了追求極限速度多花錢。2.2 系統(tǒng)安裝的幾個關(guān)鍵選擇系統(tǒng)方面我強烈建議用64位Lite版。桌面版雖然方便但會占用大量內(nèi)存和CPU資源而這些資源留給AI模型更劃算。Lite版通過SSH遠程管理配合Web界面訪問照片庫體驗反而更清爽。燒錄系統(tǒng)的時候有個細節(jié)容易被忽略一定要用官方Imager工具里的高級選項預先配置好WiFi、SSH和用戶名。我見過太多人燒完系統(tǒng)插上屏幕才發(fā)現(xiàn)沒配網(wǎng)絡(luò)又得重新拔卡再來一遍。另外樹莓派5的電源要求是5V 5A用樹莓派4的電源會供電不足表現(xiàn)為固態(tài)硬盤頻繁掉盤、系統(tǒng)隨機重啟。這個坑我踩過換了官方27W電源之后一切正常。系統(tǒng)裝好后的第一件事是更新源和固件sudo apt update sudo apt full-upgrade -y sudo rpi-update sudo rebootrpi-update會更新底層固件對PCIe固態(tài)的兼容性有提升。更新完之后用lsblk確認NVMe盤被正確識別然后用sudo raspi-config里的Performance Options把PCIe速度設(shè)為Gen 2再啟用NVMe啟動。這樣系統(tǒng)就直接跑在固態(tài)上了SD卡只作為備用。2.3 文件系統(tǒng)與掛載策略照片庫的存儲路徑我建議單獨掛載不要放在系統(tǒng)盤根目錄下。這樣做的好處是系統(tǒng)重裝或者遷移的時候照片庫不受影響。我的做法是在NVMe上分兩個區(qū)一個給系統(tǒng)一個給照片庫照片庫分區(qū)掛載到/mnt/photos。掛載的時候記得在/etc/fstab里加上nofail選項否則萬一硬盤出問題系統(tǒng)會卡在啟動階段進不去。這個細節(jié)很小但關(guān)鍵時刻能救命。# /etc/fstab 示例 UUID你的分區(qū)UUID /mnt/photos ext4 defaults,nofail 0 2權(quán)限方面照片庫目錄的屬主設(shè)成你的常用用戶權(quán)限設(shè)為755。如果你打算用Docker部署照片管理平臺還需要把用戶加入docker組并且確保容器內(nèi)的UID和宿主機的UID一致否則會出現(xiàn)“容器能讀但寫不進去”的詭異問題。3. 照片管理平臺選型為什么我最終選了Immich3.1 主流方案橫向?qū)Ρ葮漭缮夏芘艿恼掌芾矸桨覆簧傥仪昂笤囘^五六個每個都用了至少一周。下面這張表是我個人的實測總結(jié)方案部署難度AI功能手機自動備份界面體驗資源占用Nextcloud中等需插件支持一般較高PhotoPrism中等內(nèi)置支持良好中等Immich簡單內(nèi)置支持優(yōu)秀中等偏高LibrePhotos較難內(nèi)置有限一般中等自建文件目錄簡單無需同步工具差極低Nextcloud功能最全但它是“什么都能干什么都不精”照片管理只是其中一個模塊AI識別要額外裝插件配置起來很折騰。PhotoPrism專注照片AI功能也不錯但它的界面邏輯我始終用不慣而且手機端備份體驗一般。Immich是我最后留下來的方案。它的界面幾乎復刻了主流商業(yè)相冊的體驗手機App自動備份做得很順滑AI功能開箱即用而且更新非?;钴S。最重要的是它對ARM64架構(gòu)的支持很好樹莓派5上跑起來沒有兼容性問題。3.2 Immich的架構(gòu)與資源消耗Immich由幾個核心組件構(gòu)成immich-server負責主服務(wù)和Web界面immich-machine-learning負責AI推理postgres存元數(shù)據(jù)redis做緩存還有typesense做搜索。用Docker Compose一鍵拉起所有組件跑在同一個Docker網(wǎng)絡(luò)里。資源消耗方面我實測的數(shù)據(jù)是空閑狀態(tài)下整套服務(wù)占用約1.2GB內(nèi)存CPU占用5%左右。跑人臉識別的時候內(nèi)存會沖到3GB以上CPU四核全開溫度會升到75度左右。所以散熱必須做好我用的是一塊帶風扇的金屬外殼待機溫度45度滿載不超過80度。如果你用被動散熱夏天跑AI任務(wù)大概率會觸發(fā)降頻。提示Immich的機器學習容器默認會加載人臉檢測、人臉識別、CLIP圖像編碼等多個模型。如果你只需要人臉功能可以在配置里關(guān)掉CLIP能省下不少內(nèi)存。3.3 部署前的依賴準備在跑Immich之前有幾個系統(tǒng)層面的依賴需要先搞定。首先是Docker和Docker Compose用官方腳本安裝即可curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER然后安裝libvips和ffmpeg這兩個是圖像和視頻處理的核心庫sudo apt install -y libvips-dev ffmpeg最后調(diào)整一下系統(tǒng)參數(shù)。Immich的Postgres對共享內(nèi)存有要求默認的/dev/shm只有64MB會導致數(shù)據(jù)庫啟動失敗。需要在/etc/fstab里加一行tmpfs /dev/shm tmpfs defaults,size512M 0 0改完mount -o remount /dev/shm生效。這個坑我卡了整整一個下午報錯信息很隱晦只說什么“共享內(nèi)存不足”查了半天才定位到。4. Immich部署實操從零到跑通的完整記錄4.1 目錄結(jié)構(gòu)與配置文件我習慣把所有Docker服務(wù)的配置放在/opt/docker下面每個服務(wù)一個子目錄。Immich的目錄結(jié)構(gòu)是這樣的/opt/docker/immich/ ├── docker-compose.yml ├── .env ├── library/ # 照片原始文件 ├── postgres/ # 數(shù)據(jù)庫數(shù)據(jù) └── model-cache/ # AI模型緩存.env文件里需要改幾個關(guān)鍵參數(shù)。UPLOAD_LOCATION指向照片庫路徑DB_PASSWORD設(shè)一個強密碼TZ設(shè)成你的時區(qū)。還有一個容易被忽略的IMMICH_VERSION建議鎖定具體版本號而不是用release否則某天自動更新后可能出兼容問題。# .env 關(guān)鍵配置 UPLOAD_LOCATION/opt/docker/immich/library DB_PASSWORD你的強密碼 TZAsia/Shanghai IMMICH_VERSIONv1.119.04.2 docker-compose.yml的定制化調(diào)整官方提供的docker-compose.yml可以直接用但針對樹莓派5我做了幾處調(diào)整。第一給immich-machine-learning容器加了內(nèi)存限制防止它把系統(tǒng)吃光immich-machine-learning: deploy: resources: limits: memory: 4G第二把immich-server的端口從默認的2283改成你喜歡的端口我用的還是2283但如果你有多個服務(wù)記得錯開。第三給postgres容器加了shm_size: 512mb和前面系統(tǒng)層面的調(diào)整對應(yīng)上。啟動命令很簡單cd /opt/docker/immich docker compose up -d第一次啟動會拉取鏡像樹莓派5的網(wǎng)口是千兆的但如果你用WiFi拉幾個G的鏡像會比較慢。建議插網(wǎng)線操作。鏡像拉完之后用docker compose ps確認所有容器都是running狀態(tài)然后瀏覽器訪問http://樹莓派IP:2283就能看到登錄界面了。4.3 首次配置與手機端備份第一次登錄需要注冊管理員賬號這個賬號只存在你的本地數(shù)據(jù)庫里和任何外部服務(wù)無關(guān)。注冊完之后第一件事是去設(shè)置里把“外部域名”填上如果你后面要做外網(wǎng)訪問這里填你的域名如果只在內(nèi)網(wǎng)用填樹莓派的局域網(wǎng)IP就行。手機端備份是Immich的強項。iOS和Android都有官方App登錄后選擇要備份的相冊它會自動在后臺同步。我實測下來局域網(wǎng)內(nèi)備份速度能跑到30MB/s左右一萬張照片大概半小時同步完。備份策略我建議設(shè)成“僅在前臺備份”或者“充電時備份”否則手機電量掉得很快。注意Immich的手機App默認會備份所有照片包括截圖和表情包。建議在“備份相冊”設(shè)置里只勾選相機膠卷把其他相冊排除掉否則你的照片庫會被垃圾圖片淹沒。4.4 AI功能的開啟與調(diào)優(yōu)Immich的AI功能默認是開啟的但需要手動觸發(fā)一次全庫掃描。在“管理”頁面里找到“作業(yè)”選項可以看到幾個任務(wù)人臉檢測、人臉識別、智能搜索、重復檢測。新上傳的照片會自動進入隊列但已有的照片需要手動點“全部運行”。人臉檢測的速度取決于照片數(shù)量和CPU性能。我4萬張照片的庫全量跑完大概用了6個小時。期間樹莓派5的CPU一直滿載溫度穩(wěn)定在78度左右。如果你不想讓它一直滿負荷跑可以在設(shè)置里限制并發(fā)數(shù)比如把機器學習并發(fā)數(shù)設(shè)為1速度會慢一些但溫度更可控。智能搜索用的是CLIP模型可以用自然語言搜照片比如輸入“海邊日落”或者“生日蛋糕”它能找出語義相關(guān)的圖片。這個功能對中文的支持一般英文關(guān)鍵詞的準確率更高。我試過搜“dog on beach”確實能找出我家狗在海邊的照片挺神奇的。5. 外網(wǎng)訪問與安全加固讓照片隨時隨地能看5.1 內(nèi)網(wǎng)穿透方案的選擇照片服務(wù)器搭在內(nèi)網(wǎng)出門在外想看怎么辦最直接的辦法是路由器端口映射但這樣會把服務(wù)直接暴露在公網(wǎng)上風險很大。我不推薦這種做法除非你對自己的安全配置非常有信心。更穩(wěn)妥的方案是用內(nèi)網(wǎng)穿透工具把內(nèi)網(wǎng)服務(wù)映射到一個公網(wǎng)地址上。這類工具的原理是在你的樹莓派和一臺有公網(wǎng)IP的中轉(zhuǎn)服務(wù)器之間建立一條加密隧道外部請求先到中轉(zhuǎn)服務(wù)器再通過隧道轉(zhuǎn)發(fā)到樹莓派。這樣你的家庭網(wǎng)絡(luò)不需要開放任何端口安全性高很多。我用的方案是frp配合一臺便宜的云服務(wù)器做中轉(zhuǎn)。配置分兩部分云服務(wù)器上跑frps服務(wù)端樹莓派上跑frpc客戶端。frpc的配置文件里指定要映射的本地端口2283和遠程端口然后在中轉(zhuǎn)服務(wù)器上開放對應(yīng)的防火墻規(guī)則。# frpc.ini 示例 [common] server_addr 你的中轉(zhuǎn)服務(wù)器IP server_port 7000 token 你的認證令牌 [immich] type tcp local_ip 127.0.0.1 local_port 2283 remote_port 2283這樣配置完之后訪問http://中轉(zhuǎn)服務(wù)器IP:2283就能打開你的Immich了。但這樣是HTTP明文傳輸密碼和照片都會暴露。所以下一步必須上HTTPS。5.2 HTTPS證書與反向代理在中轉(zhuǎn)服務(wù)器上裝一個Nginx配置反向代理和Lets Encrypt證書。Nginx的配置大概是這樣server { listen 443 ssl; server_name photos.你的域名.com; ssl_certificate /etc/letsencrypt/live/photos.你的域名.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/photos.你的域名.com/privkey.pem; location / { proxy_pass http://127.0.0.1:2283; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 50000M; } }client_max_body_size這一行很關(guān)鍵默認的1MB限制會導致大視頻上傳失敗。我設(shè)成了50GB基本夠用。證書用certbot自動申請和續(xù)期一條命令搞定。5.3 安全加固的幾個必做項外網(wǎng)訪問開了之后安全就是頭等大事。我做了這幾件事第一關(guān)閉Immich的公開注冊。在管理設(shè)置里把“允許新用戶注冊”關(guān)掉只保留管理員手動創(chuàng)建賬號。否則任何人都能注冊進來翻你的照片。第二啟用雙因素認證。Immich支持TOTP配合手機上的驗證器App使用。多一道驗證密碼泄露了也不怕。第三限制登錄嘗試次數(shù)。在Nginx層面加一個limit_req規(guī)則防止暴力破解limit_req_zone $binary_remote_addr zonelogin:10m rate5r/m; location /api/auth/login { limit_req zonelogin burst3 nodelay; proxy_pass http://127.0.0.1:2283; }第四定期更新。Immich更新很頻繁安全補丁也發(fā)得快。我設(shè)了一個每周提醒看到新版本就抽時間升級。升級前先備份數(shù)據(jù)庫這個習慣救過我一次——有次升級后數(shù)據(jù)庫遷移失敗靠備份回滾才沒丟數(shù)據(jù)。6. 備份策略與故障排查別等丟了才后悔6.1 3-2-1備份原則的落地照片這東西丟了就真沒了。我遵循的是3-2-1原則3份數(shù)據(jù)2種介質(zhì)1份異地。具體到我的配置第一份樹莓派上的NVMe固態(tài)日常使用第二份外接USB機械硬盤每周自動同步一次第三份加密后上傳到對象存儲每月同步一次USB硬盤的同步用rsync寫一個腳本加到crontab里#!/bin/bash rsync -av --delete /mnt/photos/ /mnt/backup/photos/--delete參數(shù)會刪除目標端多余的文件保持兩邊完全一致。但用這個參數(shù)要小心萬一源目錄被誤刪目標端也會跟著刪。所以我額外加了一個快照機制每次同步前先在備份盤上創(chuàng)建一個硬鏈接快照保留最近4個版本。對象存儲那份用rclone做加密同步。rclone支持客戶端加密上傳前先把文件加密即使存儲服務(wù)商也看不到內(nèi)容。配置好之后一條rclone sync命令就能搞定。6.2 常見問題速查表下面這張表是我在實際運維中遇到過的典型問題和解決方法按出現(xiàn)頻率排序問題現(xiàn)象可能原因解決方法容器啟動后立即退出/dev/shm太小調(diào)整到512MB并重啟上傳大視頻失敗Nginx body限制設(shè)client_max_body_sizeAI識別卡住不動內(nèi)存不足限制并發(fā)數(shù)或加內(nèi)存手機備份斷連WiFi休眠關(guān)閉樹莓派WiFi省電模式縮略圖加載慢機械硬盤瓶頸換NVMe固態(tài)數(shù)據(jù)庫連接失敗密碼含特殊字符用引號包裹或換密碼外網(wǎng)訪問502frp隧道斷開檢查frpc進程和token照片時間錯亂時區(qū)配置錯誤檢查.env里的TZ6.3 幾個讓我印象深刻的坑第一個坑是文件權(quán)限。Immich容器默認以1000:1000的UID運行如果你的照片庫屬主不是這個UID容器就寫不進去。表現(xiàn)是上傳照片時提示“權(quán)限不足”但日志里看不出具體原因。解決辦法是在.env里加一行PUID你的UID和PGID你的GID或者在宿主機上把照片庫目錄的屬主改成1000。第二個坑是數(shù)據(jù)庫遷移。Immich版本更新時經(jīng)常伴隨數(shù)據(jù)庫結(jié)構(gòu)變更如果遷移過程中斷電或者磁盤滿數(shù)據(jù)庫會處于不一致狀態(tài)。我有一次升級到一半樹莓派過熱重啟結(jié)果Postgres起不來了。后來是靠pg_dump的每日備份恢復的。所以升級前手動備份數(shù)據(jù)庫這個步驟千萬別省。第三個坑是AI模型下載失敗。Immich的機器學習容器第一次啟動時會從網(wǎng)上下載模型文件如果網(wǎng)絡(luò)不穩(wěn)定下載會中斷容器反復重啟。解決辦法是手動下載模型放到model-cache目錄里或者配置一個穩(wěn)定的鏡像源。模型文件加起來大概1GB左右下載一次之后就不用再下了。第四個坑是溫度墻。樹莓派5的CPU在85度時會觸發(fā)降頻AI識別速度直接腰斬。我一開始用的是一個封閉的塑料外殼跑AI任務(wù)十分鐘就降頻。后來換了帶風扇的金屬殼溫度壓在75度以下識別速度穩(wěn)定了很多。如果你打算長期跑AI任務(wù)散熱上的投入不能省。7. 性能調(diào)優(yōu)與進階玩法7.1 讓AI識別跑得更快樹莓派5的CPU性能雖然不錯但跑AI推理還是有點吃力。我試過幾種優(yōu)化手段效果比較明顯的有兩個。第一個是量化模型。Immich默認用的模型是FP32精度我換成了INT8量化的版本識別速度提升了將近40%準確率只掉了不到2%。具體做法是修改機器學習容器的環(huán)境變量指定量化模型路徑。不過這個操作需要一定的模型轉(zhuǎn)換知識新手可以先跳過。第二個是限制并發(fā)數(shù)。聽起來反直覺但把并發(fā)數(shù)從默認的4降到2之后整體吞吐量反而提高了。原因是并發(fā)太高會導致CPU頻繁切換上下文緩存命中率下降。降到2之后每個任務(wù)能獨占核心完成時間更短。這個參數(shù)在Immich的管理設(shè)置里就能改。7.2 用樹莓派的GPU加速樹莓派5的VideoCore VII GPU支持OpenCL理論上可以用來加速AI推理。Immich的機器學習后端支持ONNX Runtime而ONNX Runtime有ARM64的OpenCL版本。我嘗試編譯了一個支持OpenCL的ONNX Runtime替換掉容器里的默認版本人臉檢測速度提升了約25%。不過這個過程比較折騰需要自己編譯ONNX Runtime還要確保OpenCL驅(qū)動正確安裝。如果你不想折騰CPU版本已經(jīng)夠用了。等Immich官方支持GPU加速之后再跟進也不遲。7.3 照片庫的自動化整理Immich本身提供了相冊和標簽功能但自動化程度有限。我寫了一個Python腳本定期掃描照片庫根據(jù)EXIF信息自動打標簽。比如檢測到GPS坐標在北京就自動加“北京”標簽檢測到拍攝設(shè)備是某款相機就加對應(yīng)的設(shè)備標簽。import exifread import requests def tag_photo(photo_path, immich_api_key): with open(photo_path, rb) as f: tags exifread.process_file(f) # 提取GPS、設(shè)備、時間等信息 # 調(diào)用Immich API打標簽 pass這個腳本配合crontab每天跑一次新照片會自動歸類。雖然Immich的AI已經(jīng)能做人臉和場景識別但基于EXIF的規(guī)則打標簽更精準兩者互補。7.4 多用戶與共享相冊Immich支持多用戶每個用戶有自己的照片庫互相隔離。我給家里人每人開了一個賬號他們各自備份自己的照片互不干擾。同時我建了一個“家庭共享”相冊把大家的合照放進去所有人都能看到。共享相冊的權(quán)限管理做得不錯可以設(shè)置只讀或者可編輯。我建議默認給只讀權(quán)限避免有人誤刪照片。如果要做協(xié)作編輯再單獨開權(quán)限。8. 這套方案還能怎么擴展照片服務(wù)器跑通之后我陸續(xù)加了一些周邊功能。比如用rclone把照片同步到電視上通過DLNA在客廳大屏瀏覽用Home Assistant做了一個自動化檢測到有人回家就自動備份手機照片還接了一個舊平板掛在墻上做成電子相冊循環(huán)播放家庭照片。樹莓派5的PCIe接口還空著一個通道我打算后面加一塊AI加速卡把大模型推理也跑起來。到時候照片服務(wù)器就不只是照片服務(wù)器了而是一個完整的家庭AI中樞。這個方向值得持續(xù)折騰等有新進展再跟大家分享。提示如果你也想做電子相冊Immich有一個“回憶”功能會自動生成“去年今日”之類的合集。配合平板上的瀏覽器全屏模式效果很不錯。最后說一個我個人的小習慣每次折騰完一個新功能我都會在/opt/docker/immich目錄下留一個NOTES.md記錄這次改了什么、遇到什么問題、怎么解決的。下次再出問題翻筆記比翻日志快得多。這個習慣幫我省了無數(shù)時間推薦你也試試。