Zum Inhalt springen

Immich als selbstgehostete Fotoverwaltung und Back-up für iCloud oder Google Fotos

Ich nehme das mit dem Digital Independence Day bislang ja ziemlich ernst, mit dem nun vierten Projekt/Umstieg im vierten Monat. Mir ist dabei klar, dass es auch(!) Grund zur Kritik daran gibt. So ist eine Software, eine Dienstleistung nicht automatisch gut, nur, weil sie europäisch oder gar deutsch ist. Gleichwohl finde ich es uneingeschränkt gut, wenn Menschen (mich eingeschlossen) sich (wieder) mehr Gedanken darüber machen, was sie eigentlich nutzen, wem sie ihr Geld geben, welche Implikationen das womöglich hat und ob es nicht gleichwertige Alternativen gibt.

In diesem Monat, das sei vorausgeschickt, geht es nicht um einen kompletten Umstieg. Mit großer Überzeugung nutze ich Apples Fotoverwaltung inklusive der iCloud-Anbindung. Für mich funktioniert dort alles direkt aus der sprichwörtlichen Tüte so viel besser als es mir irgendeine Alternative bieten könnte.

Schon länger stelle ich mir aber die Frage: Was passiert eigentlich mit deinen Fotos? Und das ist nicht die romantische Frage nach Erinnerungen und Momenten – sondern die sehr nüchterne: Wo liegen eigentlich diese zehntausende Fotos und Videos, die ich über Jahre und Jahrzehnte angesammelt habe?  Und will ich, in Zeiten von kaum noch zu bezahlenden Speicherpreisen, wirklich jeden Monat für das Privileg zahlen, meine eigenen Urlaubsfotos betrachten zu dürfen?

Für den Moment fühle ich mich mit der iCloud an dieser Stelle, wie gesagt, gut genug. Aber: Ein anständiges Back-up all meiner Fotos und Videos, das unter meiner Kontroll steht, wäre doch eine schicke Idee und ein guter erster Schritt in die Unabhängig, die perspektivisch auch hierbei mein Ziel ist. Für den Moment heißt das Projekt also: Vollautomatisches Back-up auf dem eigenen NAS im Heimnetz – vollständig unter eigener Kontrolle, ohne Abo-Kosten, ohne fremde Augen.

Zwei Open-Source-Projekte haben sich dabei als ernsthafte Alternativen zur iCloud (und sicherlich auch Google Fotos) etabliert: ENTEund Immich. Sie verfolgen dabei unterschiedliche Philosophien – und je nachdem, was dir wichtig ist, ist mal das eine, mal das andere die bessere Wahl.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">ENTE: Sicherheit als oberstes Prinzip

ENTE ist eine Open-Source-Fotoverwaltung, die von einem kleinen, auf Datenschutz fokussierten Team entwickelt wird. Das Alleinstellungsmerkmal ist konsequente Ende-zu-Ende-Verschlüsselung: Alle Fotos werden auf dem Gerät verschlüsselt, bevor sie den Server erreichen – nicht mal du als Serverbetreiber kannst sie ohne den richtigen Schlüssel einsehen. ENTE ist sowohl als gehosteter Dienst über ente.io als auch zur Selbstinstallation verfügbar.

Vorteile: Maximale Privatsphäre auch im Self-Hosting-Betrieb (Was als Einzelperson natürlich nicht wichtig ist, aber interessant wird, wenn man auch die Fotos/Videos von bspw. Familienmitgliedern ebenfalls auf dem Server sichern möchte.), plattformübergreifend verfügbar.

Nachteile: Die mobilen Apps sind noch unausgereift und neigen zu Abstürzen. Die Web-Oberfläche ist eingeschränkt. Die Community ist relativ klein, die Dokumentation dünn. Der Set-up ist vergleichsweise komplex.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Immich: Das iCloud-Photos-Feeling, selbst gehostet

Immich geht einen anderen Weg. Hier steht nicht die Verschlüsselung, sondern der Komfort im Vordergrund – die App soll sich anfühlen wie vor allem Google Photos, nur auf dem eigenen Server. Das Projekt hat in den letzten Jahren eine enorme Entwicklungsgeschwindigkeit vorgelegt und eine große, aktive Community aufgebaut.

Vorteile: Ausgereifte iOS- und Android-Apps, automatische Gesichtserkennung, Kartenansicht für geogetaggte Fotos, KI-gestützte Suche („zeig mir alle Fotos mit Hunden am Strand“), aktive Weiterentwicklung mit regelmäßigen Releases.

Nachteile: Keine Ende-zu-Ende-Verschlüsselung. Wer den eigenen Server betreibt, muss ihm vertrauen. Immich ist ressourcenhungriger als ENTE, weil im Hintergrund Machine-Learning-Modelle für Gesichtserkennung und Bildanalyse laufen.

