Tự host Immich trên Synology NAS: cài đúng bài, khỏi lụy Google Photos

Tự host Immich trên Synology NAS: cài đúng bài, khỏi lụy Google Photos

Google Photos cắt gói lưu trữ miễn phí lâu rồi, chuyện này ai cũng biết, khỏi nhắc lại cho dài dòng. Immich là câu trả lời open-source được nhắc tới nhiều nhất: giao diện gần như bản sao Google Photos

Vì sao chọn Container Manager, không phải Virtual Machine Manager

Google Photos cắt gói lưu trữ miễn phí lâu rồi, chuyện này ai cũng biết, khỏi nhắc lại cho dài dòng. Immich là câu trả lời open-source được nhắc tới nhiều nhất: giao diện gần như bản sao Google Photos, có nhận diện khuôn mặt, tìm kiếm bằng AI (gõ "ảnh biển" là ra đúng ảnh biển thật), và quan trọng nhất — dữ liệu nằm trên NAS của bạn, không ai âm thầm quét ảnh gia đình để train mô hình gì cả.

Trên Synology có hai đường để chạy Immich: dựng máy ảo qua Virtual Machine Manager rồi cài Docker trong đó, hoặc dùng thẳng Container Manager với tính năng Project (đọc docker-compose.yml native). Bài này đi theo cách thứ hai, cũng là cách docs.immich.app hướng dẫn chính thức cho Synology.

Lý do đơn giản: VM ăn thêm một lớp ảo hóa, tốn RAM/CPU chỉ để chạy hệ điều hành lồng trong hệ điều hành, và update thì phức tạp hơn hẳn. Container Manager từ DSM 7.2 trở lên đọc trực tiếp compose file, không cần cài thêm plugin compose bên thứ ba như thời Docker package cũ trên DSM 7.1. Đổi lại, Container Manager trên Synology có 2 tật riêng mà Docker chạy trên Linux thường không gặp: subnet container hay đổi sau mỗi lần rebuild, và cái vụ phân quyền user/folder kiểu Synology vốn nổi tiếng khó chiều. Cả hai đều xử lý được, mình nói rõ ở phần lỗi thường gặp bên dưới.

Một lưu ý cần nói thẳng ngay từ đầu: đây là "community guide", Immich team không chính thức support Synology. Vẫn chạy tốt, vẫn là cách cộng đồng dùng nhiều nhất, nhưng khi có lỗi lạ thì lên Discord hoặc GitHub Discussions của Immich mà hỏi, đừng tự ý downgrade database khi chưa hiểu migration nó làm gì — cái này không phải chỗ để "thử cho biết".

Yêu cầu trước khi bắt tay vào làm

  • DSM 7.2 trở lên — bắt buộc, vì tính năng Project (compose native) chỉ có từ bản này.
  • RAM tối thiểu ~6GB, khuyến nghị 8GB+. Immich chạy 4 container cùng lúc (server, machine learning, database, redis), thiếu RAM là swap liên tục, chậm rề rề.
  • CPU x86-64-v2 trở lên. NAS đời quá cũ hoặc dòng CPU yếu (nhiều model J-series entry-level) có thể không chạy nổi phần machine learning — nhận diện khuôn mặt, tìm kiếm ngữ nghĩa đều cần CPU khá.
  • Package Container Manager cài từ Package Center (tên cũ là Docker, đổi tên từ DSM 7.2).

Các bước cài đặt

1. Tạo cấu trúc thư mục

Mở File Station, tạo thư mục docker/immich-app, bên trong tạo thêm 2 thư mục con postgreslibrary. Cả hệ thống nằm gọn trong /volume1/docker/immich-app/ — dễ backup, dễ tìm khi cần dọn dẹp sau này.

2. Tải docker-compose.yml và .env

Vào trang Releases trên GitHub của immich-app/immich, tải bản release mới nhất (ví dụ dòng v3.0.x) — không lấy file ở nhánh main, vì main là bản dev có thể chưa ổn định. Tải về 2 file: docker-compose.ymlexample.env.

