SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor

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.

Những gì bạn sẽ xây dựng

Immich là dịch vụ tự host để backup ảnh và video, có thể thay thế Google Photos. Dịch vụ có app trên điện thoại để upload camera roll ở chế độ nền, timeline, album, nhận diện khuôn mặt và tính năng tìm kiếm bằng machine learning. Tính năng này có thể tìm từ "beach" hoặc một người mà bạn không cần gắn tag thủ công. Bạn chạy Immich trên VPS của mình, file gốc vẫn nằm trên disk của bạn và không ai quét chúng để bán sản phẩm cho bạn. Nếu bạn 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, app trên điện thoại và các lệnh backup của hai bên cạnh nhau.

Quá trình cài đặt gồm 4 container từ file Docker Compose của chính dự án. Phần này mất 10 phút. Phần còn lại của guide mới là nơi dễ phát sinh vấn đề: container machine learning cần nhiều memory trên máy nhỏ, file gốc nhanh chóng chiếm hết disk, app di động cần đúng server URL và bạn nên đặt HTTPS phía trước Immich trước khi cho phép truy cập từ ngoài network, còn Immich thường xuyên phát hành các thay đổi có thể gây lỗi đến mức một docker compose pull bất cẩn có thể khiến server không khởi động được. Hãy xử lý nghiêm túc 4 việc này thì Immich sẽ rất ổn định. Bỏ qua chúng và bạn có thể mất cả 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 tiên

Lỗi Immich phổ biến nhất trên VPS nhỏ là container ML bị OOM-kill. Trước tiên, hãy cung cấp cho kernel thêm không gian để xử lý 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: có giá trị 4.0Gi. Thao tác này không làm ML chạy nhanh hơn. Swap chỉ là vùng đệm, không phải bảo đảm, nhưng giúp container ít có khả năng 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à thiết lập 4 mục. Giữ nguyên mọi nội dung 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. Nếu sau này bạn gắn thêm data volume, hãy đặt giá trị này thành mount path của volume ngay từ đầu. Nếu đổi sau đó, bạn phải di chuyển thumbnail và cập nhật asset path. DB_DATA_LOCATION phải nằm trên local disk: PostgreSQL trên NFS hoặc SMB share sẽ bị corrupt, và tài liệu đã nói 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 escaping 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 khi truy cập ra ngoài mạng gia đình. Đặ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 đã chạy nhiều container, Traefik tự động cấu hình TLS 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 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 reverse proxy đã hoạt động, 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 video store phong cách thập niên 90 cho Jellyfin có thể chạy cùng Immich trên 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, service này cố ý bind vào loopback và chỉ có thể truy cập được sau khi reverse 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ỏ subdomain vào service này. 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ư trình quét bảo mật open-kritt tự host nên để hoàn toàn ngoài reverse proxy và chỉ truy cập qua SSH tunnel khi cần mở UI. Một số service khác không dùng reverse proxy vì HTTP không phải giao thức của chúng. 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 rule thay vì subdomain. Có một thiết lập reverse proxy quan trọng đối 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, đặt 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. Nếu reverse proxy của bạn cũng xử lý challenge HTTP-01 của Let's Encrypt, hãy đảm bảo /.well-known/immich vẫn được định tuyến đến Immich, không phải đến challenge handler.

Quy tắc mà ứng dụng áp dụng là endpoint phải truy cập được đúng tại URL bạn nhập. Ứng dụng chấp nhận http://YOUR_SERVER_IP:2283 đơn giản, và gợi ý đăng nhập của ứng dụng là http://your-server-ip:port, nhưng mọi kết nối đi qua Internet nên dùng HTTPS. Dùng sai scheme hoặc dùng IP trực tiếp nhưng bỏ cổng là nguyên nhân của lỗi “ứng dụng không thể kết nối đến server”. Lỗi này được mô tả bên dưới 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.

Bước 8: Quy trình nâng cấp bắt buộc của Immich

