SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

Immich 裝在 Synology/QNAP NAS 上,還是租一台 VPS?

Synology 的 Container Manager 與 QNAP 的 Container Station 都跑得動 Immich,但 6 GB 記憶體和 x86-64-v2 是門檻。教你用三行指令驗機、哪種「NAS 當儲存」要拒絕,以及 NAS 配 VPS 做異地備份與遠端機器學習的搭配。

先說結論:三種人,三種答案

Immich 要不要裝在 Synology 或 QNAP 上,取決於架上那台 NAS 的 CPU 和記憶體,跟品牌無關。Immich 官方需求頁(2026-09-17 查閱)寫得很清楚,而且這些數字每隔幾個版本就會改,所以下面每一個門檻都附上查閱日期。

ChartImmich 記憶體門檻(docs.immich.app 需求頁,2026-09-17 查閱)
The data behind this chart
[
  {
    "config": "\u5b8c\u6574\u5b89\u88dd\uff0c\u6700\u4f4e",
    "ram_gb": 6
  },
  {
    "config": "\u5b8c\u6574\u5b89\u88dd\uff0c\u5efa\u8b70",
    "ram_gb": 8
  },
  {
    "config": "\u95dc\u9589\u6a5f\u5668\u5b78\u7fd2\uff0c\u6700\u4f4e",
    "ram_gb": 4
  },
  {
    "config": "\u53ea\u7b97 Postgres \u8cc7\u6599\u5eab",
    "ram_gb": 2
  }
]

完整安裝(含機器學習)最低要 6 GB 記憶體,建議 8 GB。把機器學習關掉,可以降到 4 GB。其中光是 Postgres 資料庫就要 2 GB。CPU 最少 2 核心、建議 4 核心,而且從 Immich v3 起,amd64 平台的機器學習容器要求 CPU 至少是 x86-64-v2 這個微架構等級。

所以答案分三種人。手上有一台過得了門檻的 x86 NAS:Immich 裝在 NAS 上,VPS 拿來放異地備份,並且當對外的入口。手上是 ARM 機型,或是記憶體只有 4 GB 的機型:照片留在 NAS,機器學習搬到 VPS 上跑,兩邊用 Tailscale 私網相連;記憶體連 4 GB 都不到的,Immich 整套搬到 VPS,NAS 退居備份目的地。沒有 NAS 的人:直接租一台 68 GB 的 VPS,照 在 VPS 上自架 Immich 取代 Google 相簿 那篇做。

只有一種組合要拒絕:Immich 跑在 VPS 上,Postgres 資料庫放在用 SMB 或 NFS 掛回來的 NAS 共用資料夾。原因下面會講。

內建的 Synology Photos 和 QuMagie 不夠用嗎?

誠實的答案是:對很多人夠用。手機自動備份、時間軸、分享連結、人臉分組,Synology Photos 和 QuMagie 都有,其中人臉與物件辨識在部分機型才提供,以兩家規格頁為準。如果你要的只是「手機照片自動進 NAS,偶爾翻一翻」,內建 app 就是正確答案,不需要為了裝而裝。

Immich 真正不一樣的地方有四個。第一是語意搜尋:它用 CLIP 這類模型把每張照片轉成向量,你可以打「海邊的狗」或「夜市的攤販」直接找,不需要事先下標籤。預設模型偏英文,官方搜尋說明頁建議單一非英語語言的使用者換 nllb 系列模型,中英混用的人換 xlmsiglip2 系列;改模型的位置在 Administration > Settings > Machine Learning Settings > Smart Search,改完要到 Jobs 頁重跑一次索引。第二是資料不綁品牌:Immich 的全部狀態就是 UPLOAD_LOCATION 那個資料夾加一份資料庫傾印,今天在 NAS,明年搬到 VPS,或反過來,還原就好,不用重新整理相簿。第三是手機 app 在 iOS 與 Android 上是同一套開源程式,換了後端也不用換 app。第四是開源本身:需求會變、功能會加,但你看得到 issue,也能自己決定什麼時候升級。

