Immich Self-Hosted auf Debian 13 — Google Photos selbst hosten

Immich debian

Immich auf Debian 13 selbst hosten: Deine eigene Foto-Cloud als Google-Photos-Alternative. Mit AI-Suche, Gesichtserkennung, Mobile Apps und automatischem Backup vom Handy.

💡 Hinweis: Dieses Tutorial setzt voraus, dass du einen normalen Benutzer mit sudo-Rechten verwendest — wie im Tutorial Debian 13 Server absichern beschrieben. Außerdem solltest du Docker installiert und einen Reverse Proxy mit Nginx eingerichtet haben.

Einleitung — Was ist Immich?

Google Photos ist bequem, hat aber einen Preis: Eure intimsten Erinnerungen — Familienfotos, Urlaubsbilder, persönliche Momente — liegen auf Google-Servern. Werden algorithmisch analysiert. Werden für Werbung verwertet. Und mit jedem Plan-Update wird der freie Speicher kleiner.

Immich ist die führende Open-Source-Alternative — und einer der am schnellsten wachsenden Self-Hosting-Projekte 2025/2026. Mobile Apps für iOS und Android, automatischer Foto-Backup vom Handy, AI-basierte Suche („Strand“, „Hund“, „rot“), Gesichtserkennung, Alben, geteilte Links — alles läuft auf eurer Hardware.

Was Immich kann

  • Mobile Apps für iOS und Android mit automatischem Backup
  • AI-Suche — Bilder finden via Beschreibung („Junge mit blauem T-Shirt am Strand“)
  • Gesichtserkennung — Personen automatisch gruppieren und benennen
  • Geo-Karte — Alle Fotos auf der Weltkarte
  • Alben & geteilte Links — Mit Familie und Freunden teilen
  • Live Photos & Motion Photos unterstützt
  • External Libraries — Bestehende Foto-Sammlungen einbinden ohne zu kopieren
  • Multi-User — Familie und Freunde mit eigenem Account
  • HEIC, RAW, Videos — Alle gängigen Formate
  • Hardware-Beschleunigung — Für Transcoding und ML

Hardware-Empfehlung

Foto-BibliothekRAMCPUStorage
< 10.000 Fotos4 GB2 Cores50 GB + Daten
10.000–100.0008 GB4 Cores200 GB + Daten
100.000+16 GB+4 Cores+500 GB + Daten

⚠️ Wichtig: Immich ist noch in aktiver Entwicklung und es gibt regelmäßig Breaking Changes. Lest die Release-Notes vor jedem Update. Versucht niemals, mehrere Major-Versionen auf einmal zu überspringen.

In diesem Guide richten wir Immich auf Debian 13 ein — von der Installation über den Reverse Proxy bis zur Mobile-App.


Voraussetzungen

Firewall & DN

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

DNS-A-Record für photos.example.com auf eure Server-IP setzen.


Schritt 1: Verzeichnisstruktur

sudo mkdir -p /opt/immich
sudo mkdir -p /var/lib/immich/library
sudo mkdir -p /var/lib/immich/postgres
cd /opt/immich

💡 Tipp: Legt das Foto-Library-Verzeichnis (/var/lib/immich/library) bewusst auf eine große Festplatte. Bei vielen Fotos wird das Verzeichnis schnell mehrere hundert GB groß — auf einer kleinen System-SSD landet ihr im Speicher-Engpass.


Schritt 2: docker-compose.yml & .env

Immich offeriert eine fertige Compose-Datei. Wir laden sie und passen sie an:

cd /opt/immich
sudo wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo wget -O example.env https://github.com/immich-app/immich/releases/latest/download/example.env
sudo cp example.env .env
sudo nano .env

Setzt diese Werte:

# Pfad zu eurer Foto-Library
UPLOAD_LOCATION=/var/lib/immich/library

# Pfad zur Datenbank
DB_DATA_LOCATION=/var/lib/immich/postgres

# Zeitzone
TZ=Europe/Berlin

# Datenbank-Passwort (sehr stark wählen!)
DB_PASSWORD=EUER_SICHERES_PASSWORT_HIER

# Image-Version pinnen (nicht "latest"!)
IMMICH_VERSION=v1.140.0

⚠️ Wichtig: Pinnt IMMICH_VERSION immer auf eine konkrete Version. Mit :latest würde euch ein Auto-Update einer Major-Version die Datenbank zerlegen können. Aktuelle stabile Version findet ihr unter github.com/immich-app/immich/releases.

.env-Datei absichern:

sudo chmod 600 .env

Schritt 3: Immich starten

cd /opt/immich
sudo docker compose up -d

Der erste Start dauert mehrere Minuten — Immich muss die Postgres-Extensions (pgvector für AI-Suche) initialisieren und das ML-Model laden.

Logs mitlesen:

sudo docker compose logs -f immich-server

Wenn ihr Listening on port 2283 und Immich Server is running seht, ist alles bereit.

Status prüfen

sudo docker compose ps

Ihr solltet 4 Container sehen:

  • immich_server — Web-API + UI
  • immich_machine_learning — AI für Suche & Gesichtserkennung
  • immich_postgres — Datenbank (mit pgvector)
  • immich_redis — Cache

