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

PhotoPrism hay Immich: nên dùng photo server nào?

So sánh PhotoPrism và Immich trên VPS: mức RAM tối thiểu thực tế, app điện thoại, bản đồ và lệnh backup chính xác cho từng photo server.

PhotoPrism và Immich: câu trả lời ngắn gọn

PhotoPrism và Immich phục vụ 2 nhu cầu khác nhau, không phải là 2 phiên bản của cùng một sản phẩm. Immich thay thế Google Photos: ứng dụng trên điện thoại tự động sao lưu camera roll, và timeline có giao diện quen thuộc với những người không còn dùng gallery trên điện thoại. PhotoPrism tổ chức thư viện ảnh bạn đã có: nó lập chỉ mục các thư mục chứa file trên disk, đọc metadata, hiển thị ảnh trên bản đồ và giữ nguyên vị trí của các file.

Chọn Immich nếu vấn đề là "điện thoại của tôi đã đầy bộ nhớ và tôi muốn ngừng dùng Google Photos". Chọn PhotoPrism nếu vấn đề là "tôi có 400 GB ảnh trên một drive nhưng không thể tìm thấy gì trong đó". Cả 2 đều là open source, đều chạy dưới dạng Docker container trên một VPS thông thường, và đều lập chỉ mục cũng như tìm kiếm thư viện của bạn mà không gửi dữ liệu cho bên thứ ba.

Sự khác biệt về triết lý, và vì sao nó quyết định mọi thứ

Immich quản lý các file. Bạn trỏ Immich đến một vị trí upload, app trên điện thoại hoặc trình upload web gửi bản gốc lên đó, rồi Immich lưu chúng dưới path và cách đặt tên riêng. Database lưu thông tin chính xác về album, khuôn mặt và tìm kiếm. Thiết kế này giúp trải nghiệm trên điện thoại tốt, vì server luôn biết trạng thái đầy đủ của mọi asset.

PhotoPrism đọc các file. Bạn mount một thư mục originals mà mình đã quản lý, rồi PhotoPrism xây dựng index trên đó. Cây thư mục vẫn thuộc quyền quản lý của bạn. Nếu ngày mai bạn gỡ PhotoPrism, ảnh vẫn nằm trong các thư mục cũ với tên cũ, còn PhotoPrism sẽ ghi các file YAML sidecar bên cạnh ảnh để mô tả những gì nó đã nhận diện.

Chỉ một khác biệt này đã giải thích phần lớn các điểm còn lại. Immich hỗ trợ mobile tốt vì nó kiểm soát quá trình tiếp nhận file. PhotoPrism quản lý thư viện tốt vì nó không xung đột với cấu trúc có sẵn của bạn. Immich phù hợp hơn với gia đình có ảnh nằm trên điện thoại. PhotoPrism phù hợp hơn với kho lưu trữ nằm trên một disk.

Phần cứng cần nhiều hơn: Immich đòi hỏi cao hơn

Mức RAM tối thiểu được tài liệu hóa chênh lệch khá xa. Trên một VPS nhỏ, đây thường là yếu tố quyết định.

ChartDocumented memory requirement, as of July 2026
The data behind this chart
[
  {
    "label": "Immich",
    "min_ram_gb": 6,
    "recommended_ram_gb": 8
  },
  {
    "label": "PhotoPrism",
    "min_ram_gb": 3,
    "recommended_ram_gb": 4
  }
]

Immich ghi rõ cần tối thiểu 6 GB RAM và khuyến nghị 8 GB. Tài liệu cũng lưu ý rằng máy 4 GB chỉ chạy được khi tắt machine learning. PhotoPrism yêu cầu 3 GB bộ nhớ vật lý và 2 lõi CPU, đồng thời cho biết dung lượng RAM nên tương ứng với số lõi CPU.

