Immich logoPhotos

Immich

Thư viện ảnh tự host, phù hợp để thay Google Photos cho cá nhân hoặc gia đình.

Ghi chú review

Nên chạy bằng Docker Compose chính thức, chuẩn bị dung lượng lưu trữ và chiến lược backup trước khi import ảnh lớn.

Hướng dẫn deploy

Triển khai bằng Docker Compose chính thức, ưu tiên máy có SSD và backup ổn định.

  1. Tạo thư mục app, tải file compose và `.env` từ tài liệu Immich.
  2. Cấu hình `UPLOAD_LOCATION`, `DB_PASSWORD` và domain public nếu dùng reverse proxy.
  3. Chạy `docker compose up -d`, mở web UI, tạo tài khoản admin đầu tiên.
  4. Đặt Caddy/Nginx phía trước với HTTPS nếu public ra internet.
  5. Import ảnh theo từng đợt nhỏ và theo dõi dung lượng storage.
Backup:Backup thư mục upload và database PostgreSQL. Không chỉ backup container image.

Copy để chạy trên server

Dùng từng block riêng: lưu compose trước, hoặc copy script bash để tạo file và chạy container.

docker-compose.ymlyaml
name: immich
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    container_name: immich_server
    volumes:
      - ./library:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    environment:
      DB_HOSTNAME: database
      DB_USERNAME: postgres
      DB_PASSWORD: immich_password
      DB_DATABASE_NAME: immich
      REDIS_HOSTNAME: redis
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    restart: unless-stopped

  redis:
    image: docker.io/redis:7-alpine
    container_name: immich_redis
    restart: unless-stopped

  database:
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
    container_name: immich_postgres
    environment:
      POSTGRES_PASSWORD: immich_password
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped
setup.shbash
#!/usr/bin/env bash
set -euo pipefail

sudo mkdir -p /opt/immich
sudo chown "$USER":"$USER" /opt/immich
cd /opt/immich

cat > docker-compose.yml <<'COMPOSE'
name: immich
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    container_name: immich_server
    volumes:
      - ./library:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    environment:
      DB_HOSTNAME: database
      DB_USERNAME: postgres
      DB_PASSWORD: immich_password
      DB_DATABASE_NAME: immich
      REDIS_HOSTNAME: redis
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    restart: unless-stopped

  redis:
    image: docker.io/redis:7-alpine
    container_name: immich_redis
    restart: unless-stopped

  database:
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
    container_name: immich_postgres
    environment:
      POSTGRES_PASSWORD: immich_password
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: unless-stopped
COMPOSE

docker compose up -d
echo "Immich is running on http://SERVER_IP:2283"

Stack

TypeScriptPostgreSQLRedisDocker