SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-28

Immich self-host: cần bao nhiêu RAM và nâng cấp an toàn

Biết con số RAM thực tế, chạy port 2283 sau HTTPS, xử lý lỗi exit 137 và vì sao Immich v3 không khởi động với database pgvecto.rs. Có bước restore.

Bạn đang xây dựng gì

Immich là một dịch vụ tự host để sao lưu ảnh và video, thay thế thực sự cho Google Photos. Dịch vụ có ứng dụng điện thoại tự động upload camera roll ở chế độ nền, timeline, album, nhận diện khuôn mặt và tìm kiếm machine learning có thể tìm “bãi biển” hoặc một người mà bạn không cần gắn tag thủ công. Bạn chạy dịch vụ trên VPS của mình, file gốc vẫn nằm trên disk và không ai quét chúng để bán sản phẩm cho bạn. Nếu vẫn đang cân nhắc Immich với lựa chọn rõ ràng còn lại, bài so sánh PhotoPrism và Immich của chúng tôi đặt mức RAM tối thiểu, ứng dụng điện thoại và lệnh sao lưu của hai bên cạnh nhau.

Quá trình cài đặt gồm bốn container từ file Docker Compose do chính project cung cấp. Phần đó mất khoảng mười phút. Phần còn lại của hướng dẫn này mới là nơi phát sinh vấn đề: container machine learning ngốn nhiều memory trên máy cấu hình nhỏ, file gốc nhanh chóng chiếm hết disk, ứng dụng mobile từ chối server chỉ chạy HTTP, và Immich thường xuyên release các breaking change đến mức một docker compose pull bất cẩn có thể khiến database không khởi động được. Hãy xử lý nghiêm túc cả bốn vấn đề này thì Immich sẽ hoạt động rất ổn định. Bỏ qua chúng và bạn có thể mất cả một cuối tuần.

Điều kiện cần và những điểm cần lưu ý

  • RAM: tài liệu chính thức yêu cầu tối thiểu 6 GB và khuyến nghị 8 GB; hãy xem 4 GB cộng với swap là mức sàn tuyệt đối. Các container immich-server và Postgres dùng ít tài nguyên. Container immich-machine-learning mới là thành phần ngốn RAM: nó nạp các model CLIP và nhận diện khuôn mặt vào RAM để tạo search index, và trên máy 2 GB, kernel sẽ kill container này. Hãy thêm swap ngay cả khi bạn có 4 GB.
  • Disk: hãy tính theo toàn bộ thư viện của bạn, rồi chừa thêm dung lượng. Ảnh gốc được sao chép đầy đủ. Immich cũng tạo thumbnail và ảnh preview, thường tăng thêm khoảng 10–20%. Một bộ sưu tập ảnh 200 GB cần volume 300 GB. Postgres nhỏ hơn nhiều nếu so với phần này.
  • CPU: mọi KVM VPS hiện đại đều dùng được, nhưng chạy ML trên CPU sẽ chậm. Việc lập index smart-search cho một lần import lớn có thể chạy hàng giờ trong background. Đây là điều bình thường; không cần GPU.
  • Một domain name trỏ đến VPS. Mobile app ưu tiên mạnh một endpoint HTTPS, và bạn nên đặt reverse proxy ở phía trước. Kiểu triển khai này giống với instance Nextcloud tự host bằng Docker, TLS và backup, còn Immich là phiên bản quản lý ảnh tương ứng với file server đó.
  • Docker và Compose plugin đã được cài đặt. Hãy dùng Docker Engine cùng Compose v2 plugin từ apt repository chính thức của Docker, đúng như hướng dẫn trong guide cơ bản về Docker Compose của chúng tôi.

Bước 1: Thêm swap trước mọi việc khác

Lỗi Immich phổ biến nhất trên VPS nhỏ là container ML bị OOM kill. Trước tiên, hãy cấp cho kernel một vùng để sử dụng khi thiếu RAM.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h

free -h lúc này phải hiển thị một dòng Swap:4.0Gi. Việc này không làm ML chạy nhanh hơn, nhưng ngăn container bị dừng giữa chừng khi lập chỉ mục trên máy 4 GB.

Bước 2: Tải compose và env chính thức, dùng trực tiếp file của họ, không dùng bản sao