Chênh lệch này là có thật và xuất phát từ container machine learning. Immich chạy model trong một service immich-machine-learning riêng. Service này nạp CLIP (contrastive language image pretraining) và model nhận diện khuôn mặt vào bộ nhớ. Trên máy 2 GB, kernel sẽ kill container đó. Docker hiển thị container thoát với mã 137, đây là dấu hiệu của một lần bị kill do hết bộ nhớ. Model TensorFlow của PhotoPrism nhỏ hơn và ứng dụng sẽ giảm tính năng thay vì dừng hẳn: trên máy có 1 GB RAM hoặc ít hơn, PhotoPrism tắt chuyển đổi RAW và TensorFlow thay vì bị crash.

Cả hai project đều yêu cầu swap. Tài liệu PhotoPrism nêu rõ server nên có ít nhất 4 GB swap. Hãy tạo swap trước khi cài một trong hai ứng dụng.

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 giờ đây phải in ra một dòng Swap: có nội dung 4.0Gi. Nếu in ra 0B, thì swapon đã thất bại, thường là vì filesystem không hỗ trợ fallocate; khi đó sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 là phương án dự phòng. Giới hạn bộ nhớ của container cũng quan trọng ở đây. Cấu hình giới hạn bộ nhớ trong Docker Compose là cách ngăn một service ngốn nhiều tài nguyên làm toàn bộ máy bị sập.

Có một yêu cầu khác thường bị bỏ sót. Database Postgres của Immich phải nằm trên filesystem Unix thông thường, có ownership và permission thực, dùng local storage, tuyệt đối không dùng network share. PhotoPrism cũng yêu cầu như vậy đối với các file database. Không ứng dụng nào an toàn khi database nằm trên object store được mount.

Cách cài đặt từng ứng dụng

Cả hai cách cài đều dùng file compose do nhà cung cấp phát hành và một lệnh. Trước tiên, hãy thiết lập Docker Engine và plugin Compose như đã nêu trong hướng dẫn Docker Compose trên VPS của chúng tôi.

Immich phát hành file compose và file môi trường mẫu cùng mỗi bản release.

sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml 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

Chỉnh sửa .env trước khi khởi động bất kỳ thứ gì. UPLOAD_LOCATION là nơi lưu các file gốc, còn DB_PASSWORD phải được đổi khỏi giá trị mặc định và chỉ dùng các ký tự A-Za-z0-9, vì ký tự đặc biệt sẽ làm hỏng connection string. Sau đó khởi động ứng dụng.

docker compose up -d
docker compose ps

Web interface lắng nghe trên port 2283. Account đầu tiên đăng ký qua trang này sẽ trở thành administrator. Vì vậy, hãy truy cập và đăng ký ngay thay vì để một instance mở trên Internet.

PhotoPrism phát hành một file compose đã bao gồm MariaDB.

sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yaml

Mở compose.yaml và thay đổi PHOTOPRISM_ADMIN_PASSWORD trước lần khởi động đầu tiên. Tài liệu nêu rõ: app khởi động với initial password có trong file đó, độ dài tối thiểu là 8 ký tự, và không được dùng giá trị mặc định trên public server. Đồng thời đặt volume originals trỏ đến folder chứa ảnh của bạn.

docker compose up -d
docker compose logs -f photoprism

PhotoPrism phản hồi trên cổng 2342 với người dùng admin. Không ứng dụng nào nên được expose trực tiếp. Đặt một reverse proxy có TLS (transport layer security) ở phía trước, theo cùng mô hình với Nextcloud tự host bằng Docker, TLS và backup. Nếu VPS đó sau này chạy thêm dịch vụ ngoài lưu trữ ảnh, hãy áp dụng nguyên tắc hạn chế tương tự cho mọi service bạn thêm vào, vì RustDesk relay tự host chỉ cần cho phép truy cập đến hai cổng riêng của nó, không cần mở thêm gì khác.

Ứng dụng điện thoại của bên nào tốt hơn

Đây là điểm khác biệt lớn nhất giữa hai dự án, và cũng là lý do phần lớn người dùng chọn Immich.

Immich phát hành app chính thức cho Android và iOS. Các app này tự động backup camera roll ở chế độ nền, nghĩa là ảnh mới được tải khỏi điện thoại mà không cần mở app. App yêu cầu một endpoint HTTPS, vì vậy reverse proxy là bắt buộc nếu bạn định sử dụng từ bên ngoài nhà.