Đổi tên example.env thành .env. Mẹo nhỏ hay bị bỏ qua: DSM File Station không cho mở file bắt đầu bằng dấu chấm bằng Text Editor mặc định. Cách lách: đổi tạm tên thành env.txt, sửa nội dung xong xuôi rồi đổi lại thành .env. Đừng quên đổi lại — quên bước này thì container vẫn chạy lên bình thường, chỉ có điều nó đọc biến môi trường trớt quớt, và bạn sẽ ngồi debug cả buổi mới nhớ ra thủ phạm là cái tên file.

3. Sửa file .env

Các biến cần chỉnh, đừng để nguyên giá trị mẫu:

  • DB_PASSWORD — đổi ngay, đừng dùng password demo trong file gốc.
  • DB_USERNAME, DB_DATABASE_NAME — giữ mặc định cũng được, không bắt buộc đổi.
  • UPLOAD_LOCATION — trỏ về /volume1/docker/immich-app/library.
  • DB_DATA_LOCATION — trỏ về /volume1/docker/immich-app/postgres.
  • DB_STORAGE_TYPE — đặt 'HDD' nếu volume bạn dùng là ổ cứng cơ, không phải SSD. Bỏ qua bước này trên hệ HDD sẽ ảnh hưởng hiệu năng ghi database.
  • TZ — đặt Asia/Ho_Chi_Minh cho đúng múi giờ, không thì log và thời gian chụp ảnh lệch giờ khó chịu.
  • IMMICH_VERSION — có thể để mặc định release (luôn kéo bản ổn định mới nhất) hoặc ghim cứng version cụ thể như v3.0.3 nếu muốn kiểm soát thời điểm update.

4. Khai báo subnet cố định trong docker-compose.yml

Đây là bước dân tình hay bỏ qua rồi sau này khổ sở với Firewall. Thêm phần network với subnet cố định, ví dụ:

networks:
default:
ipam:
config:
- subnet: 172.20.0.0/16
Lý do làm bước này ngay từ đầu: mặc định Container Manager tự cấp subnet, và subnet này có thể đổi mỗi lần bạn rebuild project. Nếu bạn tạo Firewall rule theo IP container mà không cố định subnet, chỉ cần rebuild một lần là rule vỡ, mất công cấu hình lại từ đầu — mà chuyện này thường lộ ra đúng lúc bạn đang cần vào xem ảnh gấp.

5. Tạo Project trong Container Manager

Mở Container Manager → Project → Create. Chọn đường dẫn tới thư mục /volume1/docker/immich-app (nơi chứa docker-compose.yml và .env), để DSM tự nhận diện file. Bấm Build, đợi Container Manager kéo về 4 image: immich-server, immich-machine-learning, database (Postgres 14 kèm extension VectorChord cho tìm kiếm AI) và valkey (bản fork của Redis, dùng làm cache/session).

6. Cấu hình Firewall

Đây là bước quyết định bạn có truy cập được Immich từ trình duyệt hay không. Cần thêm 2 rule:

  1. Rule theo IP của container immich-server (xem IP trong tab Container của Container Manager, sau khi đã cố định subnet ở bước 4).
  2. Rule theo port 2283 — port mặc định của immich-server.

Thiếu 1 trong 2 rule này, container vẫn chạy bình thường (status xanh, log sạch tinh) nhưng bạn không vào được giao diện. Đây là lỗi gặp nhiều nhất khi mới cài, và cũng dễ khiến người mới hoang mang nhất — "rõ ràng nó đang chạy mà sao không vào được" là câu than thở kinh điển của mục này.

7. Truy cập và tạo tài khoản admin

Mở trình duyệt, gõ http://:2283. Lần đầu vào sẽ là màn hình tạo tài khoản admin — điền email, password, xong là vào thẳng dashboard.

8. Cài app di động và bật auto-backup

Tải app Immich cho iOS/Android, đăng nhập bằng địa chỉ server (chính là URL ở bước 7, hoặc domain nếu bạn đã cấu hình reverse proxy). Vào phần backup, chọn album cần đồng bộ, bật chạy nền, và nếu sợ tốn data 4G thì bật tùy chọn chỉ backup khi có Wi-Fi.