如果你在 Immich 和另一個開源相簿之間猶豫,PhotoPrism 與 Immich 的差異 那篇有比較,這裡不重複。

先驗機:你的 NAS 過得了 Immich 的門檻嗎?

不要用機型猜。SSH 進 NAS,三行指令就知道。Synology 的 SSH 帳號屬於 administrators 群組,讀 /proc 不需要 sudo;QNAP 以 admin 登入本來就是 root。

uname -m
grep MemTotal /proc/meminfo
grep -o -w -E 'cx16|lahf_lm|popcnt|pni|sse4_1|sse4_2|ssse3' /proc/cpuinfo | sort -u | wc -l

uname -m 印出 x86_64 就是 Intel 或 AMD 機型,印出 aarch64 就是 64 位元 ARM 機型。MemTotal 的單位是 kB,6 GB 大約是 6000000 kB 上下,看到 3900000 附近就是 4 GB 機型,看到 1900000 附近就是 2 GB。第三行數的是 x86-64-v2 要求的七組指令集旗標:cx16lahf_lmpopcntpni(就是 SSE3)、sse4_1sse4_2ssse3。印出 7 就過關,少一個都不行,因為機器學習容器裡的程式是照 x86-64-v2 編譯的,CPU 少了任何一組指令,程序在碰到那條指令時會被核心用 SIGILL(非法指令)訊號殺掉。Immich 的 FAQ 直接寫明:機器學習服務的 log 如果出現 SIGILL 或 error code 132,多半代表這台伺服器的 CPU 與 Immich 不相容。大致上,2013 年以後的 Intel Celeron、Pentium、Core 系列和所有 AMD Ryzen 都過得了,會踩到的是更老的 Atom 世代,但「大致上」不算數,跑指令才算數。

ARM 機型(aarch64)沒有 x86-64-v2 這一關,Immich 有提供 arm64 映像檔。問題在另外兩個地方:這類兩盤位機型出廠記憶體多半只有 1 GB 或 2 GB,連關掉機器學習的 4 GB 門檻都不到,而且能不能擴充要看規格頁;就算記憶體夠,用 NAS 的 ARM 核心跑 CLIP 模型,一張照片要等的時間會讓你關掉它。

另一件事:NAS 的容器套件裝得上,不代表 Immich 跑得動。Synology 的 Container Manager 從 DSM 7.2 起取代舊的 Docker 套件,2026-09-17 在 Synology 的下載封存看到的最新版是 24.0.2,只提供 x86_64armv8 兩種套件,32 位元 ARM 的老機型裝不了;它的 Project 功能可以直接貼 Compose 檔。QNAP 的 Container Station 對 Docker 的要求是 64 位元 x86 或 ARM、或 32 位元 ARM 的機型,記憶體 1 GB,QTS 4.2.6 或 QuTS hero h4.5.0 以上,Applications 功能同樣吃 Compose YAML。這些門檻都比 Immich 低很多,所以套件頁面上的「支援」兩個字,對 Immich 沒有參考價值。

還有一個會在第一次 docker compose up 就撞到的坑。Container Manager 的版號 24.0.2 就是它內含的 Docker Engine 版本,而 Immich 官方安裝頁寫明:Docker Engine 25 以前的版本會對 docker-compose.ymldatabase 區段的 start_interval 報錯,解法是把那一行註解掉。先看引擎版本:

sudo docker version

Server: 底下的 Version: 小於 25,就先去改檔案再啟動。QNAP 上不用加 sudo

「Immich 用 NAS 當儲存」:哪一種可以,哪一種要拒絕

PTT 上最常見的想法是:VPS 便宜的方案硬碟小,那就把 Immich 跑在 VPS,儲存用 SMB 或 NFS 掛回家裡的 NAS。這個想法要拆成兩半看,因為 Immich 有兩個存資料的地方,規則完全不同。