PhotoPrism không có app native chính thức. Dự án phát hành một progressive web app. Bạn có thể thêm app này vào màn hình chính từ trình duyệt. Dự án hướng dẫn dùng WebDAV (web distributed authoring and versioning) để đồng bộ ảnh từ điện thoại. Dự án khuyến nghị một app bên thứ ba có tên PhotoSync cho việc này, trỏ đến thư mục /import/ hoặc /originals/ qua WebDAV. Cách này hoạt động, nhưng bạn phải dùng một app bên thứ ba trả phí để thực hiện việc mà Immich xử lý ngay trong client của mình.

Nếu yêu cầu là tự động backup ảnh trên điện thoại cho nhiều thành viên trong gia đình, thì lựa chọn đã rõ: Immich.

Tính năng machine learning thực sự mang lại gì

Immich thực hiện tìm kiếm ngữ nghĩa trên thư viện của bạn bằng CLIP. Vì vậy, truy vấn như "red bicycle in snow" có thể tìm thấy những ảnh chưa từng được gắn tag. Immich cũng phát hiện và phân nhóm khuôn mặt, đồng thời phát hiện ảnh trùng lặp. Việc index một lượng dữ liệu import lớn bằng CPU có thể chạy hàng giờ trong background. Đây là điều bình thường và không cần GPU (graphics processing unit).

PhotoPrism phân loại ảnh bằng TensorFlow thành các label, phát hiện khuôn mặt và nhóm chúng thành từng người, đồng thời đọc metadata vị trí để tạo bản đồ địa điểm. Bản đồ là tính năng khiến người dùng tiếp tục sử dụng: thư viện được index theo nơi chụp là một cách hoàn toàn khác để duyệt qua hai mươi năm ảnh. Cùng ý tưởng này cũng áp dụng cho các bộ sưu tập media khác. Giao diện cửa hàng băng đĩa video thập niên 90 của Halcyon cho Jellyfin là phiên bản dành cho phim, cho phép duyệt theo kệ thay vì theo danh sách. Nhận diện khuôn mặt có trong bản Community miễn phí. Các membership Essentials và Plus trả phí bổ sung những tính năng như lớp bản đồ phong phú hơn, nhiều role người dùng hơn và giao diện quản lý người dùng. Tính đến tháng 7 năm 2026, giá bắt đầu từ vài euro mỗi tháng.

Immich hoàn toàn miễn phí và không có paid tier. Phần core của PhotoPrism miễn phí, kèm các tính năng bổ sung trả phí tùy chọn.

Bản backup quyết định bạn có giữ được dữ liệu hay không

Một photo server không có backup chỉ cần hỏng một disk là có thể làm mất toàn bộ ảnh của cả gia đình. Cả hai app đều cần 2 loại backup: database và file.

Với Immich, dump database từ Postgres container rồi sao chép thư mục upload.

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

Tiếp theo, backup UPLOAD_LOCATION. Các thư mục chứa dữ liệu không thể thay thế là upload, libraryprofile. Có thể tạo lại các thư mục thumbsencoded-video, nhưng sẽ mất hàng giờ CPU. Chỉ có database dump thì không khôi phục được gì, vì nó chỉ chứa metadata.

Với PhotoPrism, index có command riêng.

docker compose exec photoprism photoprism backup -i -f

Command này ghi SQL dump vào storage/backup/. Sau đó sao chép thư mục originals và thư mục storage. PhotoPrism cũng ghi các file YAML sidecar mô tả từng ảnh. Vì vậy, có thể rebuild index chỉ từ các file ảnh. Đây là một lợi thế thực tế cho archive mà bạn dự định giữ trong nhiều thập kỷ.

Dù bạn chọn phương án nào, hãy định kỳ chuyển các bản backup đó ra khỏi server bằng restic với mã hóa, loại trùng lặp và lưu trữ từ xa. Bản backup nằm trên cùng một disk với thư viện không phải là backup. Hãy cấu hình job gửi cảnh báo khi fail, vì một backup đã âm thầm dừng chạy từ tháng 3 trông không khác gì backup vừa chạy tối qua cho đến ngày bạn cần khôi phục. Khi đó, một server ntfy tự host sẽ đẩy cảnh báo lỗi đến điện thoại của bạn ngay trong tối hôm đó.