Immich cố định phiên bản của các service và, quan trọng hơn, cả image database trong các file được phát hành kèm. Không dán file compose từ một blog, kể cả blog này, làm nguồn cấu hình chuẩn. Tải các release asset:

sudo mkdir -p /opt/immich && cd /opt/immich
sudo wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

Các file này đến từ tagged release nên các tham chiếu image khớp nhau. File compose định nghĩa 4 service. Bạn nên biết chức năng của từng service trước khi chỉnh bất kỳ thứ gì:

  • immich-server (ghcr.io/immich-app/immich-server, container immich_server), API và web UI, lắng nghe trên port 2283. Service này mount thư mục upload của bạn tại /data.
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning, container immich_machine_learning), tìm kiếm bằng CLIP và nhận diện khuôn mặt. Service này cache các model đã tải trong volume model-cache. Đây là service ngốn nhiều memory.
  • database (container immich_postgres), Postgres với extension vector VectorChord, dùng cho tìm kiếm tương đồng. Image tag được pin bằng digest ngay trong file compose, ví dụ ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:.... Các setup cũ dùng pgvecto.rs; Immich đã gỡ hỗ trợ cho nó từ v3.0, nên mọi cài đặt mới hiện nay đều dùng VectorChord. Không tự chỉnh sửa tag này.
  • redis (container immich_redis), một instance Valkey/Redis dùng cho job queue.

Bước 3: Cấu hình .env, nơi lưu ảnh và database

Mở .env và đặt 4 giá trị. Giữ nguyên mọi thứ bên dưới dòng được đánh dấu.

# Where original uploads are stored on the host
UPLOAD_LOCATION=/opt/immich/library

# Where the Postgres data lives. NEVER put this on an NFS/network share.
DB_DATA_LOCATION=/opt/immich/postgres

# "v3" is a floating tag that tracks the latest v3.x. Pin a full tag like
# v3.0.2 instead — then you upgrade on purpose, not by surprise.
IMMICH_VERSION=v3.0.2

# Change this to a long random string. Letters and digits only.
DB_PASSWORD=REPLACE_WITH_A_LONG_RANDOM_STRING

# Set your timezone so timestamps and "on this day" line up
TZ=Europe/London

###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Có 2 quy tắc giúp tránh sự cố. UPLOAD_LOCATION nên trỏ đến ổ đĩa lớn của bạn. Nếu sau này bạn gắn thêm data volume, hãy đặt giá trị này thành đường dẫn mount của volume ngay từ đầu, vì đổi sau đó đồng nghĩa với việc phải di chuyển thumbnail và cập nhật đường dẫn asset. DB_DATA_LOCATION phải nằm trên local disk: Postgres trên NFS hoặc SMB share sẽ bị corrupt, và tài liệu đã ghi rõ điều này. Chỉ dùng chữ cái và chữ số trong DB_PASSWORD để tránh một nhóm lỗi escape trong connection string.

Bước 4: Chạy lần đầu và tạo user admin

cd /opt/immich
sudo docker compose up -d
sudo docker compose ps

Kết quả đúng là có bốn container, tất cả đều ở trạng thái running và cuối cùng chuyển sang healthy:

NAME                      STATUS
immich_machine_learning   Up (healthy)
immich_postgres           Up (healthy)
immich_redis              Up (healthy)
immich_server             Up (healthy)

Lần up đầu tiên sẽ pull vài gigabyte image, vì vậy hãy chờ cho đến khi hoàn tất. Theo dõi tiến trình bằng sudo docker compose logs -f immich-server; server sẽ ghi log rằng đang listen trên port 2283 khi sẵn sàng. Mở http://YOUR_SERVER_IP:2283 trong trình duyệt. Lần truy cập đầu tiên sẽ hiển thị wizard Getting Started; account đầu tiên bạn tạo sẽ là admin. Đặt mật khẩu mạnh. Account này quản lý các thiết lập của server, user và cấu hình ML mà bạn sẽ cần ở các bước sau.

Bước 5: Ứng dụng di động và backup chạy nền