第一半是 DB_DATA_LOCATION,Postgres 資料庫的檔案。需求頁的原話是:資料庫檔案通常只有 1 到 3 GB,所以 DB_DATA_LOCATION 最好放本機 SSD,「never a network share of any kind」,任何形式的網路共用都不行。安裝頁對同一個變數再講一次:「Network shares are not supported」。FAQ 談資料庫損毀時,把「用網路共用放 Postgres 資料」和意外斷電、SD 卡列在同一排原因裡。機制是這樣:Postgres 靠 fsync 和檔案鎖來保證寫入落盤的順序,SMB 和 NFS 對這兩件事的語意都不完整,加上跨網路一次斷線或重新掛載,資料庫就會在你不知道的時候壞掉,然後在幾週後某次升級遷移時才爆出來。1 到 3 GB 的東西,沒有任何理由不放本機。這一半的答案是:拒絕。

第二半是 UPLOAD_LOCATION,也就是照片本體。Immich 允許把 NAS 的共用資料夾以「外部圖庫」(external library)的方式掛進 immich-server 容器,官方範例就是 /mnt/nas/christmas-trip:/mnt/media/christmas-trip:ro,用 :ro 唯讀掛載,Immich 就不會動到原檔。但同一頁也警告:照片在網路磁碟上時,自動監看變更多半不會動,要靠定期重新掃描。這在同一個區網裡是可行的,NAS 上的 Immich 掛另一個共用資料夾就是這種用法。跨網路就不行了:VPS 上的 Immich 每讀一張縮圖,都要等家裡那條光纖的上傳頻寬走一趟,台灣家用光纖的上傳常只有下載的幾分之一,你在手機上每捲一頁時間軸,就是幾十次這樣的來回。而且手機備份上傳的新照片會落在 UPLOAD_LOCATION,也就是 VPS 本機,NAS 上根本沒有。這一半的答案是:區網內可以,跨網路不要。

所以「VPS 跑 Immich、NAS 當儲存」這句話,實際上沒有一種切法說得通。資料庫不能過網路,照片過網路又慢。放棄它,改用下面三種搭配。

搭配一:NAS 跑 Immich,VPS 存異地備份

這是最多人該用的組合。NAS 是主機,VPS 上只放一份用 restic 加密過的備份,VPS 的硬碟只需要裝得下原始檔。哪些東西要備份,官方備份頁講得很明確:UPLOAD_LOCATION 底下的 libraryuploadprofile 三個資料夾是原始內容,一定要備;thumbsencoded-video 可以重算,可以跳過。資料庫則要用 pg_dump 傾印出來,不要直接複製 DB_DATA_LOCATION 裡的檔案,因為 Postgres 執行中複製出來的資料檔內部狀態不一致,還原時不一定能開。

Immich 自己每天凌晨 2:00 會傾印一次資料庫到 UPLOAD_LOCATION/backups,預設保留 14 份,但這些傾印只有中繼資料,沒有照片。你也可以自己傾印,路徑用 Synology 的慣例 /volume1/docker/immich,QNAP 換成 /share/Container/immich

sudo docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /volume1/docker/immich/db-dump.sql.gz

--dbname--username 要跟 .env 裡的 DB_DATABASE_NAMEDB_USERNAME 一致。順序是先傾印資料庫,再備份檔案:這樣資料庫裡引用到的每個檔案,備份裡一定都有;反過來做,傾印裡可能出現備份時還不存在的檔案。接著把三個資料夾和傾印一起推到 VPS:

restic -r sftp:backup@203.0.113.10:/srv/restic/immich backup \
  /volume1/docker/immich/library \
  /volume1/docker/immich/upload \
  /volume1/docker/immich/profile \
  /volume1/docker/immich/db-dump.sql.gz
restic -r sftp:backup@203.0.113.10:/srv/restic/immich snapshots