Die Entscheidung zwischen beiden zu fällen, ist einfacher, als sie klingt: Wer Ende-zu-Ende-Verschlüsselung für nicht verhandelbar hält – etwa weil der Server bei einem Hosting-Anbieter steht oder weil besonders sensible Inhalte gesichert werden sollen –, greift zu ENTE. Wer dem eigenen Server vertraut und dafür eine ausgereifte, komfortable Anwendung haben möchte, ist mit Immich besser bedient. Ich habe mich für Immich entschieden. Vor allem, weil mein Server mein NAS ist und in meinem Keller steht und ich für den Moment überhaupt nicht vorhabe, die Medien von anderen darauf zu sichern. Es geht nur um meine eigenen Inhalte, und für den Umgang damit vertraue ich mir selbst gerade noch genug. 😀

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Was man dafür braucht

  • Ein NAS mit Docker-Unterstützung. In diesem Artikel kommt ein Ugreen IDX6011PRO zum Einsatz, aber jedes NAS mit Docker-fähigem Betriebssystem funktioniert.
  • Grundlegende Kenntnisse im Umgang mit SSH und docker compose – du musst kein Linux-Profi sein, aber ein Terminal sollte dich nicht erschrecken.
  • Optional, aber empfohlen: Eine eigene Domain und bspw. ein Cloudflare-Tunnel für den Zugriff von unterwegs. Dazu später mehr. Und ja, ich möchte von Cloudflare weg. Das ist aber ein Projekt für ein anderes Mal.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Immich installieren

Per SSH verbindest du dich mit deinem NAS, und legst dort einen Ordner für das Projekt an:

mkdir -p ~/docker/immich
cd ~/docker/immich

Im nächsten Schritt wird die offizielle docker-compose.yml und die zugehörige Konfigurationsdatei heruntergeladen:

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

<

p style=“caret-color: ; color: ; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;“>Die .env-Datei enthält alle wichtigen Einstellungen – und ist in der Standardversion fast fertig. Drei Zeilen musst du anpassen:

# Speicherort für Uploads – hier landen deine Fotos
UPLOAD_LOCATION=./library

# Speicherort für die Datenbank (kein Netzlaufwerk!)
DB_DATA_LOCATION=./postgres

# Zeitzone aktivieren
TZ=Europe/Berlin

# Immich-Version – v2 bedeutet: immer aktuellstes v2.x-Release
IMMICH_VERSION=v2

# Datenbank-Passwort ändern – nur A-Za-z0-9, keine Sonderzeichen
DB_PASSWORD=HierEinSicheresPasswort123

# Diese Zeilen unverändert lassen
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Ein Wort zur Versionsstrategie: IMMICH_VERSION=v2 ist kein striktes Pinning auf eine bestimmte Version, sondern bedeutet „bleib auf dem neuesten v2.x-Release“. Du bekommst automatisch alle Bugfix- und Feature-Updates innerhalb von v2, springst aber nicht unkontrolliert auf ein zukünftiges v3. Für den Heimgebrauch ist das meines Erachtens der richtige Mittelweg.

Das Passwort wird beim ersten Start in die Datenbank geschrieben – danach lässt es sich nicht mehr einfach ändern. Einmal ein gutes wählen und dann nicht mehr anfassen.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Immich starten

docker compose up -d

Nach ein paar Minuten ist Immich unter http://DEINE-NAS-IP:2283 erreichbar. Beim ersten Aufruf im Browser legst du deinen Admin-Account an.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Stolperstein: Docker-Berechtigungen

Beim ersten docker compose up -d kann folgender Fehler auftauchen:

permission denied while trying to connect to the Docker daemon socket

Das bedeutet: Dein Benutzer hat noch keine Berechtigung, auf Docker zuzugreifen. Die Lösung:

sudo usermod -aG docker DEINBENUTZERNAME

Danach die SSH-Session schließen, neu einloggen – und ab dann funktioniert Docker ohne sudo.

Screenshot aus der Docker-Verwaltung meines NAS mit der Auflistung aller zu Immich gehörenden Container.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Mehr Zuverlässigkeit: Automatischer Neustart und automatische Updates

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Automatischer Neustart

Die offizielle docker-compose.yml von Immich enthält für alle Container bereits:

restart: always

Das bedeutet: Stürzt ein Container ab, startet Docker ihn automatisch neu. Wird das NAS neu gestartet, kommt Immich beim Hochfahren des Docker-Daemons direkt wieder hoch. Hier muss nichts weiter konfiguriert werden.

Zur Kontrolle:

docker inspect immich_server | grep RestartPolicy