Cài đặt "Immich" từ App Store hoặc Play Store. Trên màn hình đăng nhập, ứng dụng yêu cầu Server Endpoint URL. Nhập URL đầy đủ, bao gồm scheme, ví dụ https://photos.example.com (ứng dụng tự thêm /api). Đăng nhập bằng tài khoản bạn vừa tạo, mở màn hình Backup của ứng dụng, chọn các album cần bảo vệ (thường là Camera và Screenshots), rồi bật Background backup. iOS giới hạn tốc độ backup chạy nền; việc upload khi ứng dụng đang ở foreground luôn chạy, còn upload chạy nền chỉ diễn ra khi OS cho phép.

Đây là chỗ nhiều người bị mắc kẹt, vì vậy hãy đọc Bước 6 trước khi cố xử lý ứng dụng.

Bước 6: HTTPS qua reverse proxy và quy tắc URL đầy đủ

Ứng dụng mobile thực sự cần HTTPS. Đặt một reverse proxy phía trước cổng 2283 và thực hiện TLS termination tại đó. Nếu bạn đang chạy nhiều container, Traefik với TLS tự động cho nhiều ứng dụng Docker là lựa chọn gọn nhất. Chỉ một block label sẽ định tuyến photos.example.com đến container immich-server và tự lấy certificate cho bạn. Nếu bạn thích nginx hơn, hướng dẫn Let's Encrypt với Certbot và nginx sẽ cấp certificate và tạo block proxy_pass http://127.0.0.1:2283;. Khi đã có proxy, thêm service tiếp theo chủ yếu chỉ là tạo một subdomain mới. Đây là cách một media front end như Halcyon, giao diện cửa hàng video thập niên 90 cho Jellyfin có thể chạy cùng Immich trên cùng một máy. Điều tương tự cũng áp dụng cho HarnessRouter tự host, đưa Codex và Claude Code ra sau một API duy nhất. Service này cố ý bind vào loopback và chỉ có thể truy cập được sau khi proxy thực hiện TLS termination phía trước. Vì vậy, hãy đổi thông tin đăng nhập mặc định trước khi trỏ một subdomain đến nó. Tuy nhiên, không phải container nào cũng cần hostname public. Một công cụ chỉ dành cho admin như open-kritt, công cụ quét bảo mật tự host nên hoàn toàn nằm ngoài proxy. Chỉ truy cập UI của công cụ này qua SSH tunnel khi thực sự cần. Một số service khác không dùng proxy vì chúng không giao tiếp bằng HTTP. RustDesk relay server tự host là ví dụ rõ nhất. Service này lắng nghe trên một số cổng TCP và UDP thô, nên cần firewall rules thay vì subdomain. Có một thiết lập proxy cần lưu ý với Immich: tăng giới hạn kích thước upload vì video từ điện thoại thường lớn. Trong nginx, thiết lập đó là client_max_body_size 50000M; bên trong server block. Giá trị mặc định 1 MB sẽ từ chối video upload với 413 Request Entity Too Large.

Quy tắc mà ứng dụng áp dụng là endpoint phải có thể truy cập được và trên thực tế phải dùng HTTPS. Endpoint http:// hoặc địa chỉ IP trực tiếp nhưng không ghi cổng là nguyên nhân dẫn đến lỗi “ứng dụng không thể truy cập server”, được mô tả dưới đây dưới dạng một lỗi có tên.

Bước 7: Thư viện bên ngoài và nội dung tải lên, nhập cây ảnh hiện có

Có hai cách để ảnh được đưa vào Immich, và chúng không giống nhau.

  • Nội dung tải lên là các asset do Immich quản lý. Ứng dụng hoặc trình tải lên trên web sao chép file vào UPLOAD_LOCATION. Immich có thể đổi tên, di chuyển và xóa các file này.
  • Thư viện bên ngoài là các file chỉ được nhập ở chế độ chỉ đọc. Các file này đã nằm trong một thư mục trên server, một cây Pictures cũ hoặc bản export từ NAS. Immich lập chỉ mục ngay tại vị trí đó và hiển thị chúng trên timeline, nhưng không bao giờ sửa đổi hoặc xóa file gốc.

Để nhập một cây thư mục hiện có, hãy mount cây đó ở chế độ chỉ đọc vào server container. Chỉnh sửa docker-compose.yml trong immich-server: và thêm một volume:

  immich-server:
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
      - /srv/photos:/mnt/media/photos:ro

