Von Google Photos zu Immich
Du hast tausende Fotos bei Google liegen und fragst dich schon länger, ob das wirklich sein muss? Du willst die Kontrolle über deine Daten haben?
Dann ist Immich vielleicht interessant für dich.
Ich nutze Google Photos seit Jahren. Automatisches Backup, vernünftige Suche, funktioniert einfach. Das Problem: Alle meine Fotos liegen auf Googles Servern. Das war mir lange egal. Inzwischen nicht mehr. Die weltpolitische Lage ist angespannt und bevor irgendein Größenwahnsinniger mit zu viel Macht beschließt, dass Nicht-Amerikaner nicht mehr auf Amerikanische Server zugreifen dürfen und ich nicht mehr an meine Fotos komme suche ich mir lieber eine Alternative.
Immich ist eine selbst gehostete Antwort auf Google Photos. Gleiche Idee: automatisches Backup vom Handy, Web-Galerie, Zeitleiste, Gesichtserkennung, Suche nach Motiven ("Strand", "Hund"). Nur dass die Fotos auf meinem Server landen, nicht bei Google.
Der Umzug erfolgte in zwei Schritten: erst die Installation, dann der eigentliche Umzug der Daten.
Installation auf dem Homeserver
Immich läuft als Docker-Stack. Das klingt nach mehr als es ist. Die Entwickler liefern eine fertige docker-compose.yml mit, die man nur noch an die eigene Umgebung anpassen muss.
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
Der Stack besteht aus vier Containern:
immich-server— API, Web-UI, Thumbnails und Metadaten-Extraktionimmich-machine-learning— Gesichts- und Objekterkennungredis— Job-Queuepostgres— Datenbank (mit pgvector-Extension)
Die wichtigsten Einstellungen in der .env:
UPLOAD_LOCATION=/mnt/data/immich/library # Wo die Fotos landen
DB_DATA_LOCATION=/mnt/data/immich/postgres # Datenbankdaten
IMMICH_VERSION=release
Dann:
docker compose up -d
Immich ist danach unter Port 2283 erreichbar. Für einen vernünftigen Betrieb empfehle ich noch einen Reverse Proxy davor (ich nutze Traefik) und am besten gleich eine Domäne mit HTTPS. Der erste Start dauert ein paar Minuten, weil die ML-Modelle geladen werden.
Kleiner Stolperstein beim ersten Update
Immich wird aktiv entwickelt, Breaking Changes sind explizit dokumentiert. Bei einem Update bin ich über folgenden Fehler gestolpert:
could not access file "$libdir/vectors": No such file or directory
Ursache: Die Datenbank hatte noch die alte pgvecto.rs-Extension, neuere Images erwarten vectorchord. Die Lösung ist ein kurzer Zwischenschritt mit dem alten Image, dann Extension entfernen, dann wieder das neue Image. Klingt komplizierter als es war. Der Changelog hatte es dokumentiert, ich hatte ihn nur nicht gelesen.
Merke: Vor jedem Immich-Update Changelog lesen und kurz Datenbank sichern.
Der Umzug der Daten
Das ist der Teil, den man nicht unterschätzen sollte. Nicht technisch, aber vom Umfang her.
Mein Google-Photos-Archiv umfasst etwa 13.000 Fotos und 700 Videos, ca. 38 GB insgesamt. Die ältesten Aufnahmen sind von 2011. Ich weiß, das sind Rookie Numbers. Andere knippsen das in deutlich kürzerer Zeit.
Schritt 1: Google Takeout
Google erlaubt den vollständigen Export aller eigenen Daten. Für Fotos geht das über Google Takeout. Dort nur "Google Fotos" auswählen, dann Format und Größe der ZIP-Pakete festlegen.
Je nach Archivgröße kann der Export mehrere Stunden dauern. Google schickt eine E-Mail wenn er fertig ist. Die ZIPs kann man dann herunterladen.
Was drin ist: Alle Fotos und Videos, dazu für jede Datei eine .json mit Metadaten (Datum, GPS-Koordinaten, Beschreibung). Das ist wichtig, weil Google die EXIF-Daten in den Bilddateien selbst teilweise überschreibt. Die echten Metadaten stecken in den JSON-Dateien.
Schritt 2: Import mit immich-go
immich-go ist ein Community-Tool, das genau für diesen Fall gebaut wurde: Google-Takeout-Export direkt in Immich importieren, inklusive der JSON-Metadaten.
immich-go upload from-google-photos \
--server https://immich.example.com \
--api-key <api-key> \
/pfad/zum/takeout-ordner
Das Tool liest die Takeout-Ordnerstruktur, ordnet jede Mediendatei ihrer JSON-Datei zu, überträgt die Metadaten (Datum, GPS) in die EXIF-Daten und lädt alles in Immich hoch.
Der API-Key lässt sich in Immich unter Account Settings → API Keys anlegen.
Was hat funktioniert
- Datum-Metadaten wurden korrekt übernommen, auch bei Fotos wo EXIF-Datum und Google-Datum auseinanderlagen
- Duplikate wurden erkannt und übersprungen (hilfreich wenn man mehrere Takeout-Exporte hat)
- Alben wurden als Immich-Alben importiert
Was weniger gut war
- Die Übertragung selbst dauert bei großen Archiven lang. Läuft im Hintergrund, aber man sollte Zeit einplanen.
- Die Übertragung ist bei mir auch mehrfach abgebrochen. Das lässt sich aber verschmerzen, da immich-go merkt, welche Dateien schon übertragen wurden und diese überspringt.
Nach dem Umzug
Der erste Versuch in den Fotos zu suchen war erst einmal enttäuschend. Nichts wurde gefunden. Ein Blick in die Auftrags-Warteschlangen offenbarte, dass die vielen Dateien erst einmal indiziert werden müssen. Das kann gerade bei größeren Importen und je nach Server-Hardware durchaus eine Weile dauern.
Also erst einmal Abwarten und rechnen lassen. Das Ergebnis danach: Alle Fotos auf meinem Server, durchsuchbar, mit Karte, Zeitleiste und Gesichtserkennung. Die Immich-App auf dem Handy lädt neue Fotos automatisch hoch, genau wie vorher bei Google.
Was ich noch nicht entschieden habe: ob ich Google Photos komplett abschalten werde oder eine Zeit lang parallel laufen lasse. Wahrscheinlich Letzteres, bis ich sicher bin dass nichts fehlt.
Immich hat mich ehrlich gesagt überrascht. Ich hatte erwartet dass der Self-Hosted-Ersatz bestenfalls 80% des Originals ist. Es sind eher 95%. Die restlichen 5% sind Kleinigkeiten, mit denen ich gut leben kann. Z.B. erkennt die Gesichtserkennung von Google auch Haustiere, die von Immich nur Menschen.
Immich ist Open Source und kostenlos. Die einzige Voraussetzung ist ein Server auf dem Docker läuft. Wer keinen Heimserver hat: Ein kleiner VPS reicht für den Anfang.