Đây là phần quyết định Immich hoạt động ổn định hay bị hỏng. Immich phát hành rất nhanh và không backport bản sửa lỗi cũng như không hỗ trợ downgrade. Tag floating v3 là cách được hỗ trợ chính thức để theo dõi các bản phát hành. Immich cố gắng giới hạn các thay đổi breaking ở các major version. Tuy nhiên, Immich sẽ nâng cấp mỗi khi bạn pull, dù bạn đã đọc release notes hay chưa. Một lần nâng cấp không được lên kế hoạch thì không thể rollback. Thói quen pin version rồi đọc release notes 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, một agent KiroCrew tự host được pin vào một tag đã biết là ổn định thay vì tự thay đổi ở lần restart tiếp theo. Quy trình này gồm:

  1. Pin một version. Giữ IMMICH_VERSION ở một tag cụ thể như v3.0.2, không dùng v3 floating vì tag này luôn pull v3.x mới nhất.
  2. Luôn đọc release notes trước mỗi lần nâng cấp. Các breaking change, đặc biệt là thay đổi về database hoặc vector extension, đều được nêu ở đó. 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. Vì vậy, những ai vẫn dùng extension cũ phải hoàn tất migration sang VectorChord (được giới thiệu từ v1.133) trước khi nâng cấp.
  3. Backup database trước (Bước 9). Luôn làm vậy, đặc biệt khi release notes đề cập đến database.
  4. Lấy cả file compose mới. IMMICH_VERSION chỉ pin server image và ML image. Postgres image được pin bằng digest bên trong docker-compose.yml. Vì vậy, version yêu cầu database extension mới sẽ đi kèm một 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 trước. Server chỉ giao tiếp với major version tương ứng. App thường tương thích với major version hiện tại và major version trước đó. Khi server mới hơn app, các bản phát hành hiện tại (v3.3.1, được kiểm tra vào 2026-10-10) sẽ hiển thị thông báo App update is available cùng nút Update trên điện thoại. Immich khuyến nghị nâng cấp tất cả mobile client trước server.

Các command 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/ và 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 chế độ lỗi và chuỗi log bạn sẽ thấy

Container ML bị OOM-killed. 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). Sau đó, các job tìm kiếm và nhận diện khuôn mặt bị treo. Nguyên nhân là RAM không đủ cho các model. Thứ tự cách khắc phục: thêm swap (Bước 1); cấp thêm RAM cho VPS; hoặc nếu thực sự không thể, mở Administration → Settings → Machine Learning Settings và tắt toggle machine learning cấp cao nhất. Thao tác này tắt toàn bộ tính năng ML cùng lúc. Chỉ tắt Smart Search và Facial Recognition là chưa đủ, vì OCR và các loại model khác vẫn được bật theo mặc định. 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ự.

Immich server không khởi động sau khi upgrade. Container Postgres có thể vẫn đang chạy bình thường; chính immich_server kiểm tra version của vector extension khi khởi động và từ chối start. Log của nó lặp lại dòng tương tự 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, với các stack cũ hơn, The pgvecto.rs extension is not available in this Postgres instance.. Nguyên nhân là database image có version extension cũ hơn version mà dữ liệu đã được upgrade lên. Trường hợp này hầu như luôn xảy ra do sửa image tag thủ công hoặc restore dump mới hơn lên một image cũ hơn. Cách khắc phục là dùng Postgres image tương thích, lấy file compose từ release tương ứng với database của bạn, không downgrade, và chỉ restore lên một image tương thích.

Mobile app không kết nối được đến server. Màn hình đăng nhập hiển thị lỗi kết nối như Could not connect to server sau khi bạn nhập URL. Các nguyên nhân thường gặp: 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ỏ quên port, nên app thử example.com (port 443) thay vì example.com:2283; reverse proxy không forward /api; hoặc proxy xử lý challenge HTTP-01 của Let's Encrypt lại route /.well-known/immich đến nơi khác thay vì Immich. Hãy nhập đầy đủ URL https://photos.example.com và trước tiên xác nhận URL đó mở được trong browser trên điện thoại. Nếu browser hoạt động nhưng app không hoạt động, proxy có thể đang strip path hoặc route sai /.well-known/immich. Cũng có thể certificate là self-signed; app sẽ từ chối certificate này với lỗi handshake nếu bạn chưa bật hỗ trợ self-signed certificate trong settings.

Hết dung lượng disk giữa lúc import. Upload bắt đầu fail, thumbnail chuyển thà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%. Vì vậy, hãy tính dung lượng disk trước khi import một thư viện lớn. Để khôi phục, hãy attach một volume lớn hơn, stop stack, chuyển UPLOAD_LOCATION sang volume đó, cập nhật .env rồi start lại, hoặc mở rộng disk hiện tại nếu provider cho phép. Postgres có thể bị kẹt khi disk đầy, vì vậy hãy giải phóng dung lượng và restart database container 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 disk?

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

Có thể chạy Immich không có GPU không?

Có. Container machine-learning chạy tốt trên CPU. GPU chỉ giúp tăng tốc việc lập chỉ mục smart-search và, với đúng image variant, việc transcoding video. Trên CPU, lần lập chỉ mục đầu tiên của một thư viện lớn có thể mất hàng giờ và chạy ở background, nhưng không chặn backup hoặc việc duyệt ảnh. Nếu máy quá yếu để chạy ML, bạn có thể tắt hoàn toàn machine learning bằng toggle cấp cao nhất trong phần cài đặt admin và vẫn giữ mọi chức năng khác.

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 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 để version tự trôi khi không có giám sát. Immich không hỗ trợ downgrade, nên không thể hoàn tác một lần nâng cấp mà bạn chưa đọc kỹ.

Cụ thể cần backup những gì?

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

Import thư mục ảnh hiện có như thế nào?

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