restic 是單一個靜態執行檔,SSH 進 NAS 放到 /volume1 底下就能跑,倉庫第一次要先 restic init,密碼用 RESTIC_PASSWORD_FILE 指到一個只有 root 讀得到的檔案。不想碰指令的人,Hyper Backup 和 HBS 3 都能把同一組資料夾推到 VPS 上的 rsync 目的地。第二行 snapshots 應該列出剛才那一份快照,列不出來就是沒推上去。VPS 那端的 restic 倉庫怎麼開、還原怎麼做、還原後為什麼要重跑縮圖工作,Immich 的備份與還原 那篇從頭走一遍。要選多大的 VPS,讀 儲存型 VPS 與家用 NAS 的取捨,或者直接照 把整台 NAS 備份到儲存型 VPS 的作法,把 Immich 的資料夾當成其中一個備份來源就好。

搭配二:NAS 跑 Immich,靠 Tailscale 或 VPS 反向代理對外

Immich 的手機 app 需要在外面也連得到伺服器,否則背景備份就只在家裡的 Wi-Fi 才會跑。台灣家用網路的現實是:中華電信浮動 IP 要另外申請固定制,4G 或 5G 分享器多半在 CGNAT(carrier-grade NAT,電信商端的網路位址轉換)後面,根本沒有公網 IP 可以轉埠。就算有,把 NAS 的 2283 埠直接開到公網,等於把一個有登入頁的 web 服務暴露給整個網際網路掃。

第一層解法是 Tailscale。Synology 的 Package Center 直接搜 Tailscale 安裝;QNAP 的 App Center 也有,提供 x86-64 與 arm64 版本。裝好登入後,手機也裝 Tailscale,Immich app 的伺服器位址填 NAS 的 tailnet IP 加 2283 埠,家裡的路由器一個埠都不用開。DSM 7 有一個要注意的地方:Tailscale 的 Synology 說明頁寫明,NAS 上其他程式(包括容器)要主動連到 tailnet 上別的節點,得先啟用 TUN 裝置,作法是在 Task Scheduler 加一個開機觸發的 root 工作,內容是 /var/packages/Tailscale/target/bin/tailscale configure-host; synosystemctl restart pkgctl-Tailscale.service,而且每次 Tailscale 套件升級後要再跑一次。搭配三會用到這一條。細節和為什麼這比轉埠安全,見 用 Tailscale 取代路由器轉埠。

第二層是給「家人不想裝 Tailscale」的情況:分享連結要能給任何人點開。這時 VPS 上跑一個 Caddy 當反向代理,VPS 也加入同一個 tailnet,Caddy 把公網流量轉到 NAS 的 tailnet IP。Caddyfile 只要這樣:

photos.example.com {
    reverse_proxy 100.101.102.103:2283
}

Caddy 會自動用 ACME(automatic certificate management environment,自動憑證管理協定)向 Let's Encrypt 申請 TLS 憑證。這個架構下,公網上唯一看得到的是 VPS,NAS 仍然一個埠都沒開,手機備份的流量會經過 VPS 再進 tailnet 到 NAS。缺點也要說:上傳流量繞了一趟 VPS,走 VPS 的頻寬額度。另一條路是 Cloudflare Tunnel,一樣不開埠,作法見 用 Cloudflare Tunnel 不開任何埠對外服務,但要注意 Cloudflare 免費方案對單一 HTTP 請求有 100 MB 的上限,手機上長一點的影片會上傳失敗,自己的 VPS 反向代理沒有這個限制。

搭配三:弱 NAS 留照片,VPS 跑機器學習

這是給「x86 但只有 4 GB」和「CPU 過不了 x86-64-v2」兩種機型的解法。Immich 的架構本來就把機器學習拆成獨立的 immich-machine-learning 容器,immich-server 透過 HTTP 把工作丟給它。官方有一頁「Remote Machine Learning」就是講這個:NAS 上不跑機器學習容器,VPS 上只跑機器學習容器,NAS 上的伺服器指向 VPS。