:ro đảm bảo Immich không bao giờ có thể tác động đến các file gốc. Tạo lại container bằng sudo docker compose up -d. Sau đó, trong web UI, vào avatar → Administration → External Libraries → Create Library, chọn user sở hữu thư viện, nhấp Add trong mục Folders và nhập đường dẫn container, /mnt/media/photos, không phải đường dẫn trên host /srv/photos. Nhấp Scan. Dùng đường dẫn trên host thay vì đường dẫn trong container là lỗi phổ biến nhất khi cấu hình external library; quá trình scan sẽ không tìm thấy gì và báo 0 asset.

Kỷ luật nâng cấp mà Immich yêu cầu

Đây là phần quyết định Immich hoạt động ổn định hay bị hỏng. Immich phát hành phiên bản mới nhanh và không backport bản sửa lỗi cũng như không hỗ trợ downgrade. Theo dõi mù quáng tag không cố định v3 cuối cùng sẽ làm hỏng database. Thói quen pin phiên bản rồi đọc release notes này cũng nên áp dụng cho mọi container chạy lâu dài trên máy chủ, vì vậy agent KiroCrew tự host được pin vào một tag đã xác nhận hoạt động tốt thay vì để phiên bản tự thay đổi ở lần restart tiếp theo. Các nguyên tắc:

  1. Pin một phiên bản. Giữ IMMICH_VERSION ở một tag cụ thể như v3.0.2, không dùng v3 là tag không cố định và luôn kéo về v3.x mới nhất.
  2. Luôn đọc release notes trước mỗi lần nâng cấp. Các thay đổi có thể gây lỗi, đặc biệt là thay đổi về database hoặc vector extension, đều được nêu tại đó. Bản phát hành v3.0 là ví dụ rõ nhất: bản này loại bỏ hoàn toàn pgvecto.rs, nên những hệ thống vẫn dùng extension cũ phải hoàn tất quá trình migration sang VectorChord (được giới thiệu từ v1.133) trước khi nâng cấp tiếp.
  3. Trước tiên hãy backup database (Step 9). Luôn thực hiện bước này, đặc biệt khi release notes đề cập đến database.
  4. Lấy cả file compose mới. IMMICH_VERSION chỉ pin image của server và ML. Image Postgres được pin bằng digest bên trong docker-compose.yml, nên phiên bản yêu cầu database extension mới sẽ đi kèm file compose mới. Tải lại cả hai release asset, áp dụng lại các giá trị .env, rồi nâng cấp.
  5. Cập nhật mobile client gần cùng thời điểm. Server chỉ giao tiếp với major version tương ứng, còn app hỗ trợ major version hiện tại và major version trước đó. Nếu server đã được nâng cấp trước app, điện thoại sẽ hiển thị Your app major version is not compatible with the server! cho đến khi bạn cập nhật app, vì vậy cách an toàn nhất là cập nhật app trước.

Các lệnh thực tế sau khi bạn đã đặt các file mới vào đúng vị trí:

cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune

Bước 9: Backup, dump database CÙNG với file gốc, và kiểm tra backup

Backup của Immich gồm 2 phần, thiếu một phần thì phần còn lại không có tác dụng. Database lưu cấu trúc album, khuôn mặt, search index và ánh xạ từ asset đến file. Thư mục originals lưu các ảnh thực tế. Restore một phần mà thiếu phần kia sẽ cho ra ảnh không có tổ chức hoặc một bộ khung trống trỏ đến các file không tồn tại. Cấu trúc gồm 2 phần này không phải đặc điểm riêng của Immich: một hệ thống hỗ trợ Chatwoot tự host cũng cần kết hợp dump Postgres với thư mục uploads, nếu không inbox sau khi restore sẽ thiếu toàn bộ attachment. Copy data directory của Postgres dưới dạng cây file có vẻ như cách bỏ qua bước dump, nhưng đó không phải backup có thể sử dụng; đây là một lỗi thường gặp mà hướng dẫn đầy đủ về backup và restore Immich xử lý cùng với lỗi restore khiến timeline trống.

Dump database bằng pg_dump từ bên trong Postgres container, cụ thể là database immich, không phải toàn bộ cluster:

sudo docker exec -t immich_postgres pg_dump --clean --if-exists \
  --dbname=immich --username=postgres | gzip > /opt/immich/immich-db-$(date +%F).sql.gz

