Wem gehören die eigenen Fotos?

Google Photos, iCloud, Amazon Photos – sie alle bieten bequemen Speicher, smarte Suche und automatische Sortierung. Der Preis dafür ist nur selten in Euro. Meistens zahlt man mit Daten, mit Abhängigkeit, mit dem stillen Einverständnis, dass ein Konzern die eigenen Erinnerungen verwaltet.

Immich ist die Antwort darauf – eine selbstgehostete Foto- und Video-Bibliothek, die sich anfühlt wie Google Photos, aber auf dem eigenen Server läuft.

⚠️ Niveau: Fortgeschritten. Docker-Erfahrung und Grundkenntnisse im Self-Hosting werden vorausgesetzt.


Was ist Immich?

Immich ist eine Open-Source-Anwendung zur Verwaltung von Fotos und Videos:

  • 📱 Mobile Apps für iOS und Android mit automatischem Backup
  • 🧠 KI-gestützte Funktionen: Gesichtserkennung, Objekterkennung, semantische Suche
  • 🗂️ Alben, Zeitstrahl, geteilte Bibliotheken
  • 🔍 Suche nach Objekten, Orten, Personen – ohne Cloud
  • 🔒 Volle Datenkontrolle – alles bleibt lokal

Architektur

Immich besteht aus einem Verbund aus vier Containern:

┌─────────────────────────────────────────────────────┐
│              immich-server (Port 2283)               │
│         API, Web-UI, Upload-Verwaltung               │
└──────┬────────────────────────────┬─────────────────┘
       │ immich network             │ immich network
┌──────▼──────────┐     ┌──────────▼──────────────────┐
│ immich-machine  │     │         redis               │
│ -learning       │     │   (Session / Job Queue)     │
│ (KI / ML)       │     └──────────┬──────────────────┘
└─────────────────┘                │ immich network
                        ┌──────────▼──────────────────┐
                        │   postgres (pgvecto-rs)      │
                        │   Datenbank + Vektorsuche    │
                        └─────────────────────────────┘

immich-server ist das Herzstück. Er stellt die Web-Oberfläche bereit, verwaltet Uploads und koordiniert alle anderen Dienste.

immich-machine-learning ist für alle KI-Funktionen zuständig: Gesichtserkennung, CLIP-basierte semantische Suche, Objekterkennung. Das model-cache-Volume verhindert, dass bei jedem Neustart die Modelle neu heruntergeladen werden.

redis übernimmt die Rolle des Job-Brokers. Wenn ein Foto hochgeladen wird, landet der Verarbeitungsauftrag in einer Redis-Queue.

database ist kein gewöhnliches PostgreSQL – Immich nutzt pgvecto-rs, eine Postgres-Erweiterung für Vektoroperationen, die die semantische Ähnlichkeitssuche ermöglicht.


Vorbereitung

Verzeichnis anlegen

mkdir -p /opt/immich
cd /opt/immich

.env Datei erstellen

# Speicherorte
UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres

# Zeitzone
TZ=Europe/Berlin

# Immich Version
IMMICH_VERSION=release

# Datenbank-Passwort – nur A-Za-z0-9, keine Sonderzeichen
DB_PASSWORD=einSicheresPasswort

# Nicht ändern
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

⚠️ DB_PASSWORD muss vor dem ersten Start gesetzt werden. Ein nachträglicher Wechsel ist aufwendig.


docker-compose.yml

immich-server

immich-server:
  container_name: immich_server
  image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
  volumes:
    - ${UPLOAD_LOCATION}:/usr/src/app/upload
    - /etc/localtime:/etc/localtime:ro
  env_file:
    - .env
  ports:
    - '2283:2283'
  networks:
    - immich
  depends_on:
    - redis
    - database
  restart: always
  healthcheck:
    disable: false

Der Server hängt im internen immich-Netzwerk für die Kommunikation mit Redis und Datenbank. depends_on stellt sicher, dass beide Abhängigkeiten bereit sind, bevor der Server startet.

immich-machine-learning

immich-machine-learning:
  container_name: immich_machine_learning
  image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
  volumes:
    - model-cache:/cache
  env_file:
    - .env
  restart: always
  networks:
    - immich
  healthcheck:
    disable: false

Das model-cache-Volume ist entscheidend: Beim ersten Start lädt Immich KI-Modelle herunter (mehrere Hundert MB). Das Volume verhindert wiederholte Downloads bei Container-Neustarts.

redis & database

redis:
  container_name: immich_redis
  image: redis:6.2-alpine
  healthcheck:
    test: redis-cli ping || exit 1
  networks:
    - immich
  restart: always

database:
  container_name: immich_postgres
  image: tensorchord/pgvecto-rs:pg14-v0.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
  networks:
    - immich
  restart: always
  command: >-
    postgres
      -c shared_preload_libraries=vectors.so
      -c 'search_path="$$user", public, vectors'
      -c logging_collector=on
      -c max_wal_size=2GB
      -c shared_buffers=512MB
      -c wal_compression=on

--data-checksums beim Init ist eine Sicherheitsmaßnahme: PostgreSQL prüft bei jedem Lesen die Checksumme der Datenblöcke und erkennt stille Datenkorrumpierung.

Volumes & Netzwerk

volumes:
  model-cache:

networks:
  immich:
    name: immich
    driver: bridge

Start

docker compose up -d

# Logs beobachten
docker compose logs -f immich-server

# Status prüfen
docker compose ps

Beim ersten Start dauert es 2–5 Minuten: Die Datenbank wird initialisiert, Migrationen laufen durch, der ML-Dienst lädt seine Modelle. Danach ist Immich unter http://server-ip:2283 erreichbar. Beim ersten Aufruf wird ein Admin-Account angelegt.


Updates & Wartung

# Auf neue Version updaten
docker compose pull
docker compose up -d

# Datenbank-Backup
docker exec immich_postgres pg_dumpall -U postgres > immich_backup_$(date +%Y%m%d).sql

📌 Vor jedem Update empfiehlt sich ein Blick in die Release Notes – Breaking Changes kommen gelegentlich vor.


Fazit

Immich ist eines der ausgereiftesten Self-Hosting-Projekte im Foto-Bereich. Die Architektur ist durchdacht, die Entwicklung aktiv und die Community groß. Wer einmal die semantische Suche ausprobiert hat, wird Google Photos kaum vermissen.