Immich auf einem VPS mit Docker Compose selbst hosten
Stellen Sie Immich auf einem VPS als selbst gehosteten Google-Photos-Ersatz bereit. Docker-Compose-Setup, Mobile-Backup, Speicherplanung mit realen Zahlen, Machine Learning auf CPU, Datenbank-Backup und -Wiederherstellung sowie ein sicherer Update-Workflow.
Immich ist eine quelloffene, selbst gehostete Plattform zur Verwaltung von Fotos und Videos. Sie bietet automatisches Mobile-Backup, Gesichtserkennung, intelligente Suche und Album-Sharing. Wenn Sie aufhören wollen, Ihre Fotos an Google zu senden, ist Immich die beste selbst gehostete Alternative.
Immich auf einem europäischen VPS zu betreiben bedeutet, dass Ihre Fotos auf einer Infrastruktur bleiben, die Sie kontrollieren. Kein Scannen durch Dritte, keine Trainingsdatensätze, keine überraschenden Richtlinienänderungen. Für DSGVO-Zwecke sind Sie sowohl Verantwortlicher als auch Auftragsverarbeiter, was die Compliance vereinfacht, wenn die Daten Ihren Server nie verlassen.
Diese Anleitung stellt Immich auf einem entfernten VPS mit Docker Compose bereit. Sie setzt voraus, dass Docker Engine mit dem Compose-Plugin bereits installiert ist und ein Reverse Proxy läuft. Falls Sie diese zuerst benötigen, lesen Sie Docker in Produktion auf einem VPS: Was schiefgeht und wie Sie es beheben und Traefik vs Caddy vs Nginx: Docker Reverse Proxy im Vergleich.
Was brauchen Sie, um Immich auf einem VPS zu betreiben?
Immich benötigt mindestens 6 GB RAM und 2 CPU-Kerne für eine vollständige Bereitstellung mit aktiviertem Machine Learning. Ohne ML reichen 4 GB. Der Speicherbedarf hängt von Ihrer Fotobibliothek ab: Planen Sie die Rohgröße Ihrer Bibliothek plus 10-20 % Overhead für Thumbnails und transcodierte Videos, plus 1-3 GB für die PostgreSQL-Datenbank. Docker Engine mit dem Compose-Plugin ist erforderlich. Immich läuft nur unter Linux.
| Komponente | Minimum | Empfohlen |
|---|---|---|
| RAM | 4 GB (ML deaktiviert) | 8 GB |
| CPU | 2 Kerne | 4 Kerne |
| Speicher | 50 GB (kleine Bibliothek) | 250 GB+ |
| Software | Docker Engine + Compose-Plugin | Gleich |
| OS | Beliebiges Linux mit Docker | Ubuntu 22.04/24.04, Debian 12 |
PostgreSQL benötigt lokalen SSD-Speicher. Legen Sie die Datenbank niemals auf einem Netzwerk-Share ab. Auf einem Virtua VPS ist NVMe Standard, das ist also bereits abgedeckt.
Wie stellen Sie Immich mit Docker Compose bereit?
Laden Sie die offizielle Docker-Compose-Datei und die Beispiel-Umgebungsdatei von der Immich-Release-Seite herunter, konfigurieren Sie Ihre Speicherpfade und das Datenbankpasswort und starten Sie den Stack.
Projektverzeichnis erstellen
mkdir -p /opt/immich && cd /opt/immich
Offizielle Dateien herunterladen
Laden Sie diese immer vom aktuellen Release herunter. Kopieren Sie nichts aus Blog-Beiträgen (diesen eingeschlossen), da Immich seine Compose-Datei regelmäßig aktualisiert, um sie an Änderungen der Datenbank-Images anzupassen.
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
Umgebung konfigurieren
Öffnen Sie die .env-Datei:
nano .env
Setzen Sie diese Werte:
UPLOAD_LOCATION=/opt/immich/data
DB_DATA_LOCATION=/opt/immich/postgres
IMMICH_VERSION=v2.6.1
DB_PASSWORD=<Ihr-starkes-Passwort>
TZ=Europe/Berlin
Erzeugen Sie ein starkes Datenbankpasswort mit ausschließlich alphanumerischen Zeichen (A-Za-z0-9). Sonderzeichen verursachen Parsing-Probleme bei Docker Compose in .env-Dateien:
openssl rand -base64 32 | tr -dc 'A-Za-z0-9' | head -c 32; echo
Kopieren Sie die Ausgabe und fügen Sie sie als DB_PASSWORD-Wert ein.
Pinnen Sie IMMICH_VERSION auf ein bestimmtes Release-Tag wie v2.6.1, anstatt den v2-Metatag zu verwenden. Das verhindert überraschende Upgrades, wenn Sie docker compose pull für andere Dienste ausführen. Sie kontrollieren, wann Immich aktualisiert wird.
Datenverzeichnisse erstellen
mkdir -p /opt/immich/data /opt/immich/postgres
Exponierten Port entfernen
Die Standard-Compose-Datei exponiert Port 2283 direkt. Da Sie einen Reverse Proxy verwenden, entfernen oder kommentieren Sie den ports-Abschnitt in docker-compose.yml aus, damit Immich nur über den Proxy erreichbar ist:
sed -i "s/- '2283:2283'/# - '2283:2283'/" docker-compose.yml
Verbinden Sie stattdessen Immich mit dem Docker-Netzwerk Ihres Reverse Proxy. Wenn Ihr Proxy-Netzwerk proxy heißt:
cat >> docker-compose.yml << 'EOF'
networks:
default:
proxy:
external: true
EOF
Fügen Sie dann das proxy-Netzwerk zum immich-server-Dienst hinzu. Bearbeiten Sie docker-compose.yml und ergänzen Sie unter dem immich-server-Dienst:
networks:
- default
- proxy
Dadurch bleiben Datenbank und Redis im internen Netzwerk, während nur der Server dem Reverse Proxy zugänglich ist.
Stack starten
docker compose up -d
Beobachten Sie die Logs, um zu bestätigen, dass alle Dienste sauber starten:
docker compose logs -f --tail=50
Die Server-Logs zeigen Immich Server is listening on http://[::1]:2283, sobald er bereit ist. Der Machine-Learning-Dienst lädt danach seine Modelle. Drücken Sie Ctrl+C, um den Log-Stream zu verlassen.
Prüfen Sie, ob alle vier Container laufen:
docker compose ps
NAME STATUS
immich_server Up (healthy)
immich_machine_learning Up (healthy)
immich_redis Up (healthy)
immich_postgres Up (healthy)
Alle vier sollten innerhalb von ein paar Minuten Up (healthy) zeigen. Der ML-Container braucht am längsten, weil er beim ersten Start die Modelle herunterlädt.
Dateiberechtigungen einschränken
Die .env-Datei enthält Ihr Datenbankpasswort. Schränken Sie den Zugriff ein:
chmod 600 .env
ls -la .env
-rw------- 1 root root 245 Mar 20 10:00 .env
Wie richten Sie einen Reverse Proxy für Immich ein?
Immich benötigt einen Reverse Proxy für HTTPS und zur Verarbeitung großer Datei-Uploads von Mobilgeräten. Sie müssen das Limit für die Anfragekörpergröße hoch genug für Video-Uploads einstellen. Ohne dies schlagen Uploads über dem Standardlimit (typischerweise 1 MB bei Nginx) stillschweigend fehl.
Für eine vollständige Reverse-Proxy-Einrichtung lesen Sie Traefik vs Caddy vs Nginx: Docker Reverse Proxy im Vergleich. Hier sind die Immich-spezifischen Ausschnitte.
Caddy
In Ihrer Caddyfile:
photos.example.com {
reverse_proxy immich_server:2283
}
Caddy verwaltet TLS automatisch und hat kein Standard-Größenlimit für den Body, sodass Video-Uploads sofort funktionieren.
Traefik
Fügen Sie Labels zum immich-server-Dienst in docker-compose.yml hinzu:
labels:
- "traefik.enable=true"
- "traefik.http.routers.immich.rule=Host(`photos.example.com`)"
- "traefik.http.routers.immich.entrypoints=websecure"
- "traefik.http.routers.immich.tls.certresolver=letsencrypt"
- "traefik.http.services.immich.loadbalancer.server.port=2283"
Für große Uploads mit Traefik fügen Sie eine Middleware hinzu, um das Buffering-Limit zu erhöhen, oder konfigurieren Sie maxRequestBodyBytes in Ihrer statischen Traefik-Konfiguration.
Nginx
Wenn Sie Nginx als Reverse Proxy verwenden, ist die Schlüsseleinstellung client_max_body_size. Ohne sie schlagen Video-Uploads fehl:
server {
server_name photos.example.com;
client_max_body_size 50000M;
location / {
proxy_pass http://immich_server:2283;
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 support for real-time updates
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Richten Sie Ihren DNS-A-Eintrag (und AAAA falls Sie IPv6 haben) auf die IP-Adresse Ihres VPS. Nach der DNS-Propagierung erreichen Sie Immich unter https://photos.example.com.
Wie sichern Sie Immich nach dem ersten Login ab?
Öffnen Sie https://photos.example.com in Ihrem Browser. Immich zeigt eine Registrierungsseite. Erstellen Sie Ihr Admin-Konto mit einem starken Passwort.
Deaktivieren Sie nach der Erstellung Ihres Admin-Kontos sofort die öffentliche Registrierung. Gehen Sie zu Administration > Settings > Server und deaktivieren Sie Allow New Users. Andernfalls könnte jeder, der Ihre URL entdeckt, ein Konto erstellen und Dateien auf Ihren Speicher hochladen.
Einstellungen im Admin-Panel prüfen
- Administration > Settings > Storage Template: Aktivieren Sie dies, um Dateien nach Datum zu organisieren (
{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}) statt nach zufälligen UUIDs. Das ermöglicht manuelles Durchsuchen und selektive Wiederherstellungen. - Administration > Settings > Backup: Automatische Datenbank-Backups sind standardmäßig aktiv, täglich um 2:00 Uhr mit 14 Tagen Aufbewahrung. Bestätigen Sie, dass dies aktiv ist.
- Administration > Settings > Server: Setzen Sie die externe URL auf Ihre Domain (
https://photos.example.com). Die mobile App und geteilte Links verwenden diese.
Absicherung auf Container-Ebene
Fügen Sie Sicherheitsoptionen zum immich-server-Dienst in docker-compose.yml hinzu:
security_opt:
- no-new-privileges:true
Dies verhindert Privilege Escalation innerhalb des Containers. Das no-new-privileges-Flag blockiert setuid-Binaries daran, erhöhte Berechtigungen zu erlangen.
Für Ressourcenlimits fügen Sie Speicherbeschränkungen hinzu, um zu verhindern, dass ein einzelner Container den gesamten VPS-RAM verbraucht und den OOM Killer auslöst. Lesen Sie Docker Compose Ressourcenlimits, Healthchecks und Neustartrichtlinien für die vollständige Syntax. Ein praktischer Ausgangspunkt für einen 8-GB-VPS:
deploy:
resources:
limits:
memory: 2G
Setzen Sie dies für immich-server und immich-machine-learning. PostgreSQL und Redis benötigen selten explizite Limits auf einem 8-GB-VPS, profitieren aber davon auf einer 4-GB-Instanz.
Versionsinformationen verbergen
Immich zeigt seine Version standardmäßig in API-Antworten. Das ist keine direkte Sicherheitslücke, aber Versionsinformationen helfen Angreifern, bekannte Probleme gezielt auszunutzen. Es gibt keinen integrierten Schalter zum Verbergen, aber Ihr Reverse Proxy kann Response-Header entfernen. In Nginx:
proxy_hide_header X-Powered-By;
Wie verbinden Sie die Immich-Mobile-App für automatisches Backup?
Installieren Sie die Immich-App aus dem App Store (iOS) oder Google Play (Android). Beim ersten Start geben Sie Ihre Server-URL (https://photos.example.com) ein und melden sich mit Ihren Admin-Zugangsdaten an. Die App fordert Sie auf, das automatische Backup zu aktivieren.
Automatisches Backup konfigurieren
- Öffnen Sie die App, tippen Sie auf Ihren Avatar oben rechts, dann Backup Settings.
- Aktivieren Sie Background Backup. Unter iOS aktivieren Sie zusätzlich Background App Refresh in den Systemeinstellungen. Unter Android deaktivieren Sie die Akkuoptimierung für Immich, damit das System die App nicht beendet.
- Wählen Sie die zu sichernden Alben. Standardmäßig sichert Immich Ihre Kamerarolle. Sie können weitere Alben (Screenshots, WhatsApp-Bilder) auf dem Album-Auswahlbildschirm hinzufügen.
- Aktivieren Sie Cellular Backup nur, wenn Ihr Mobilfunktarif es zulässt. Große Video-Uploads können mehrere GB verbrauchen.
Erster Backup-Test
Machen Sie ein Foto, öffnen Sie die Immich-App und ziehen Sie nach unten zum Aktualisieren. Das Foto sollte innerhalb von Sekunden in der Timeline erscheinen, wenn Sie im WLAN sind. Die Backup-Statusanzeige in der App zeigt ein grünes Häkchen, wenn alle Fotos synchronisiert sind.
Von Ihrem VPS aus können Sie bestätigen, dass Uploads ankommen:
ls /opt/immich/data/upload/
Sie sehen ein Verzeichnis, das nach Ihrer Benutzer-ID benannt ist und die hochgeladenen Dateien enthält.
Wie viel Speicher braucht Immich pro Foto?
Speicherplanung auf einem VPS ist wichtiger als auf einem NAS, weil Sie nicht einfach eine weitere Festplatte einsetzen können. Hier sind reale Zahlen basierend auf typischen Smartphone-Fotobibliotheken.
Speicher pro Fototyp
| Format | Durchschnittsgröße | Anmerkungen |
|---|---|---|
| Smartphone JPEG | 3-5 MB | Häufigstes Format |
| HEIC (iPhone) | 2-3 MB | Apple-Standard seit iPhone 7 |
| RAW (DSLR) | 25-50 MB | Professionelle Kameras |
| Smartphone-Video (1080p) | ~150 MB/min | Variiert je nach Codec |
| Smartphone-Video (4K) | ~400 MB/min | H.265 spart ~40 % |
Gesamtspeicher nach Bibliotheksgröße
Diese Tabelle verwendet Smartphone-JPEGs mit durchschnittlich 4 MB plus Immich-Overhead (Thumbnails, Transcodes, Datenbank).
| Bibliotheksgröße | Rohfotos | Thumbnails (~15 %) | DB | Gesamt |
|---|---|---|---|---|
| 10.000 Fotos | 40 GB | 6 GB | 1 GB | ~47 GB |
| 25.000 Fotos | 100 GB | 15 GB | 1,5 GB | ~117 GB |
| 50.000 Fotos | 200 GB | 30 GB | 2 GB | ~232 GB |
| 100.000 Fotos | 400 GB | 60 GB | 3 GB | ~463 GB |
| 200.000 Fotos | 800 GB | 120 GB | 4 GB | ~924 GB |
Wenn Ihre Bibliothek Videos enthält, multiplizieren Sie den Speicherbedarf entsprechend. Eine Bibliothek mit 10 % Videoanteil (nach Dateianzahl) kann den Speicherbedarf verdoppeln, da Videos 30- bis 100-mal größer sind als Fotos.
Wann zusätzlichen Speicher hinzufügen
Auf einem Virtua VPS können Sie zusätzliche Block-Storage-Volumes anhängen, wenn Ihre Hauptfestplatte voll wird. Mounten Sie das Volume und richten Sie UPLOAD_LOCATION darauf. Für Bibliotheken über 500 GB sollten Sie S3-kompatiblen externen Speicher in Betracht ziehen. Immich unterstützt dies über seine Speicherkonfiguration und lagert Medien in Object Storage aus, während Datenbank und Thumbnails lokal bleiben.
Überwachen Sie die Festplattennutzung mit einer einfachen Cron-Prüfung:
df -h /opt/immich/data
Richten Sie eine Warnung ein, wenn die Nutzung 80 % überschreitet. Eine volle Festplatte beschädigt die PostgreSQL-Datenbank und kann Ihre Immich-Instanz ohne Backup unwiederbringlich machen.
Die « Free Up Space »-Funktion ab v2.5
Immich v2.5+ enthält einen « Free Up Space »-Button in der mobilen App. Nachdem Fotos auf Ihren Server gesichert wurden, kann die App lokale Kopien von Ihrem Telefon löschen, um Speicher freizugeben. Nur Dateien, deren Upload bestätigt ist und die sich nicht im Immich-Papierkorb befinden, werden entfernt. Die Funktion funktioniert auf iOS und Android.
Wie funktioniert Immichs Machine Learning ohne GPU?
Immichs ML-Funktionen (Gesichtserkennung, intelligente Suche via CLIP und Objekterkennung) laufen standardmäßig auf der CPU. Kein GPU erforderlich. Der immich-machine-learning-Container lädt Modelle in den RAM und verarbeitet Fotos im Hintergrund, ohne Uploads oder das Browsen zu blockieren.
Auf einem 4-Kern-VPS mit 8 GB RAM können Sie diese ungefähren Verarbeitungszeiten für den initialen Scan erwarten:
| Bibliotheksgröße | Gesichtserkennung | CLIP-Indexierung | Gesamt (sequenziell) |
|---|---|---|---|
| 1.000 Fotos | ~15 min | ~20 min | ~35 min |
| 10.000 Fotos | ~2,5 Stunden | ~3,5 Stunden | ~6 Stunden |
| 50.000 Fotos | ~12 Stunden | ~17 Stunden | ~29 Stunden |
Das sind einmalige Kosten. Nach dem initialen Scan werden neue Uploads in Sekunden verarbeitet. Der ML-Container läuft mit niedriger Priorität und blockiert weder Uploads noch das Browsen, während er die Warteschlange abarbeitet.
Modellauswahl
Immich verwendet zwei Haupt-ML-Modelle:
- Gesichtserkennung: Erkennt und gruppiert Gesichter in Ihrer Bibliothek. Läuft automatisch bei jedem Upload.
- CLIP (intelligente Suche): Indexiert Fotos nach Inhalt, sodass Sie nach « Sonnenuntergang » oder « Hund am Strand » suchen können, ohne Tags zu verwenden. Benötigt mehr RAM als die Gesichtserkennung.
Beide Modelle werden in den RAM geladen, wenn sie zum ersten Mal benötigt werden, und nach 5 Minuten Inaktivität entladen (MACHINE_LEARNING_MODEL_TTL=300 standardmäßig). Auf einem speicherbeschränkten VPS können Sie diesen Wert verringern, um RAM schneller freizugeben:
# In .env
MACHINE_LEARNING_MODEL_TTL=60
Erstellen Sie den Container neu, nachdem Sie Umgebungsvariablen geändert haben (ein Neustart reicht nicht):
docker compose up -d --force-recreate immich-machine-learning
RAM-Verteilung nach Komponente
| Komponente | RAM-Nutzung (8-GB-VPS) | RAM-Nutzung (4-GB-VPS) |
|---|---|---|
| immich-server | ~500 MB | ~500 MB |
| immich-machine-learning | ~1,5-2 GB | deaktiviert |
| PostgreSQL | ~500 MB-1 GB | ~500 MB |
| Redis (Valkey) | ~50 MB | ~50 MB |
| OS + Docker-Overhead | ~1 GB | ~1 GB |
| Verfügbarer Spielraum | ~3-4 GB | ~2 GB |
Wie deaktivieren Sie ML, um Ressourcen auf einem kleinen VPS zu sparen?
Wenn Sie einen 4-GB-VPS betreiben oder Ressourcen sparen wollen, entfernen oder kommentieren Sie den immich-machine-learning-Dienst in docker-compose.yml aus:
cd /opt/immich
Bearbeiten Sie docker-compose.yml und kommentieren (oder löschen) Sie den gesamten immich-machine-learning-Dienstblock aus. Starten Sie dann neu:
docker compose up -d
Sie verlieren Gesichtserkennung, intelligente Suche und Objekterkennung. Foto-Upload, Browsen, Teilen und Albumverwaltung funktionieren normal weiter. Sie können ML später wieder aktivieren, indem Sie den Dienst einkommentieren und neu starten.
Wie sichern Sie die Datenbank und Fotos von Immich?
Sichern Sie zwei Dinge: die PostgreSQL-Datenbank mit pg_dump und das Upload-Verzeichnis mit rsync. Planen Sie beides per Cron. Verwenden Sie kein rsync --delete auf dem Backup-Ziel, da eine Beschädigung auf der Quelle sich auf Ihr Backup ausbreiten würde. Speichern Sie mindestens eine Kopie außerhalb des Servers. Testen Sie Ihre Wiederherstellungsprozedur regelmäßig.
Datenbank-Backup
docker exec -t immich_postgres pg_dump \
--clean --if-exists \
--dbname=immich \
--username=postgres | gzip > /opt/immich/backups/db-$(date +%Y%m%d-%H%M%S).sql.gz
Upload-Verzeichnis sichern
rsync -a --info=progress2 \
/opt/immich/data/ \
/mnt/backup/immich-data/
Überspringen Sie Thumbnails und transcodierte Videos, um Platz zu sparen. Sie werden automatisch neu generiert:
rsync -a --info=progress2 \
--exclude='thumbs/' \
--exclude='encoded-video/' \
/opt/immich/data/ \
/mnt/backup/immich-data/
Mit Cron automatisieren
Erstellen Sie ein Backup-Skript:
cat > /opt/immich/backup.sh << 'SCRIPT'
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/mnt/backup/immich"
mkdir -p "$BACKUP_DIR/db"
# Database dump
docker exec -t immich_postgres pg_dump \
--clean --if-exists \
--dbname=immich \
--username=postgres | gzip > "$BACKUP_DIR/db/immich-db-$(date +%Y%m%d).sql.gz"
# Keep last 14 database dumps
find "$BACKUP_DIR/db" -name "immich-db-*.sql.gz" -mtime +14 -delete
# Media sync (excludes regeneratable data)
rsync -a \
--exclude='thumbs/' \
--exclude='encoded-video/' \
/opt/immich/data/ \
"$BACKUP_DIR/media/"
echo "Backup completed: $(date)"
SCRIPT
chmod 700 /opt/immich/backup.sh
Planen Sie die Ausführung jede Nacht um 3:00 Uhr (nach Immichs eigenem internem Backup um 2:00 Uhr):
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/immich/backup.sh >> /var/log/immich-backup.log 2>&1") | crontab -
Offsite-Backup
Für eine echte 3-2-1-Backup-Strategie kopieren Sie Backups mit rclone auf einen beliebigen S3-kompatiblen Speicheranbieter:
rclone sync /mnt/backup/immich remote:immich-backup --transfers 4
Lesen Sie die Dokumentation Ihres Speicheranbieters für die rclone-Konfiguration.
Wiederherstellung testen
Ein Backup, das Sie nicht getestet haben, ist kein Backup. Hier ist die Wiederherstellungsprozedur:
cd /opt/immich
docker compose down -v
rm -rf /opt/immich/postgres/*
docker compose pull
docker compose create
docker start immich_postgres
sleep 10
gunzip --stdout /mnt/backup/immich/db/immich-db-20260320.sql.gz | \
sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" | \
docker exec -i immich_postgres psql \
--dbname=immich \
--username=postgres \
--single-transaction \
--set ON_ERROR_STOP=on
docker compose up -d
Melden Sie sich nach der Wiederherstellung in der Web-Oberfläche an. Durchsuchen Sie Ihre Timeline und bestätigen Sie, dass Fotos geladen werden. Falls Thumbnails fehlen (weil Sie sie vom Backup ausgeschlossen haben), gehen Sie zu Administration > Job Queues und starten Sie Generate Thumbnails.
Wie aktualisieren Sie Immich sicher?
Immich folgt dem semantischen Versionierungsschema und veröffentlicht häufig. Einige Releases beinhalten Datenbankmigrationen. Ein Downgrade nach einem Upgrade wird nicht unterstützt. Sie brauchen daher einen disziplinierten Update-Workflow.
Schritt-für-Schritt-Update-Prozedur
-
Changelog lesen. Prüfen Sie die Releases-Seite auf Breaking Changes, bevor Sie etwas pullen.
-
Datenbank sichern. Führen Sie das Backup-Skript oder ein manuelles
pg_dumpwie oben gezeigt aus. Überspringen Sie diesen Schritt nicht. -
Versions-Pin aktualisieren. Bearbeiten Sie
/opt/immich/.envund ändern SieIMMICH_VERSIONauf die neue Version:
# Example: updating from v2.6.1 to v2.7.0
sed -i 's/IMMICH_VERSION=v2.6.1/IMMICH_VERSION=v2.7.0/' /opt/immich/.env
- Pullen und neu starten.
cd /opt/immich
docker compose pull
docker compose up -d
- Logs prüfen.
docker compose logs -f --tail=100
Suchen Sie nach Migrationsmeldungen und bestätigen Sie, dass der Server fehlerfrei startet. Datenbankmigrationen laufen automatisch beim Start.
- Alte Images aufräumen.
docker image prune -f
Rollback
Wenn etwas schiefgeht, können Sie nicht einfach die Version zurücksetzen, da die Datenbank möglicherweise migriert wurde. Stellen Sie stattdessen Ihr Pre-Update-Datenbank-Backup wieder her:
- Stack stoppen:
docker compose down -v - Datenbank aus Ihrem Backup wiederherstellen (siehe den Wiederherstellungsabschnitt oben)
IMMICH_VERSIONin.envauf die vorherige Version zurücksetzen- Stack starten:
docker compose up -d
Deshalb sichern Sie vor jedem Update.
Wie importieren Sie Fotos aus Google Takeout in Immich?
Der einfachste Weg, einen Google-Photos-Export zu importieren, ist immich-go, ein Community-Tool, das Google-Takeout-ZIP-Dateien direkt liest. Es bewahrt Albumstruktur, Daten und GPS-Metadaten aus den JSON-Sidecar-Dateien.
Laden Sie immich-go auf Ihrem lokalen Rechner herunter (nicht auf dem VPS). Generieren Sie einen API-Schlüssel in Immich: Klicken Sie auf Ihren Avatar > Account Settings > API Keys > New API Key.
immich-go upload from-google-photos \
--server=https://photos.example.com \
--api-key=your-api-key \
/path/to/takeout-*.zip
Führen Sie zuerst einen Dry Run aus, um zu sehen, was importiert wird:
immich-go upload from-google-photos \
--server=https://photos.example.com \
--api-key=your-api-key \
--dry-run \
/path/to/takeout-*.zip
Das Tool dedupliziert per Checksum. Wenn Sie den Import zweimal ausführen, wird nichts ein zweites Mal hochgeladen.
Für kleinere Imports (unter ein paar tausend Fotos) verwenden Sie die Immich-Web-Oberfläche. Ziehen Sie Dateien per Drag-and-Drop in die Timeline-Ansicht oder klicken Sie auf den Upload-Button. Der Web-Uploader verarbeitet Batches, ist aber langsamer als immich-go für große Bibliotheken.
Externe Bibliothek mounten
Wenn Ihre Fotos bereits auf dem VPS-Dateisystem liegen (von einem früheren Backup oder einer Migration), können Sie sie als externe Bibliothek mounten, anstatt sie erneut hochzuladen. Fügen Sie den Pfad als Volume in docker-compose.yml unter immich-server hinzu:
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /mnt/photos:/mnt/photos:ro
Gehen Sie dann in der Immich-Web-Oberfläche zu Administration > External Libraries und fügen Sie /mnt/photos als Bibliothekspfad hinzu. Immich indexiert die Dateien vor Ort, ohne sie zu kopieren. Das :ro-Flag hält den Mount schreibgeschützt, damit Immich Ihre Originale nicht verändern kann.
Fehlerbehebung
Container startet in einer Schleife neu
Prüfen Sie die Logs des betroffenen Containers:
docker compose logs immich-server --tail=50
docker compose logs database --tail=50
Häufige Ursachen: falsches DB_PASSWORD in .env (Container und Datenbank stimmen nicht überein), unzureichender RAM (OOM Killer) oder volle Festplatte.
Uploads schlagen stillschweigend fehl
Fast immer ein Limit der Anfragekörpergröße beim Reverse Proxy. Prüfen Sie Ihre Proxy-Konfiguration auf client_max_body_size (Nginx) oder Äquivalent. Caddy hat kein Standardlimit. Traefik-Standardwerte variieren je nach Version.
ML-Modelle laden nicht
Der ML-Container lädt Modelle beim ersten Start herunter. Wenn Ihr VPS begrenzte Bandbreite hat oder der Download unterbrochen wurde, können die Modelle beschädigt sein. Entfernen Sie den Container, löschen Sie das Modell-Cache-Volume und erstellen Sie ihn neu:
docker compose rm -sf immich-machine-learning
docker volume rm immich_model-cache
docker compose up -d immich-machine-learning
Fotos werden angezeigt, aber Thumbnails sind fehlerhaft
Regenerieren Sie Thumbnails über das Admin-Panel: Administration > Job Queues > Generate Thumbnails > Start.
Datenbankverbindungsfehler nach Wiederherstellung
Wenn Sie Fehler wie relation already exists oder foreign key constraint violated während einer Wiederherstellung sehen, war die Datenbank vor dem Import nicht vollständig bereinigt. Stoppen Sie alle Container, löschen Sie das DB_DATA_LOCATION-Verzeichnis, erstellen Sie den Postgres-Container neu, warten Sie 10 Sekunden auf die Initialisierung und führen Sie die Wiederherstellung erneut aus.
Logs prüfen
Alle Immich-Logs laufen über Dockers Logging-Treiber:
docker compose logs -f
Für einen bestimmten Dienst:
docker compose logs database -f
docker compose logs immich-machine-learning -f
Nur Fehler filtern:
docker compose logs immich-server 2>&1 | grep -i error
Bereit, es selbst auszuprobieren?
Stellen Sie Ihren eigenen Server in Sekunden bereit. Linux, Windows oder FreeBSD. →