Schritt 4: Nginx Reverse Proxy

sudo nano /etc/nginx/sites-available/photos.example.com

Inhalt:

server {
    listen 80;
    listen [::]:80;
    server_name photos.example.com;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name photos.example.com;

    ssl_certificate /etc/letsencrypt/live/photos.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.example.com/privkey.pem;

    # Immich-Uploads können sehr groß sein — RAW, 4K-Videos
    client_max_body_size 50000M;

    # Längere Timeouts für große Uploads
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;

    location / {
        proxy_pass http://127.0.0.1:2283;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_redirect off;
    }
}

Aktivieren und SSL holen:

sudo ln -s /etc/nginx/sites-available/photos.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d photos.example.com

⚠️ Wichtig: client_max_body_size 50000M (≈ 50 GB) klingt absurd, aber 4K-Videos vom Handy können 5-10 GB groß sein. Setzt den Wert hoch genug, damit Uploads nicht mit 413 Request Entity Too Large abbrechen.

Im Browser:

https://photos.example.com

Setup-Wizard erscheint.


Schritt 5: Initial-Setup

Im Wizard:

  1. Admin-Account anlegen — E-Mail + sehr starkes Passwort
  2. Anmelden
  3. Im Dashboard kommt direkt die Mobile-App-Empfehlung — wichtig für den Hauptzweck

Geschafft! Immich läuft. Jetzt kommt der spannende Teil — Mobile App und erster Foto-Upload.


Schritt 6: Mobile App einrichten

Immich hat sehr gute Apps für iOS und Android. Beide sind kostenlos.

iOS

App Store → Immich suchen → installieren.

Android

Google Play Store → Immich suchen → installieren.

Alternativ über F-Droid (Open-Source-Alternative ohne Google).

Verbindung herstellen

  1. App öffnen → Server-URL eintragen: https://photos.example.com
  2. Mit eurem Admin-Account anmelden
  3. Backup-Einstellungen:
    • Welche Alben automatisch hochgeladen werden
    • Foreground- vs. Background-Backup
    • Nur über WLAN oder auch mobile Daten
  4. Foreground-Upload starten — der erste Upload kann je nach Galerie-Größe Stunden dauern

💡 Tipp: Beim ersten Backup-Lauf das Handy am Ladegerät und im WLAN lassen. Bei iOS muss die App im Vordergrund bleiben — iOS killt Apps im Hintergrund nach kurzer Zeit. Android-Apps laufen oft länger.


Schritt 7: Wichtige Server-Einstellungen

In der Web-UI als Admin: Administration → Settings.

Job-Konfiguration tunen

Server Settings → Job Settings: Wenn euer Server stark ist, könnt ihr die Concurrency erhöhen — vor allem Thumbnail Generation und Face Detection. Auf einem 4-Core-Server z.B. auf 4 setzen.

Speicher-Template aktivieren