Steht dort "Name": "always", ist alles korrekt eingerichtet.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Automatische Updates mit Watchtower

Immich entwickelt sich schnell – neue Releases erscheinen regelmäßig. Damit du nicht manuell nach Updates suchen musst, gibt es Watchtower: einen Docker-Container, der alle anderen Container beobachtet und sie automatisch neu startet, sobald ein aktuelleres Image verfügbar ist.

Watchtower wird einfach als weiterer Service in die docker-compose.yml eingetragen – direkt unter den anderen Services, aber vor dem abschließenden volumes:-Block:

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_SCHEDULE=0 3 * * *
    restart: always

volumes:
  model-cache:

WATCHTOWER_CLEANUP=true sorgt dafür, dass alte Images nach dem Update automatisch gelöscht werden. WATCHTOWER_SCHEDULE=0 3 * * * lässt Watchtower jeden Tag um 3 Uhr nachts prüfen, ob Updates verfügbar sind.

Wichtiger Hinweis zur YAML-Einrückung: Watchtower muss auf der gleichen Einrückungsebene stehen wie immich-server:, redis: und die anderen Services – also mit zwei Leerzeichen Einrückung innerhalb von services:. Landet der Block auf der obersten Ebene der Datei (also auf gleicher Ebene wie services: selbst), wirft Docker Compose beim nächsten Start den Fehler additional properties 'watchtower' not allowed. Dann einfach die Einrückung korrigieren.

Danach wieder

docker compose up -d

Ab jetzt läuft Watchtower im Hintergrund und hält Immich aktuell – ohne weiteres Zutun.

Für Vorsichtige: Wer Updates lieber manuell kontrolliert, lässt den WATCHTOWER_SCHEDULE weg und führt Watchtower nur bei Bedarf einmalig aus:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Von überall erreichbar: Cloudflare Tunnel einrichten

Ich möchte mein Immich (vorerst) nur für das Back-up von Fotos und Videos nutzen. Es ist mir also gar nicht so wichtig, dass ich auch von außerhalb meines Heimnetzes darauf zugreifen kann. Auch, wenn ich unterwegs, etwa im Urlaub, bin, sind meine Fotos erst mal sicher. Ohnehin landen sie in der iCloud, mein Mac hält aber auch die neusten 1.000 Fotos lokal vor – damit komme ich klar. Allerdings: Ich habe eben schon einen Cloudflare-Tunnel zu meinem NAS in Betrieb. Da kostet es keine fünf Minuten, alles so einzurichten, dass Immich eben von überall zu erreichen ist. Wer sich damit nicht herumschlagen möchte, wählt weiter unten bei der Konfiguration der iPhone-App bei Server-URL eben die lokale IP-Adresse des NAS aus. Mit dem Ergebnis, dass die Immich-App den Immich-Server nur „sieht“, wenn sich das iPhone im Heimnetz befindet. Das könnte man, nur als Anregung, natürlich auch über ein VPN nach Hause erreichen.

Alternativ könnte man natürlich auch einen Port im Heimrouter öffnen – eine naheliegende, aber die unpraktischste Lösung für externen Zugriff – Sicherheitsrisiken inklusive. Die elegantere Alternative ist eben (so etwas wie) ein Cloudflare-Tunnel: Der Traffic läuft verschlüsselt über Cloudflares Infrastruktur, kein Port muss geöffnet werden, und Cloudflare übernimmt das TLS-Zertifikat nach außen.

Wenn der Tunnel bereits auf einem anderen Server im Heimnetz terminiert, ist die Einrichtung denkbar einfach: Im Cloudflare Zero Trust Dashboard unter one.dash.cloudflare.com einfach eine neue Public Hostname-Regel anlegen:

  • Subdomain: immich
  • Domain: deinedomain.de
  • Type: HTTP
  • URL: DEINE-NAS-IP:2283

Bei all dem ist kein TLS-Zertifikat auf dem NAS nötig – Cloudflare terminiert HTTPS nach außen, intern läuft die Verbindung als plain HTTP, was in meinem Szenario kein Sicherheitsrisiko darstellt.

Wichtiger Hinweis: Der kostenfreie Cloudflare-Tunnel hat eine Dateigrößenbeschränkung für Uploads von derzeit 100 MB pro Übertragung. Viele Videos würden dabei hängen bleiben. Für normale Fotos ist das kein Problem – für Videos braucht es eine Lösung:

Wenn das iPhone im Heimnetz ist, soll es Immich direkt über die lokale IP erreichen – ohne Umweg über das Internet und Cloudflares Server. Nur so können auch Videos und große Dateien zuverlässig und ohne Größenbeschränkung hochgeladen werden.

