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-Bibliothek | RAM | CPU | Storage |
|---|---|---|---|
| < 10.000 Fotos | 4 GB | 2 Cores | 50 GB + Daten |
| 10.000–100.000 | 8 GB | 4 Cores | 200 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
- Debian 13 Server — siehe Debian 13 Server-Guide
- Docker & Docker Compose — siehe Docker-Tutorial
- Nginx als Reverse Proxy — siehe Nginx Reverse Proxy Tutorial
- Mindestens 4 GB RAM
- Domain (z.B.
photos.example.com)
Firewall & DN
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw statusDNS-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 .envSetzt 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_VERSIONimmer auf eine konkrete Version. Mit:latestwü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 .envSchritt 3: Immich starten
cd /opt/immich
sudo docker compose up -dDer 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-serverWenn ihr Listening on port 2283 und Immich Server is running seht, ist alles bereit.
Status prüfen
sudo docker compose psIhr solltet 4 Container sehen:
immich_server— Web-API + UIimmich_machine_learning— AI für Suche & Gesichtserkennungimmich_postgres— Datenbank (mit pgvector)immich_redis— Cache
Schritt 4: Nginx Reverse Proxy
sudo nano /etc/nginx/sites-available/photos.example.comInhalt:
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 mit413 Request Entity Too Largeabbrechen.
Im Browser:
https://photos.example.comSetup-Wizard erscheint.
Schritt 5: Initial-Setup
Im Wizard:
- Admin-Account anlegen — E-Mail + sehr starkes Passwort
- Anmelden
- 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
- App öffnen → Server-URL eintragen:
https://photos.example.com - Mit eurem Admin-Account anmelden
- Backup-Einstellungen:
- Welche Alben automatisch hochgeladen werden
- Foreground- vs. Background-Backup
- Nur über WLAN oder auch mobile Daten
- 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.ymlIm immich-server-Service ergänzen:
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
# Externe Library
- /mnt/nas/photos:/external-library:roContainer neu starten:
sudo docker compose up -dIn 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.shInhalt:
#!/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.shUpdates
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 -dDer 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
| Schritt | Status |
|---|---|
| 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!