Storage Template entscheidet, wie Fotos auf der Festplatte abgelegt werden. Default: {{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}. Funktioniert, aber für Backups nicht ideal.

Empfehlung:

{{y}}/{{MM}}/{{filename}}

Damit habt ihr eine klare Jahres- und Monats-Struktur — auch ohne Immich verständlich.

⚠️ Wichtig: Wenn ihr das Storage-Template später ändert, sind alte Fotos nicht automatisch umsortiert. Macht es bevor ihr eure ganze Galerie hochladet. Manuelles Re-Organize geht in den Settings, ist aber zeitintensiv.

Maschine-Learning-Modelle

Standard ist ViT-B-32__openai. Für deutsche Beschreibungen besser:

  • XLM-Roberta-Large-Vit-B-16Plus — multilingual (auch Deutsch)
  • LABSE-Vit-L-14 — Multilingual, sehr gute Suche

Pro Modell ca. 2 GB Download und 4 GB RAM-Verbrauch — entsprechend dimensionieren.


Schritt 8: Externe Library einbinden — optional

Wenn ihr bestehende Foto-Sammlungen habt (z.B. auf einem NAS), könnt ihr sie als External Library einbinden, ohne sie zu kopieren.

Volume-Mount erweitern

sudo nano /opt/immich/docker-compose.yml

Im immich-server-Service ergänzen:

volumes:
  - ${UPLOAD_LOCATION}:/usr/src/app/upload
  - /etc/localtime:/etc/localtime:ro
  # Externe Library
  - /mnt/nas/photos:/external-library:ro

Container neu starten:

sudo docker compose up -d

In Immich: Administration → External Libraries → Create Library:

  • Path: /external-library
  • Owner: Euer User

Immich indiziert jetzt die Bilder, ohne sie zu kopieren. Vorteil: Kein doppelter Speicherplatz.


Schritt 9: Multi-User-Setup

Wenn Familie und Freunde Immich nutzen sollen:

Administration → Users → Create User:

  • E-Mail, Passwort, Storage-Quota
  • Optional: User darf Admin-Rechte haben

Jeder User hat seine eigene Library — geteilte Alben sind aber jederzeit möglich.


Backups

Immich hat drei kritische Datenquellen:

  • /var/lib/immich/library/ — Eure Fotos & Videos
  • /var/lib/immich/postgres/ — Datenbank mit Metadaten, Faces, Albums
  • /opt/immich/.env — Konfiguration

Wenn die Datenbank weg ist, sind die Fotos noch da — aber alle Faces, Tags, Alben und AI-Suche-Indizes weg.

Postgres-Dump

sudo nano /usr/local/bin/immich-backup.sh

Inhalt:

#!/bin/bash
set -e

BACKUP_DIR="/var/backups/immich"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"

# Postgres-Dump (mit dem von Immich empfohlenen Format!)
docker exec -t immich_postgres pg_dumpall \
  --clean --if-exists --username=postgres \
  | gzip > "$BACKUP_DIR/db-$TIMESTAMP.sql.gz"

# .env-Datei
cp /opt/immich/.env "$BACKUP_DIR/env-$TIMESTAMP.bak"

# Alte Backups
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -delete

echo "Backup completed: $TIMESTAMP"

⚠️ Best Practice: Die Foto-Library (/var/lib/immich/library/) ist das, was eure Erinnerungen ausmacht. Sichert sie immer zusätzlich an einen zweiten Ort — idealerweise per restic in einen Cloud-Bucket. Siehe unser restic-Tutorial.

sudo chmod +x /usr/local/bin/immich-backup.sh
sudo /usr/local/bin/immich-backup.sh

Updates

Immich-Updates können Breaking Changes enthalten — vor jedem Update Release-Notes lesen!

cd /opt/immich

# IMMICH_VERSION in .env auf neue Version setzen
sudo nano .env

# Backup VOR dem Update!
sudo /usr/local/bin/immich-backup.sh

# Update
sudo docker compose pull
sudo docker compose up -d

Der erste Start nach Update kann 5-10 Minuten dauern (Datenbank-Migrationen).

💡 Empfehlung: Updatet Immich nicht häufiger als alle 4-6 Wochen. Major-Versionen brauchen oft Migrationszeit, und es gibt regelmäßig Bugfix-Releases kurz nach Major-Releases — auf die zu warten lohnt sich.


Zusammenfassung & Checkliste

SchrittStatus
Debian 13 + Docker installiert
Verzeichnisstruktur unter /var/lib/immich
docker-compose.yml und .env aus Repo
IMMICH_VERSION auf konkrete Version gepinnt
DB_PASSWORD stark gesetzt
Immich-Container laufen
Nginx Reverse Proxy konfiguriert
client_max_body_size ausreichend hoch
SSL-Zertifikat eingerichtet
Admin-Account angelegt
Mobile App auf iOS/Android verbunden
Erster Backup-Lauf abgeschlossen
Storage-Template gesetzt
Multi-User für Familie angelegt (optional)
Backup-Script eingerichtet

Troubleshooting

Upload bricht ab mit „413 Request Entity Too Large“

client_max_body_size in Nginx zu klein. In der vhost-Config auf 50000M setzen, dann sudo systemctl reload nginx.

Mobile App findet Server nicht

  • Server-URL korrekt? Mit https:// und ohne Trailing-Slash
  • Self-signed Cert? Immich-App vertraut nur gültigen Let’s-Encrypt-Certs
  • Firewall blockiert Port 443?

„out of memory“ bei Face Detection

  • Concurrency in den Job Settings reduzieren
  • RAM aufstocken (Face Detection ist RAM-hungrig)
  • Kleineres ML-Model wählen

Postgres-Container startet nicht: „FATAL: data directory not empty“

Ihr habt vermutlich von einer alten Immich-Version geupdatet, ohne Migration. Lösung:

  • Backup zurückspielen ODER
  • Postgres-Volume löschen und Library neu indexieren (Achtung: AI-Daten weg!)

„ImagickException: Postscript delegate failed“

PDF-Vorschauen brauchen Ghostscript. In Immich-Image schon enthalten — wenn ihr trotzdem Fehler seht, Container neu starten.

Suche findet nichts

  • Maschine-Learning-Container läuft? sudo docker compose ps
  • Smart Search Job durchgelaufen? Administration → Jobs → Smart Search
  • Bei großen Libraries dauert das initial mehrere Stunden

Background-Upload auf iOS funktioniert nicht

iOS Background-Modi sind sehr restriktiv. Lösungen:

  • Foreground-Upload als Hauptmethode nutzen
  • In iOS-Einstellungen → Immich → Hintergrundaktualisierung aktivieren
  • App im Multitasking-Manager nicht beenden

Nächste Schritte

  • Hardware-Beschleunigung für Transcoding (Intel QSV, NVIDIA NVENC)
  • Authentik-OIDC für Immich — falls ihr Authentik habt
  • External Backup mit restic — Foto-Library in Backblaze B2 / Hetzner Storage Box
  • Immich CLI für Bulk-Imports von alten Festplatten
  • Geo-Anonymisierung — GPS-Daten vor dem Teilen entfernen

Habt ihr Fragen oder Probleme? Schreibt es in die Kommentare — ich helfe gerne!

Kommentar hinterlassen