先講安全,因為這一段的規則沒有商量餘地。官方那一頁的原話:機器學習容器「has no security measures whatsoever」,沒有任何安全機制,請注意它部署在哪裡、誰連得到它。同一頁也寫明:「Image previews are sent to the remote machine learning container」,也就是照片的預覽圖會傳到遠端。所以這個 3003 埠只能綁在 tailnet 或私網位址上,永遠不能綁在 VPS 的公網 IP。做法是在 compose 裡把埠綁到 VPS 的 tailnet IP,而不是預設的 0.0.0.0

VPS 上先裝 Tailscale 並登入,用 tailscale ip -4 取得它的 tailnet IP(下面用 100.101.102.103 代替),然後只跑這一個服務,映像檔、埠和快取磁碟區都照官方那一頁:

name: immich-ml
services:
  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    ports:
      - "100.101.102.103:3003:3003"
    restart: always

volumes:
  model-cache:
docker compose up -d
ss -ltn | grep 3003

ss 應該只列出 100.101.102.103:3003,看到 0.0.0.0:3003*:3003 就是綁錯了,停掉重來。IMMICH_VERSION 要和 NAS 那邊的 .env 釘在同一個版本,兩邊各自追 release 遲早有一天一邊先升級,模型格式對不上。

回到 NAS 上的 Immich 後台:Administration > Settings > Machine Learning Settings,按 Add URL,填 http://100.101.102.103:3003。官方頁面說明了兩種選法:在原本的本機 URL 旁邊加一個新的,VPS 連不上時會退回本機容器處理;直接把原本的 URL 換掉,就只用 VPS,VPS 掛掉時要自己到 Jobs 頁面重跑。4 GB 的 NAS 沒有本機容器可以退,選後者,並且在 compose 裡把 immich-machine-learning 區段整個註解掉,因為 FAQ 寫明只在後台關掉工作並不會讓那個容器不啟動。存檔後到 Jobs 頁重跑 Smart Search,VPS 上 docker logs -f immich_machine_learning 應該開始出現處理紀錄;一直沒有動靜,先用搭配二裡那條 TUN 工作檢查 DSM 7 上的容器到底出不出得了 tailnet。

第一次建索引時,整個圖庫的預覽圖都要從家裡的上傳頻寬送出去,幾萬張照片會跑一晚以上,這是一次性的成本,之後只有新照片會傳。VPS 的規格可以先看 Immich 的記憶體與儲存需求 裡機器學習那一段,這台 VPS 不存照片,硬碟只要放得下模型快取。

決定:你屬於哪一列

有一台過門檻的 x86 NAS

七組旗標齊全,記憶體 6 GB 以上。Immich 裝在 NAS 上,全部功能都開。VPS 做搭配一的異地備份,再加搭配二的 Tailscale 或反向代理對外。這是最省錢也最不折騰的一列,VPS 只需要硬碟裝得下原始檔,記憶體最小方案就夠。

有 ARM 機型,或記憶體不夠的 x86 機型

分兩種。x86 而只有 4 GB:照片留 NAS,走搭配三把機器學習丟到 VPS,或者乾脆關掉機器學習,只把 Immich 當手機備份和時間軸用,兩種都合法,差別在你要不要語意搜尋。ARM 而記憶體不到 4 GB:把 Immich 整套搬到 VPS 上跑,UPLOAD_LOCATION 也在 VPS,NAS 改當備份目的地,把搭配一反過來做,用 restic 或 rsync 從 VPS 拉回 NAS。這一列的 VPS 硬碟要裝得下整個圖庫,方案怎麼選,看 Immich 的記憶體與儲存需求

沒有 NAS