Sau đó backup UPLOAD_LOCATION, toàn bộ cây thư mục /opt/immich/library, đặc biệt là các thư mục con library/, upload/profile/, bằng restic, rsync hoặc borg sang một máy khác hoặc object storage. Dù công việc này được lập lịch bằng cron entry hay systemd timer, nó cần có nơi gửi cảnh báo khi thất bại. Một systemd OnFailure= unit trỏ đến ntfy push server của bạn sẽ gửi thông báo đến điện thoại vào đêm dump bị lỗi, thay vì để bạn chỉ phát hiện ra khi restore. Thực hiện database trước, rồi mới backup file, để dump không tham chiếu đến ảnh mà file backup chưa sao chép. Bạn phải backup các external library riêng tại nguồn thực tế của chúng; Immich không quản lý các thư viện đó.

Bây giờ là phần mọi người thường bỏ qua: kiểm tra restore. Restore phải chạy trên một stack mới hoàn toàn, trong đó server chưa từng khởi động, và dùng một Postgres image có vector extension tương thích với dump. Đây chính là lý do bạn không được tự ý thay đổi DB image tag. Trên một máy tạm có cùng compose và .env, xóa mọi state cũ, chỉ khởi động database, rồi nạp dump:

cd /opt/immich
sudo docker compose down -v
sudo docker compose pull
sudo docker compose create
sudo docker start immich_postgres
sleep 10
gunzip --stdout immich-db-2026-07-15.sql.gz |
  sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" |
  sudo docker exec -i immich_postgres psql --dbname=immich --username=postgres --single-transaction --set ON_ERROR_STOP=on
sudo docker compose up -d

Việc rewrite sed của search_path là bắt buộc trên database VectorChord. Bỏ qua bước này sẽ khiến restore dừng giữa chừng. Khi stack khởi động lại với các file originals đã được đặt đúng chỗ, mở web UI. Nếu ảnh và album của bạn xuất hiện, backup hoạt động. Nếu bạn chưa từng thực hiện việc này, bạn không có backup; bạn chỉ đang hy vọng.

Các tình huống lỗi và chuỗi bạn sẽ thấy

Container ML bị OOM-kill. sudo docker compose logs immich-machine-learning kết thúc đột ngột, docker compose ps hiển thị Restarting, và mã thoát là 137. sudo dmesg | grep -i oom xác nhận điều này: Out of memory: Killed process ... (python3). Các job tìm kiếm và nhận diện khuôn mặt sau đó bị treo. Nguyên nhân là RAM không đủ cho các model. Cách xử lý, theo thứ tự: thêm swap (Bước 1); cấp thêm RAM cho VPS; hoặc nếu thực sự không thể, tắt ML trong Administration → Settings → Machine Learning Settings bằng cách tắt Smart SearchFacial Recognition. Bạn vẫn giữ được backup và album, nhưng mất chức năng tìm kiếm theo nội dung. Xóa service immich-machine-learning khỏi file compose cũng có tác dụng tương tự.

Postgres không khởi động sau khi upgrade. Log của server lặp lại một dòng như The database currently has VectorChord 0.5.3 activated, but the Postgres instance only has 0.4.2 available. This most likely means the extension was downgraded. hoặc, trên các stack cũ hơn, The pgvecto.rs extension is not available in this Postgres instance.. Nguyên nhân là image database có phiên bản extension cũ hơn phiên bản mà dữ liệu đã được upgrade lên. Trường hợp này gần như luôn xảy ra do sửa image tag bằng tay hoặc restore dump mới hơn lên image cũ hơn. Cách xử lý là dùng image Postgres tương thích, lấy file compose từ release tương ứng với database, không downgrade, và chỉ restore lên image tương thích.

Ứng dụng mobile không thể kết nối đến server. Màn hình đăng nhập hiển thị lỗi kết nối / Server is not reachable sau khi bạn nhập URL. Có 3 nguyên nhân: bạn nhập http:// trong khi proxy chỉ phục vụ https://; bạn kết nối trực tiếp đến backend nhưng bỏ thiếu port, nên ứng dụng thử example.com (port 443) thay vì example.com:2283; hoặc reverse proxy không forward /api. Hãy nhập URL https://photos.example.com đầy đủ và trước tiên xác nhận URL đó tải được trong trình duyệt trên điện thoại. Nếu trình duyệt hoạt động nhưng ứng dụng không hoạt động, proxy có thể đang loại bỏ path hoặc certificate là self-signed; ứng dụng sẽ từ chối certificate không đáng tin cậy.

