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, app điện thoại, bản đồ, cách quản lý file và lệnh backup Docker cụ thể cho từng server.
PhotoPrism và Immich: câu trả lời ngắn
PhotoPrism và Immich phục vụ hai nhu cầu khác nhau, không phải là hai 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 thư viện ảnh, còn giao diện dòng thời gian trông quen thuộc với những người chuyển khỏi thư viện ảnh 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, đưa ảnh lê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ả hai đều là open source, đều chạy dưới dạng Docker container trên một VPS thông thường, đồng thời đều lập chỉ mục và 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 thư mục upload, app trên điện thoại hoặc trình upload web gửi file gốc vào đó, rồi Immich lưu chúng trong đường dẫn và theo quy tắc đặ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 hơn, vì server luôn biết đầy đủ trạng thái của từng asset.
PhotoPrism đọc các file. Bạn mount một thư mục originals mà mình đã quản lý, rồi PhotoPrism tạo index cho thư mục đó. Cây thư mục vẫn thuộc quyền kiểm soát của bạn. Nếu ngày mai bạn gỡ PhotoPrism, ảnh vẫn nằm trong đúng các thư mục cũ với đúng tên cũ, còn PhotoPrism sẽ ghi các file YAML sidecar bên cạnh chúng để mô tả những thông tin mà 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 nhận file. PhotoPrism quản lý thư viện tốt vì nó không can thiệp vào cấu trúc hiện có 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 ảnh được lưu trên disk.
Yêu cầu tài nguyên: Immich cần nhiều hơn
Mức RAM tối thiểu được tài liệu hóa của hai ứng dụng chênh lệch khá xa. Trên một VPS nhỏ, đây thường là yếu tố quyết định.
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ỉ có thể chạy Immich 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ừ machine learning container. Immich chạy các model trong một immich-machine-learning service riêng. Service này nạp CLIP (contrastive language image pretraining) và các model nhận diện khuôn mặt vào bộ nhớ. Trên máy 2 GB, kernel sẽ kill container đó. Bạn sẽ thấy container thoát với code 137, đây là biểu hiện của việc Docker kill tiến trình do hết bộ nhớ. Các model TensorFlow của PhotoPrism nhỏ hơn và ứng dụng sẽ giảm chức năng thay vì dừng hẳn: trên máy có 1 GB RAM trở xuống, PhotoPrism tắt chuyển đổi RAW và TensorFlow thay vì bị crash.
Cả hai dự án đều yêu cầu swap. Tài liệu PhotoPrism nói 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 -hfree -h hiện sẽ in một dòng Swap: cho biết 4.0Gi. Nếu in 0B thì swapon đã fail, thường là vì filesystem không hỗ trợ fallocate, và 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 rất quan trọng ở đây. Thiết lập giới hạn bộ nhớ trong Docker Compose là cách ngăn một service ngốn bộ nhớ làm sập toàn bộ máy.
Có một yêu cầu khác thường khiến người dùng gặp lỗi. Database Postgres của Immich phải nằm trên filesystem Unix thông thường có ownership và permission thực, trên local storage, tuyệt đối không đặt trên network share. PhotoPrism cũng yêu cầu tương tự đối với các database file. 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 một compose file 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à Compose plugin như đã nêu trong hướng dẫn Docker Compose trên VPS của chúng tôi.
Immich phát hành compose file và một environment file 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.envChỉnh sửa .env trước khi khởi động. UPLOAD_LOCATION là nơi lưu các file gốc của bạn, 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 psWeb interface lắng nghe trên port 2283. Account đầu tiên được đă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 đang mở trên Internet.
PhotoPrism phát hành một compose file đã bao gồm MariaDB.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlMở compose.yaml và đổi PHOTOPRISM_ADMIN_PASSWORD trước lần khởi động đầu tiên. Tài liệu nói rõ: app khởi động với initial password được ghi trong file đó, độ dài tối thiểu là 8 ký tự, và tuyệt đối không được dùng giá trị mặc định trên public server. Đồng thời, đặt volume originals trỏ đến thư mục chứa ảnh của bạn.
docker compose up -d
docker compose logs -f photoprismPhotoPrism lắng nghe trên port 2342 với user admin. Không nên expose trực tiếp ứng dụng nào. Hãy đặ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.
Ứ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 hầu hết mọi người 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 dự định sử dụng từ bên ngoài nhà.
PhotoPrism không có app native chính thức. Dự án cung cấp 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 cũng hướng dẫn dùng WebDAV (web distributed authoring and versioning) để đồng bộ từ điện thoại. Dự án khuyến nghị dùng 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 đây là một app bên thứ ba có trả phí thực hiện công việc mà Immich tích hợp ngay trong client của mình.
Nếu yêu cầu là tự động backup điện thoại cho nhiều thành viên trong gia đình, lựa chọn đã rõ. Immich.
Những gì machine learning thực sự mang lại
Immich dùng CLIP để tìm kiếm theo ngữ nghĩa trong thư viện ảnh của bạn. 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 ai gắn tag. Immich cũng phát hiện và gom nhóm khuôn mặt, đồng thời phát hiện ảnh trùng lặp. Việc index một lần import lớn bằng CPU có thể chạy hàng giờ ở background. Đây là bình thường và không cần GPU (graphics processing unit).
PhotoPrism dùng TensorFlow để phân loại ảnh thành các label, phát hiện khuôn mặt và gom chúng theo từng người. PhotoPrism cũng đọc metadata vị trí để tạo bản đồ địa điểm. Bản đồ là tính năng khiến nhiều người tiếp tục sử dụng: thư viện được index theo nơi chụp ảnh là một cách hoàn toàn khác để duyệt ảnh trong hai mươi năm. Nhận diện khuôn mặt có trong bản Community miễn phí. Gói Essentials và Plus trả phí bổ sung các tính năng như lớp bản đồ chi tiết 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ó gói trả phí. Phần lõi của PhotoPrism miễn phí, còn các tính năng bổ sung thì có thể trả phí.
Sao lưu quyết định việc 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 ổ đĩa là có thể làm mất toàn bộ ảnh của một gia đình. Cả hai ứng dụng đề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.gzSau đó backup UPLOAD_LOCATION. Các thư mục chứa dữ liệu không thể thay thế là upload, library và profile. Các thư mục thumbs và encoded-video có thể được tạo lại, nhưng sẽ tốn 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 -fLệnh này ghi một 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, nên nếu mất index, bạn vẫn có thể rebuild từ các file. Đây là một lợi thế thực tế đối với archive mà bạn dự định lưu trong nhiều thập kỷ.
Dù chọn ứng dụng nào, hãy định kỳ gửi các backup đó ra ngoài server bằng restic backup được mã hóa và deduplicate đến remote storage. Backup nằm trên cùng ổ đĩa với thư viện ảnh không phải là backup.
Nên chạy ứng dụ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 6 GB RAM trở lên. Đây là lựa chọn gần với Google Photos nhất trong số các giải pháp 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 lỗi OOM làm tiến trình bị kill và những vấn đề dễ gặp khi upgrade.
Chạy PhotoPrism nếu bạn đã có kho ảnh trên disk, nếu bạn quan tâm đến bản đồ và metadata cũng như muốn giữ cấu trúc thư mục 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ì phải dùng swap. Đây là công cụ curation tốt hơn và nhẹ hơn trên phần cứng yếu.
Chạy cả hai cũng là một lựa chọn hợp lý. Immich xử lý việc nạp ảnh hằng ngày từ điện thoại. Mỗi năm một lần, bạn sắp xếp các ảnh cần giữ vào kho lưu trữ rồi để PhotoPrism index chúng. Hai ứng dụng không xung đột vì PhotoPrism đọc các thư mục, 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 cho cả hai ứng dụng ghi 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 cần toàn quyền quản lý nội dung trong thư mục upload của nó. Bạn có thể trỏ PhotoPrism vào một bản sao chỉ đọc của thư mục library của Immich để duyệt ảnh, nhưng không được để cả hai ứng dụng cùng quản lý một bộ file. Storage template của Immich có thể di chuyển hoặc đổi tên asset trong lúc PhotoPrism đang lập chỉ mục.
Immich có đủ ổn định để lưu bản duy nhất của ảnh không?
Không nên để bất kỳ app self-hosted nào giữ bản duy nhất của dữ liệu. Immich thường xuyên phát hành các thay đổi breaking, và một docker compose pull bất cẩn có thể khiến database không thể khởi động. Vì vậy, hãy pin version và đọc release notes trước khi upgrade. Giữ các file gốc trong bản backup ngoài server thì rủi ro vẫn thấp.
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ã do kernel out of memory killer trả về. Bạn có thể thêm swap hoặc đặt memory limit cho container để container bị throttle thay vì bị kill. Trên máy 4 GB, bạn cũng có thể tắt hoàn toàn machine learning. Khi đó chức năng tìm kiếm sẽ không hoạt động, nhưng phần còn lại của Immich vẫn chạy bình thường.
PhotoPrism có cần MariaDB không, hay SQLite là đủ?
SQLite hoạt động tốt và phù hợp với thư viện cá nhân, nhưng PhotoPrism chỉ dùng tối đa bốn worker khi chạy với SQLite. Tài liệu của dự án khuyến nghị chuyển sang MariaDB vì MariaDB xử lý concurrency cao tốt hơn. File compose do dự án phát hành đã có sẵn MariaDB, nên cách được khuyến nghị cũng là cách 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, áp dụng cho cả hai app. Phần này dành cho thumbnail được tạo tự động và preview video đã transcode. Một bộ sưu tập 200 GB cần khoảng một volume 300 GB để còn chỗ cho database, bản backup cục bộ và dữ liệu tăng thêm.