直接租 VPS,記憶體 8 GB 的方案跑完整 Immich,6 GB 是底線。但要記得一台 VPS 上的照片只有一份,不算備份,restic 推到第二個地方(另一台儲存型 VPS,或朋友家的 NAS)才算。想先評估「買 NAS 還是租 VPS」這個更上游的問題,儲存型 VPS 與家用 NAS 的取捨 那篇的算法可以直接套。

這些數字會變

Immich 的硬體門檻在大版本之間會改,x86-64-v2 這條就是 v3 才加進來的。上面所有數字都以 2026-09-17 查閱的官方需求頁為準,你讀到這篇時,先回 docs.immich.app 的 Requirements 頁再對一次,然後在 NAS 上重跑驗機那三行指令。記憶體門檻往上調,最先出局的就是 4 GB 那一列。

FAQ

Immich 的 Postgres 資料庫可以放在 NAS 的 SMB 或 NFS 共用資料夾嗎?

不行。Immich 官方需求頁對 DB_DATA_LOCATION 的原話是「never a network share of any kind」,安裝頁也寫「Network shares are not supported」。Postgres 靠 fsync 與檔案鎖保證寫入順序,SMB 和 NFS 的語意不完整,一次斷線或重新掛載就可能讓資料庫壞掉,而且往往幾週後才發現。資料庫檔案通常只有 1 到 3 GB,放在跑 Immich 那台機器的本機硬碟上就好。

我的 Synology 或 QNAP 只有 4 GB 記憶體,能跑 Immich 嗎?

可以,但要關掉機器學習,或把機器學習搬到別台機器。官方需求頁(2026-09-17 查閱)寫完整安裝最低 6 GB,只有 4 GB 的系統可以在停用機器學習功能的情況下執行。停用的位置在 Administration > Settings > Machine Learning Settings,並且要在 docker-compose.ymlimmich-machine-learning 區段註解掉,否則那個容器還是會啟動吃記憶體。想保留語意搜尋,就把機器學習容器放到 VPS 上,兩邊用 Tailscale 相連。

遠端機器學習容器放在 VPS 的公網埠上會怎樣?

任何人都能對它送請求,而且照片預覽圖會經過那條線。官方遠端機器學習頁明寫這個容器「has no security measures whatsoever」,並且「Image previews are sent to the remote machine learning container」。它沒有帳號密碼,也沒有 TLS。所以 3003 埠只能綁在 tailnet 或私網 IP 上,compose 裡寫成 "100.101.102.103:3003:3003" 這種形式,用 ss -ltn | grep 3003 確認沒有 0.0.0.0:3003

既然 NAS 內建 Synology Photos 或 QuMagie,為什麼還要裝 Immich?

不一定要。手機自動備份、時間軸、分享、人臉分組,內建 app 都有,人臉與物件辨識在部分機型才提供。Immich 多出來的是 CLIP 語意搜尋(換成 nllb 系列模型可以用中文描述找照片)、資料不綁品牌(一個資料夾加一份資料庫傾印就能整套搬到 VPS 或搬回來)、iOS 與 Android 共用同一套開源手機 app,以及原始碼公開。如果這幾樣你用不到,內建 app 就是正確答案。

Container Manager 或 Container Station 裝得上,代表 Immich 跑得動嗎?

不代表。Synology 的 Container Manager 提供給 DSM 7.2 以上的 x86_64 與 armv8 機型,QNAP 的 Container Station 對 Docker 只要求 1 GB 記憶體,這些門檻遠低於 Immich 的 6 GB 與 x86-64-v2。SSH 進 NAS 跑 uname -mgrep MemTotal /proc/meminfo,再數 /proc/cpuinfo 裡的七組旗標,才是真正的驗機。另外 Container Manager 24.0.2 內含的 Docker Engine 低於 25,Immich 安裝頁寫明要把 docker-compose.ymldatabase 區段的 start_interval 那一行註解掉,否則第一次啟動就會報錯。

#immich#synology#qnap#nas#self-hosting#photos