Hết dung lượng disk giữa chừng khi import. Upload bắt đầu fail, thumbnail trở thành ảnh trống, và log hiển thị ENOSPC: no space left on device hoặc, từ Postgres, could not extend file ... No space left on device. df -h cho thấy volume UPLOAD_LOCATION đã đầy 100%. Đây là lý do cần tính dung lượng disk trước khi import một thư viện lớn. Để khôi phục, hãy gắn một volume lớn hơn, dừng stack, chuyển UPLOAD_LOCATION sang volume đó, cập nhật .env rồi khởi động lại. Bạn cũng có thể mở rộng disk hiện tại nếu provider hỗ trợ. Postgres có thể bị kẹt khi disk đầy, vì vậy hãy giải phóng dung lượng và restart container database trước khi kết luận dữ liệu đã bị hỏng.

FAQ

Immich cần bao nhiêu RAM và dung lượng đĩa?

Yêu cầu chính thức của Immich là tối thiểu 6 GB RAM và khuyến nghị 8 GB. Với thư viện nhỏ, 4 GB RAM kèm swap là mức sàn thực tế. Dù dùng mức nào, bạn vẫn nên cấu hình swap vì machine-learning container là thành phần có thể tăng mức sử dụng tài nguyên đột biến. Về dung lượng đĩa, hãy dành đủ cho toàn bộ thư viện, cộng thêm khoảng 10–20% cho thumbnail và preview được tạo trên local storage. Tuyệt đối không đặt thư mục dữ liệu Postgres trên network share. Nếu bạn vẫn đang cân nhắc chạy thêm dịch vụ nào, hướng dẫn những gì nên tự host trong 2026 so sánh mức tài nguyên của Immich với các dịch vụ khác.

Có thể chạy Immich mà không cần GPU không?

Có. Machine-learning container chạy ổn trên CPU. GPU chỉ giúp tăng tốc việc lập chỉ mục smart search và, khi dùng đúng image variant, việc transcoding video. Trên CPU, lần lập chỉ mục đầu tiên của thư viện lớn có thể mất vài giờ và chạy trong background, nhưng không chặn việc backup hoặc duyệt ảnh. Nếu máy quá nhỏ để chạy ML, bạn có thể tắt Smart Search và Facial Recognition trong phần cài đặt admin, rồi vẫn sử dụng các chức năng còn lại.

Nâng cấp Immich an toàn như thế nào?

Ghim IMMICH_VERSION vào một tag cụ thể như v3.0.2, đọc release notes trước mỗi lần nâng cấp và backup database trước. Vì image Postgres được ghim bên trong docker-compose.yml thay vì bằng IMMICH_VERSION, hãy tải lại cả compose file và example.env từ release đích, áp dụng lại các giá trị của bạn, rồi chạy docker compose pull && docker compose up -d. Không bao giờ để version tự trôi mà không được giám sát. Immich có thể phát hành breaking changes và không hỗ trợ downgrade.

Chính xác thì cần backup những gì?

Hai thứ, và phải backup cùng nhau: một pg_dump của database immich và toàn bộ thư mục originals UPLOAD_LOCATION. Database lưu album, khuôn mặt và mapping giữa asset với file. Thư mục này lưu các ảnh thực tế. Khi restore, bạn cần cả hai cùng với database image có vector extension tương thích. Hãy dump database trước rồi copy file sau. Ít nhất một lần, hãy test restore trên một máy dùng để kiểm thử. Backup chưa được kiểm tra thì chưa thể xem là backup.

Nhập thư mục ảnh hiện có như thế nào?

Mount thư mục đó ở chế độ read-only vào immich-server container dưới dạng volume bổ sung, chẳng hạn - /srv/photos:/mnt/media/photos:ro, rồi tạo lại container. Sau đó, trong Administration → External Libraries, tạo một library và thêm đường dẫn container /mnt/media/photos. Immich lập chỉ mục file ngay tại vị trí đó và không bao giờ sửa hoặc xóa chúng. Lỗi phổ biến nhất là nhập host path thay vì container path, khiến quá trình scan không tìm thấy gì.