Muốn bật nhận diện khuôn mặt và Smart Search (tìm bằng mô tả, dùng model CLIP), vào Administration Settings kiểm tra 2 mục Machine Learning và Smart Search đang bật. Mặc định thường đã bật sẵn, chỉ cần đợi hệ thống quét xong thư viện.

Kiểm tra hệ thống chạy đúng

Vào Container Manager, cả 4 container phải ở trạng thái running liên tục, không restart loop. Xem log của immich-server để chắc không có lỗi kết nối database. Upload thử vài ảnh từ app di động, đợi vài phút rồi vào mục Search gõ thử một từ khóa mô tả — tìm ra đúng ảnh nghĩa là machine learning đã chạy đúng, chứ không phải chỉ đang "làm màu" trong log.

Lỗi thường gặp

  • Container chạy nhưng không truy cập được từ trình duyệt hoặc app. 90% là do thiếu rule Firewall (IP hoặc port) hoặc subnet Docker đã đổi sau lần rebuild gần nhất. Cố định subnet như bước 4 rồi tạo lại rule.
  • Permission denied, container không ghi được vào volume. Vào Control Panel → User & Group → chọn user chạy Docker → Edit → Permissions, cấp quyền Read/Write vào thư mục docker/immich-app. NAS Synology mặc định khá chặt về phân quyền folder, không phải kiểu chạy root vô tư như Linux thường thấy — quen rồi thì thấy hợp lý, chưa quen thì dễ tưởng mình cài sai.
  • Update lên version mới báo lỗi "invalid upgrade path" liên quan tới database. Immich đã chuyển từ extension pgvecto.rs sang VectorChord ở các bản gần đây, có bước migration riêng. Luôn backup database trước khi update (snapshot thư mục postgres hoặc dump SQL), đọc kỹ Upgrade Guide chính thức trước khi bấm — đừng nhắm mắt kéo version mới nhất về là xong, thư viện ảnh cả nhà không phải chỗ để thử vận may.
  • Máy yếu, machine learning chạy ì ạch. NAS dòng entry-level hoặc CPU ARM/J-series xử lý nhận diện khuôn mặt và smart search rất chậm — thư viện vài chục nghìn ảnh có thể mất nhiều ngày để quét hết lần đầu. Nếu máy yếu, chấp nhận tắt bớt ML hoặc chỉ dùng tìm kiếm cơ bản theo album/thời gian.
  • Đổi UPLOAD_LOCATION giữa chừng sau khi đã có dữ liệu. Database lưu đường dẫn file cũ, đổi path là gây lỗi "inconsistent media location". Đặt đúng đường dẫn từ đầu, sau này đừng đổi nếu không thật sự cần và biết cách migrate.

Bảo mật và bảo trì

Đừng expose thẳng port 2283 ra Internet. Muốn dùng ngoài mạng LAN, đi qua reverse proxy có HTTPS — dùng Application Portal có sẵn của DSM hoặc Nginx Proxy Manager, và bật thêm xác thực 2 lớp nếu public ra ngoài. Port trần không mã hóa ra Internet chẳng khác nào để cửa mở mời trộm vào chơi.

Đổi DB_PASSWORD ngay từ đầu như đã nói ở bước 3 — đừng để giá trị mẫu, dù chỉ dùng trong LAN.

Điểm khác biệt lớn nhất so với Google Photos cần nhớ: Immich lưu local hoàn toàn, không có bản sao cloud miễn phí âm thầm chạy nền phía sau. NAS hỏng mà không có backup thì mất trắng cả thư viện ảnh — và ổ cứng nào rồi cũng có ngày dở chứng, chỉ là chưa biết ngày nào thôi. Nên cấu hình thêm Hyper Backup ra ổ ngoài, NAS khác, hoặc cloud (Backblaze B2, C2...) cho riêng thư mục docker/immich-app. Đổi lại, không ai quét ảnh gia đình bạn để train AI của hãng nào cả — cái giá của quyền riêng tư là tự chịu trách nhiệm backup, không đùn cho ai được nữa.

Mua NAS chính hãng

Xem tất cả →

Thiết bị NAS Synology & ổ cứng chính hãng Nhật Bản — tư vấn cấu hình, lắp đặt và bảo hành. Mua qua Shopee, giao toàn quốc.

No comments yet