Immich hat dafür eine eingebaute Lösung, die keine weitere Konfiguration am Router oder DNS erfordert: In der App lässt sich eine „Local Network URL“ hinterlegen. Ist diese gesetzt, prüft die App bei jedem Back-up, ob sie den lokalen Server erreichen kann. Wenn ja, nimmt sie die direkte Route. Wenn nicht – weil du unterwegs bist –, fällt sie automatisch auf die externe Cloudflare-URL zurück.

Das Ergebnis: Im Heimnetz direkte Verbindung mit voller Bandbreite und ohne Upload-Limitierungen, unterwegs gesicherter Zugriff über Cloudflare – vollautomatisch, ohne Eingriff.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Die iPhone-App einrichten

Die Immich-App ist kostenlos im App Store verfügbar.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Server verbinden

Beim ersten Start wirst du nach der Server-URL gefragt:

  • Server URL: https://immich.deinedomain.de

Anschließend unter Einstellungen → Verbindungs-URL die lokale URL eintragen:

  • Local Network URL: http://DEINE-NAS-IP:2283

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Screenshot der iPhone-App von Immich mit einigen der im Text besprochenen Einstellungen.Back-up konfigurieren

Unter Einstellungen → Backup folgende Optionen setzen:

Einstellung Empfehlung
Automatisches Backup Ein
Nur im WLAN Ein
Im Hintergrund sichern Ein
Videos sichern Ein – explizit prüfen, manchmal deaktiviert
HEIC-Format beibehalten Ein

Unter iOS-Einstellungen → Immich:

  • Fotos: Zugriff auf „Alle Fotos“ – nicht nur „Ausgewählte“. Andernfalls sieht Immich nur einen Teil der Bibliothek.
  • Hintergrundaktualisierung: Ein.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Welches Album auswählen?

In der App wirst du beim ersten Backup-Setup aufgefordert, Alben auszuwählen. Hier ein kurzer Hinweis: In iOS sind Alben nur Ansichten, gewissermaßen Filter – die Fotos selbst liegen alle nur einmal in der Bibliothek. Das bedeutet: Es reicht, das Album „Zuletzt“ (Recents) auszuwählen. Dieses Album enthält immer alle Fotos – auch die aus jedem zukünftig erstellten Album. Kein manuelles Nachpflegen nötig. Wenn du später aber einmal Immich anstatt iCloud Fotos nutzen möchtest, kannst du hier auch die iCloud-Alben mit Immich synchronisieren.

Screenshot vom Back-up-Screen der Immich App mit Ansichten der gesamt verfügbaren und bereits gesicherten Fotos.Screenshot vom Upload-Vorgang mit Ansicht der verbleibenden Fotos.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Der erste Backup-Lauf

Beim allerersten Backup macht Immich zwei Dinge hintereinander, die auf den ersten Blick wie Nichtstun aussehen:

Phase 1 – Bibliothek scannen: Immich geht jedes einzelne Foto durch, erstellt einen Fingerabdruck und prüft, was dem Server noch nicht bekannt ist. Bei einer großen Bibliothek kann das eine Stunde oder länger dauern – ohne sichtbaren Upload-Fortschritt. Ich habe rund 48.000 Items in der iCloud liegen, darunter auch viele Videos. Für mich hat dieser Vorgang rund zwei Stunden gedauert.

Phase 2 – Upload: Erst wenn der Scan abgeschlossen ist, beginnt die eigentliche Übertragung.

iOS ist darauf ausgelegt, Langzeitprozesse im Hintergrund zu unterbrechen. Bei einer Bibliothek mit 40.000 oder mehr Fotos wirst du den Erstimport nicht in einem Rutsch durchbekommen. Die Lösung: iPhone ans Ladekabel, App im Vordergrund lassen, automatische Bildschirmsperre unter Einstellungen → Bildschirm & Helligkeit → Automatische Sperre → „Nie“ deaktivieren. Nach ein paar Stunden oder über Nacht ist die Bibliothek vollständig hochgeladen. Danach überträgt die App täglich neue Fotos problemlos im Hintergrund.

Bildschirmfoto 2026-04-05 um 20.50.57.

#000000; color: ; font-style: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-line: none; text-decoration-thickness: auto; text-decoration-style: solid;">Fazit

Immich ist längst kein Bastelprojekt mehr. Die Einrichtung auf einem NAS ist in deutlich unter einer Stunde erledigt, der laufende Betrieb ist wartungsarm, und das Split-Routing zwischen Heimnetz und Cloudflare funktioniert ohne zusätzlichen Konfigurationsaufwand im Router oder auf dem NAS.

Published inDigital Independence DayTech-Talk

Sei der Erste der einen Kommentar abgibt

Kommentar verfassen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.