Homelab – Photos

CT 105 — Immich als Google-Photos-Alternative. Gesichtserkennung und Smart Search über OpenVINO auf der iGPU. Zurück zum Homelab-Überblick.


Container

EigenschaftWert
CT ID105
Hostnamephotos
Cores4
RAM4 GB
Swap1 GB
Disk16 GB (local-zfs)
iGPUdev0: /dev/dri/renderD128,mode=0666
Bind-Mount/mnt/storage/Photos/mnt/photos (rw)
Start Order5

4 Cores und 4 GB RAM weil Immich bei ML-Jobs (Gesichtserkennung, Smart Search, OCR) deutlich mehr zieht als andere Services.


Services

ServiceFunktion
immich-serverAPI, Web-UI, Video-Transcoding (VAAPI)
immich-machine-learningGesichtserkennung, CLIP, OCR (OpenVINO auf iGPU)
immich-postgresPostgreSQL mit VectorChord
immich-redisValkey — Cache und Job Queue

Hardware-Beschleunigung

Video-Transcoding: VAAPI. In Immich Admin → Video Transcoding → Hardware Acceleration = VAAPI, Hardware Decoding aktiviert.

Machine Learning: OpenVINO-Image (release-openvino). Nutzt die iGPU für Gesichtserkennung (buffalo_l), Smart Search (ViT-B-32) und OCR (PP-OCRv5). Die iGPU wird mit CT 103 (Jellyfin) geteilt.

Verifizieren: OpenVINOExecutionProvider muss vor CPUExecutionProvider in den Logs erscheinen.


Storage

CT 105 Root-Disk (16 GB, ZFS SSD)
├── /opt/immich/              Compose, .env, hwaccel-Files
└── /opt/immich/postgres/     PostgreSQL-Daten (MUSS auf SSD!)

/mnt/photos (Bind-Mount → /mnt/storage/Photos)
├── library/                  Hochgeladene Originale
├── thumbs/                   Generierte Thumbnails
├── encoded-video/            Transkodierte Videos
├── upload/                   Temporärer Upload
└── backups/                  Automatische DB-Dumps

Wichtig: PostgreSQL muss auf der SSD liegen — auf HDDs bricht die DB-Performance ein.

Berechtigungen: Immich läuft als root im Container (UID 0 = Host-UID 100000). Bind-Mount-Ordner auf dem Host entsprechend chown.


Externer Zugang

Kein Cloudflare Tunnel — die Immich Mobile App funktioniert nicht hinter Cloudflare Access. Zugang von unterwegs über Tailscale.


Compose

Basis ist die offizielle Immich-Compose. Anpassungen: VAAPI Transcoding + OpenVINO ML aktiviert über die mitgelieferten hwaccel.transcoding.yml und hwaccel.ml.yml.

name: immich
services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    extends:
      file: hwaccel.transcoding.yml
      service: vaapi
    volumes:
      - ${UPLOAD_LOCATION}:/data
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - '2283:2283'
    depends_on:
      - redis
      - database
    restart: always
 
  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
    extends:
      file: hwaccel.ml.yml
      service: openvino
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
 
  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:9
    restart: always
 
  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always
 
volumes:
  model-cache:

Tipps

  • Große Imports: ML-Concurrency in Admin → Job Queues auf 1 lassen bei 4 GB RAM. Nachts laufen lassen.
  • Backup: Immich erstellt automatisch DB-Dumps unter /mnt/photos/backups/.
  • Updates: Vor Updates immer Release Notes lesen — Breaking Changes kommen vor.