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 trên web gửi file gốc lên, rồi Immich lưu chúng dưới path và 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, vì server luôn biết đầy đủ trạng thái 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 tạo index cho thư mục đó. Cây thư mục vẫn thuộc về 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ác file YAML sidecar mà PhotoPrism ghi để mô tả thông tin đã tìm hiểu sẽ nằm trong thư mục storage riêng của PhotoPrism. Đây là nơi PhotoPrism lưu chúng theo mặc định.
Chỉ một khác biệt này đã giải thích phần lớn các điểm khác. Immich hỗ trợ mobile tốt vì kiểm soát quá trình nhận file. PhotoPrism quản lý library tốt vì không can thiệp vào 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 archive nằm trên một disk.
Mức tiêu thụ phần cứng: Immich cần nhiều hơn
Mức RAM tối thiểu được tài liệu nêu chênh lệch khá xa, và trên VPS nhỏ đây thường là yếu tố quyết định.
Dữ liệu đằng sau biểu đồ này
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]Immich ghi rõ 6 GB RAM là mức tối thiểu và 8 GB là mức khuyến nghị. Tài liệu cũng lưu ý rằng máy 4 GB chỉ chạy được nếu tắt machine learning. PhotoPrism yêu cầu 3 GB bộ nhớ vật lý và 2 nhân CPU. Ngoài mức tối thiểu đó, lượng RAM nên tương ứng với số nhân CPU.
Khoảng cách này là có thật và nguyên nhân nằm ở container machine learning. Immich chạy các model trong một service immich-machine-learning 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, tức trạng thái của một process bị kill bằng signal 9. Đây là cách một OOM kill xuất hiện trong Docker. Các model tích hợp của PhotoPrism chạy trên ONNX. Tài liệu PhotoPrism cho biết các model này thường hoạt động tốt trên mọi loại phần cứng. PhotoPrism cũng có fallback được tài liệu hóa cho trường hợp thiếu bộ nhớ: trên máy có 1 GB RAM trở xuống, nó tắt chuyển đổi RAW và nhận diện khuôn mặt. Tuy nhiên, đây không phải cam kết về độ ổn định. Khi thấp hơn mức tối thiểu 3 GB, project cảnh báo có thể xảy ra lỗi không ổn định và vấn đề hiệu năng, vì vậy hãy xem mức này đúng là mức sàn.
Tài liệu PhotoPrism nêu rõ server nên có ít nhất 4 GB swap. Trang yêu cầu của Immich không nhắc đến swap, nhưng swap giúp container machine learning có thêm khoảng trống trên máy nhỏ. Hãy thêm 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 giờ đây phải in ra một dòng Swap: có hiển thị 4.0Gi. Nếu kết quả là 0B thì swapon đã thất bại, thường là do filesystem không hỗ trợ fallocate, và sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 là fallback. 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 quá nhiều tài nguyên làm sập toàn bộ máy. Ngoại lệ là chính PhotoPrism: tài liệu của nó khuyến cáo không đặt hard memory limit cho container, vì việc index các file lớn đôi khi cần thêm bộ nhớ và giới hạn này có thể gây restart ngoài dự kiến.
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 storage cục bộ, tuyệt đối không nằm trên network share. PhotoPrism cũng cảnh báo không được lưu các file database trên thư mục mạng dùng chung và cho rằng local SSD là nơi tốt nhất để lưu chúng. Không ứng dụng nào an toàn khi database nằm trên object store đã mount.
Cách cài đặt từng ứng dụng
Cả hai cách cài đều dùng compose file do vendor cung cấp và một command. Trước tiên, hãy cài Docker Engine và Compose plugin như đã hướng dẫn 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 trong mỗi 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. DB_PASSWORD có sẵn giá trị mặc định dùng được, và Immich khuyến nghị đổi thành một password ngẫu nhiên, dù không bắt buộc. Postgres không được expose ra public, nên password chỉ dùng cho local authentication, nhưng đặt một password ngẫu nhiên cũng không tốn thêm gì. Chỉ dùng các ký tự A-Za-z0-9, vì tài liệu Immich nói các ký tự khác có thể gây lỗi khi Docker parse giá trị này. 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à thay đổi PHOTOPRISM_ADMIN_PASSWORD trước lần khởi động đầu tiên. Tài liệu nói rất 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 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 app nào ra Internet. Hãy đặt một reverse proxy có TLS (transport layer security) phía trước, theo cùng mô hình như Nextcloud tự host với Docker, TLS và backup, hoặc giữ server ở chế độ private và truy cập qua VPN. Nếu VPS đó sau này chạy thêm dịch vụ ngoài việc lưu ả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ì một RustDesk relay tự host chỉ cần cho phép truy cập đến hai port riêng của nó, không cần mở thêm gì khác.
Ứng dụng điện thoại nào tốt hơn
Đây là điểm khác biệt lớn nhất giữa hai dự án, và 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ạy nền. Nghĩa là ảnh mới được tải khỏi điện thoại mà không cần mở app. Để sử dụng khi không ở nhà, Immich hướng dẫn 3 cách: VPN như WireGuard hoặc OpenVPN, Tailscale, hoặc reverse proxy cung cấp HTTPS. Reverse proxy cho phép app trên điện thoại kết nối mà không cần cài app VPN trên từng điện thoại. Immich cảnh báo không được forward trực tiếp port 2283 ra Internet nếu chưa có cấu hình bổ sung.
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. PhotoPrism cũng tài liệu hóa WebDAV (web distributed authoring and versioning) là cách để đồng bộ từ điện thoại. Dự án khuyến nghị dùng app bên thứ ba có tên PhotoSync, trỏ đến thư mục /import/ hoặc /originals/ qua WebDAV. Cách này hoạt động, nhưng đây là app bên thứ ba có tính phí thực hiện công việc mà Immich đã tích hợp 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.
Machine learning thực sự mang lại gì
Immich dùng CLIP để tìm kiếm theo ngữ nghĩa trong thư việ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 gắn tag. Immich cũng nhận diện và gom nhóm khuôn mặt, đồng thời phát hiện ảnh trùng. Việc index một lần import lớn bằng CPU có thể chạy hàng giờ ở background. Đây là hành vi bình thường và không cần GPU (graphics processing unit).
PhotoPrism phân loại ảnh thành các label bằng model ONNX tích hợp, nhận diện khuôn mặt và gom chúng thành các nhóm người bằng model khuôn mặt ONNX, đồng thời đọc metadata vị trí để tạo bản đồ địa điểm. Một file vision.yml trong thư mục config của PhotoPrism có thể chuyển sang dùng Ollama hoặc OpenAI để tạo label và caption nếu bạn muốn. Bản đồ là tính năng khiến nhiều người tiếp tục dùng: thư viện được index theo nơi chụp mang lại một cách khác hẳn để duyệt qua 20 năm ảnh. Ý 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 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ư nhiều lớp bản đồ 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 October 2026, mức giá bắt đầu từ vài euro mỗi tháng và được tính phí theo năm.
Immich không có tính năng bị khóa sau paywall và project cho biết sẽ không bao giờ có. Immich có bán product key trọn đời tùy chọn, với giá $25 cho một người dùng hoặc $100 cho toàn bộ server, theo mức giá Immich công bố vào July 2024. Tuy nhiên, mua key không mở khóa tính năng nào. Immich vẫn hoạt động không hạn chế nếu bạn không trả phí. Phần core của PhotoPrism miễn phí, với một số tính năng 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.gzTiếp theo, backup UPLOAD_LOCATION. Các thư mục chứa dữ liệu không thể thay thế là upload, library và profile. Có thể tạo lại các thư mục thumbs và encoded-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 -fCommand 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 cho phép cả hai ứng dụng quản lý theo cả hai chiều. PhotoPrism lập chỉ mục thư mục originals và có các tính năng ghi vào thư mục này, trừ khi chạy ở chế độ chỉ đọc. Trong khi đó, Immich cần toàn quyền quản lý nội dung trong vị trí 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 để cả hai ứng dụng quản lý cùng một bộ file. Storage template của Immich có thể di chuyển hoặc đổi tên asset khi 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 ứng dụng self-hosted nào được giữ bản duy nhất của bất kỳ dữ liệu nào. Immich hiện tuân theo semantic versioning và cho biết các thay đổi breaking chỉ xảy ra ở các major release. Vì vậy, hãy pin IMMICH_VERSION vào một major version tag như v3, đọc release notes, rồi nâng cấp bằng docker compose pull && docker compose up -d. Không hỗ trợ downgrade, kể cả trong cùng một minor version, nên hãy dump database trước mỗi lần nâng cấp. Giữ file gốc trong một bản backup ngoài server thì rủi ro sẽ thấp.
Vì sao container machine learning của Immich liên tục restart?
Thông thường, container bị kill vì dùng quá nhiều memory. Chạy docker compose ps --all, vì container đã dừng sẽ không hiển thị nếu thiếu flag đó, rồi tìm service machine learning thoát với code 137. Code này có nghĩa là process bị kill bằng signal 9. Kernel out of memory killer là nguyên nhân thường gặp nhất nhưng không phải nguyên nhân duy nhất, nên hãy xác nhận bằng sudo dmesg | grep -i 'out of memory'. Thêm swap hoặc tắt hoàn toàn machine learning trên máy có 4 GB. Memory limit trên container không throttle process: khi chạm giới hạn, process vẫn bị kill, nhưng sẽ không tiếp tục làm cạn memory của phần còn lại trên server. Smart search và nhận diện khuôn mặt sẽ không hoạt động nếu thiếu machine learning, còn các thành phần khác của Immich vẫn chạy bình thường.
PhotoPrism có cần MariaDB hay SQLite là đủ?
SQLite hoạt động tốt và phù hợp với thư viện cá nhân, nhưng PhotoPrism tự giới hạn ở 4 worker khi dùng SQLite. Tài liệu cũng khuyến nghị chuyển sang MariaDB vì MariaDB xử lý concurrency cao tốt hơn. Compose file do project 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 disk space so với dung lượng thư viện?
Hãy cộng thêm 10 đến 20 phần trăm trên dung lượng file gốc, với cả hai ứng dụng. Phần dự phòng này dùng cho thumbnail được tạo và video preview đã transcode. Một collection 200 GB cần khoảng 220 đến 240 GB chỉ cho thư viện, chưa tính database và phần tăng trưởng sau này. Nếu bạn giữ thêm một bản backup local đầy đủ trên cùng volume, file gốc và bản sao đó cần ít nhất 400 GB trước khi tính các dữ liệu khác. Vì vậy, hãy dự trù khoảng 450 GB hoặc đặt bản sao trên một volume riêng.