Bạn nên chạy nền tảng nào

Chạy Immich nếu ảnh của bạn nằm trên điện thoại, nếu có nhiều người cần sao lưu camera roll, và nếu bạn có thể cấp cho server từ 6 GB RAM trở lên. Đây là lựa chọn gần với Google Photos nhất mà bạn có thể tự host, và trải nghiệm trên mobile là điểm mạnh chính. Hướng dẫn cài đặt Immich từng bước của chúng tôi trình bày chi tiết các sự cố process bị kill do thiếu memory và những bẫy khi upgrade.

Chạy PhotoPrism nếu bạn đã có photo archive trên disk, nếu bạn quan tâm đến map và metadata cũng như muốn giữ nguyên cấu trúc folder của mình, hoặc nếu VPS có 4 GB RAM và bạn muốn có một thư viện hoạt động ổn định thay vì liên tục swap. Đây là công cụ curation tốt hơn và ít gây áp lực hơn cho hardware nhỏ.

Chạy cả hai cũng là một lựa chọn hợp lý. Immich xử lý việc nhận ảnh hằng ngày từ điện thoại. Mỗi năm một lần, bạn chọn các ảnh cần giữ vào archive rồi để PhotoPrism index archive đó. Hai ứng dụng không xung đột, vì PhotoPrism đọc các folder còn Immich quản lý dữ liệu riêng của nó.

FAQ

PhotoPrism và Immich có thể dùng chung một thư mục ảnh không?

Không an toàn nếu dùng chung theo cả hai chiều. PhotoPrism đọc thư mục originals và ghi các file YAML sidecar bên cạnh ảnh, còn Immich yêu cầu được toàn quyền quản lý nội dung trong thư mục upload của nó. Bạn có thể trỏ PhotoPrism đến một bản sao chỉ đọc của thư mục library của Immich để duyệt ảnh, nhưng không để cả hai app cùng quản lý một nhóm file. Template lưu trữ của Immich có thể di chuyển hoặc đổi tên asset trong lúc PhotoPrism đang index.

Immich đã đủ ổn định để lưu bản duy nhất của ảnh chưa?

Không nên để bất kỳ app self-hosted nào giữ bản duy nhất của bất kỳ dữ liệu nào. Immich thường xuyên phát hành các thay đổi có thể gây breaking change, và một docker compose pull bất cẩn có thể khiến database không khởi động được. Vì vậy, hãy pin version và đọc release notes trước khi upgrade. Sao lưu các file gốc bên ngoài server để giảm rủi ro.

Vì sao container machine learning của Immich liên tục restart?

Container bị kill vì dùng quá nhiều memory. Chạy docker compose ps và tìm service machine learning thoát với code 137. Đây là mã của kernel out of memory killer. Bạn có thể thêm swap, đặt memory limit cho container để nó bị throttle thay vì bị kill, hoặc tắt hoàn toàn machine learning trên máy 4 GB. Nếu tắt, chức năng search sẽ không hoạt động, còn các phần khác của Immich vẫn chạy bình thường.

PhotoPrism có cần MariaDB không, hay SQLite là đủ?

SQLite vẫn hoạt động và phù hợp với thư viện cá nhân. Tuy nhiên, khi dùng SQLite, PhotoPrism tự giới hạn ở 4 worker. Tài liệu khuyến nghị chuyển sang MariaDB vì MariaDB xử lý concurrency cao tốt hơn. File compose do project phát hành đã có sẵn MariaDB, nên cách được khuyến nghị cũng là cấu hình mặc định.

Nên dự trù thêm bao nhiêu dung lượng disk so với kích thước thư viện?

Hãy cộng thêm 10 đến 20 phần trăm trên kích thước các file gốc, bất kể dùng app nào. Phần này dành cho thumbnail được tạo và preview video đã transcode. Một bộ sưu tập 200 GB sẽ cần volume khoảng 300 GB để còn chỗ cho database, bản backup cục bộ và dữ liệu tăng thêm.