Immich selbst hosten: 6 GB RAM und sichere Upgrades
6 GB RAM sind knapp: Erfahren Sie, wie Port 2283 hinter HTTPS funktioniert, was Exit 137 bedeutet und warum Immich v3 mit pgvecto.rs nicht startet.
Was Sie aufbauen
Immich ist ein selbst gehosteter Dienst zum Sichern von Fotos und Videos und ein echter Ersatz für Google Photos. Die zugehörige Smartphone-App lädt Ihre Kamerabilder im Hintergrund hoch. Außerdem bietet Immich eine Zeitleiste, Alben, Gesichtserkennung und eine Suche mit maschinellem Lernen, die ohne manuelle Markierungen Begriffe wie „Strand“ oder eine Person findet. Sie betreiben Immich auf einem eigenen VPS. Die Originaldateien bleiben auf Ihrem Datenträger, und niemand scannt sie, um Ihnen Produkte zu verkaufen. Wenn Sie Immich noch mit dem anderen naheliegenden Kandidaten vergleichen, stellt unser Vergleich von PhotoPrism und Immich deren Mindestanforderungen an den Arbeitsspeicher, Smartphone-Apps und Befehle zum Sichern direkt gegenüber.
Die Installation besteht aus vier Containern aus der Docker-Compose-Datei des Projekts. Dieser Teil dauert zehn Minuten. Die eigentliche Arbeit beginnt danach: Der Container für maschinelles Lernen benötigt auf einem kleinen System viel Arbeitsspeicher, Originaldateien belegen schnell viel Speicherplatz, die mobile App benötigt die exakte Server-URL, und vor der Veröffentlichung außerhalb Ihres Netzwerks sollte HTTPS vorgeschaltet werden. Außerdem veröffentlicht Immich häufig Änderungen mit inkompatiblen Anpassungen, sodass ein unvorsichtiges docker compose pull dazu führen kann, dass Ihr Server nicht mehr startet. Behandeln Sie diese vier Punkte sorgfältig, läuft Immich sehr zuverlässig. Ignorieren Sie sie, verlieren Sie möglicherweise ein ganzes Wochenende.
Voraussetzungen und wichtige Einschränkungen
- RAM: In der offiziellen Dokumentation sind 6 GB als Minimum und 8 GB als Empfehlung angegeben. Behandeln Sie 4 GB plus Swap als absolute Untergrenze. Die Container
immich-serverund Postgres benötigen wenig Arbeitsspeicher. Der Containerimmich-machine-learningbenötigt dagegen deutlich mehr. Er lädt CLIP- und Gesichtserkennungsmodelle in den RAM, um Suchindizes zu erstellen. Auf einem System mit 2 GB beendet der Kernel den Prozess. Richten Sie auch bei 4 GB Swap ein. - Datenträger: Planen Sie ausreichend Speicherplatz für die gesamte Bibliothek und zusätzliche Reserven ein. Ihre Originaldateien werden vollständig kopiert. Zusätzlich erstellt Immich Vorschaubilder und Preview-Bilder. Rechnen Sie dafür mit etwa 10–20 % zusätzlichem Speicherplatz. Eine Fotosammlung mit 200 GB benötigt ein Volume mit 300 GB. Postgres ist im Vergleich dazu klein.
- CPU: Jeder moderne KVM-VPS ist geeignet, aber ML auf der CPU ist langsam. Die Indizierung der intelligenten Suche kann bei einem großen Import mehrere Stunden im Hintergrund laufen. Das ist normal. Eine GPU ist dafür nicht erforderlich.
- Ein Domainname, der auf den VPS zeigt. Die mobile App bevorzugt ausdrücklich einen HTTPS-Endpunkt. Außerdem sollte davor ein Reverse Proxy verwendet werden. Diese Struktur entspricht der Einrichtung einer selbst gehosteten Nextcloud-Instanz mit Docker, TLS und Backups. Immich ist das Gegenstück für Fotos zu diesem Dateiserver.
- Docker und das Compose-Plugin, installiert als Docker Engine zusammen mit dem Compose v2-Plugin aus dem eigenen apt-Repository von Docker, genau wie in unserem Grundlagenleitfaden zu Docker Compose beschrieben.
Schritt 1: Fügen Sie vor allen anderen Maßnahmen Swap hinzu
Der häufigste Fehler bei Immich auf einem kleinen VPS ist, dass der ML-Container wegen Speichermangels (OOM) beendet wird. Stellen Sie dem Kernel zuerst zusätzlichen Auslagerungsspeicher bereit.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hfree -h sollte jetzt eine Swap:-Zeile mit 4.0Gi anzeigen. Dadurch wird ML nicht schneller. Der Swap dient als Puffer und ist keine Garantie. Auf einer Maschine mit 4 GB RAM stirbt der Container dadurch jedoch deutlich seltener während der Indizierung.
Schritt 2: Offizielle Compose- und Env-Dateien herunterladen und unverändert verwenden
Immich legt die Versionen seiner Dienste und insbesondere das Datenbank-Image in den bereitgestellten Dateien fest. Verwenden Sie keine Compose-Datei aus einem Blog, auch nicht aus diesem Tutorial, als verbindliche Quelle. Laden Sie die Release-Dateien herunter:
sudo mkdir -p /opt/immich && cd /opt/immich
sudo wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
sudo wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.envDiese Dateien stammen aus dem getaggten Release. Daher stimmen die Image-Referenzen überein. Die Compose-Datei definiert vier Dienste. Vor Änderungen sollten Sie wissen, welche Aufgabe die einzelnen Dienste haben:
immich-server(ghcr.io/immich-app/immich-server, Containerimmich_server) stellt die API und die Weboberfläche bereit und lauscht auf Port2283. Ihre Uploads werden unter/dataeingebunden.immich-machine-learning(ghcr.io/immich-app/immich-machine-learning, Containerimmich_machine_learning) übernimmt die CLIP-Suche und die Gesichtserkennung. Heruntergeladene Modelle werden in einemmodel-cache-Volume zwischengespeichert. Dieser Dienst benötigt besonders viel Arbeitsspeicher.database(Containerimmich_postgres) stellt Postgres mit der VectorChord-Vektorerweiterung bereit. Diese Erweiterung ermöglicht die Ähnlichkeitssuche. Der Image-Tag wird direkt in der Compose-Datei per Digest festgelegt, zum Beispielghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:.... Ältere Installationen verwendetenpgvecto.rs. Die Unterstützung dafür wurde in Immich v3.0 entfernt. Alles, was Sie heute installieren, verwendet daher VectorChord. Bearbeiten Sie diesen Tag niemals manuell.redis(Containerimmich_redis) stellt eine Valkey/Redis-Instanz für Auftragswarteschlangen bereit.
Schritt 3: .env konfigurieren, wo Ihre Fotos und Datenbank gespeichert sind
Öffnen Sie .env und legen Sie vier Werte fest. Alles unterhalb der markierten Zeile bleibt unverändert.
# Where original uploads are stored on the host
UPLOAD_LOCATION=/opt/immich/library
# Where the Postgres data lives. NEVER put this on an NFS/network share.
DB_DATA_LOCATION=/opt/immich/postgres
# "v3" is a floating tag that tracks the latest v3.x. Pin a full tag like
# v3.0.2 instead; then you upgrade on purpose, not by surprise.
IMMICH_VERSION=v3.0.2
# Change this to a long random string. Letters and digits only.
DB_PASSWORD=REPLACE_WITH_A_LONG_RANDOM_STRING
# Set your timezone so timestamps and "on this day" line up
TZ=Europe/London
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immichZwei Regeln ersparen Ihnen Probleme. UPLOAD_LOCATION sollte auf Ihre große Festplatte verweisen. Wenn Sie später ein Datenvolume einbinden, legen Sie den Mount-Pfad von Anfang an hier fest. Andernfalls müssen Sie später die Vorschaubilder verschieben und die Asset-Pfade aktualisieren. DB_DATA_LOCATION muss sich auf einer lokalen Festplatte befinden: Postgres auf einer NFS- oder SMB-Freigabe beschädigt Datenbanken. Die Dokumentation weist ausdrücklich darauf hin. Wenn Sie für DB_PASSWORD ausschließlich Buchstaben und Ziffern verwenden, vermeiden Sie eine Klasse von Fehlern beim Escaping von Verbindungszeichenfolgen.
Schritt 4: Erster Start und Erstellen des Administratorkontos
cd /opt/immich
sudo docker compose up -d
sudo docker compose psDas erwartete Ergebnis sind vier Container, die alle running und schließlich healthy sind:
NAME STATUS
immich_machine_learning Up (healthy)
immich_postgres Up (healthy)
immich_redis Up (healthy)
immich_server Up (healthy)Der erste up lädt mehrere Gigabyte an Images herunter. Warten Sie daher, bis der Vorgang abgeschlossen ist. Überwachen Sie den Fortschritt mit sudo docker compose logs -f immich-server. Sobald der Dienst bereit ist und auf Port 2283 lauscht, wird dies in den Server-Logs protokolliert. Öffnen Sie jetzt http://YOUR_SERVER_IP:2283 in einem Browser. Beim ersten Aufruf wird der Assistent Getting Started angezeigt. Das erste Konto, das Sie erstellen, ist das Administratorkonto. Verwenden Sie ein starkes Passwort. Dieses Konto verwaltet die Servereinstellungen, die Benutzerverwaltung und die ML-Konfiguration, die Sie später benötigen.
Schritt 5: Die mobile App und die Sicherung im Hintergrund
Installieren Sie „Immich“ aus dem App Store oder Play Store. Auf dem Anmeldebildschirm wird nach einer Server Endpoint URL gefragt. Geben Sie die vollständige URL einschließlich Schema ein, zum Beispiel https://photos.example.com (die App fügt /api selbst an). Melden Sie sich mit dem gerade erstellten Konto an. Öffnen Sie anschließend in der App den Bildschirm Backup, wählen Sie die zu sichernden Alben aus (in der Regel Camera und Screenshots) und aktivieren Sie Background backup. iOS begrenzt Sicherungen im Hintergrund. Uploads im Vordergrund werden immer ausgeführt. Uploads im Hintergrund erfolgen, wenn das Betriebssystem dies zulässt.
Genau an dieser Stelle treten häufig Probleme auf. Lesen Sie daher Schritt 6, bevor Sie die App weiter untersuchen.
Schritt 6: HTTPS über einen Reverse Proxy und die Regel für die vollständige URL
Die mobile App benötigt HTTPS, sobald sie Ihr Heimnetz verlässt. Schalten Sie einen Reverse Proxy vor Port 2283 und terminieren Sie TLS dort. Wenn Sie bereits mehrere Container betreiben, ist Traefik mit automatischem TLS für mehrere Docker-Apps die übersichtlichste Lösung. Ein Label-Block leitet photos.example.com an den Container immich-server weiter und ruft das Zertifikat automatisch ab. Wenn Sie nginx bevorzugen, stellt Ihnen die Anleitung Let's Encrypt mit Certbot und nginx ein Zertifikat und einen proxy_pass http://127.0.0.1:2283;-Block bereit. Sobald der Proxy eingerichtet ist, fügen Sie für den nächsten Dienst meist nur eine neue Subdomain hinzu. So kann beispielsweise ein Medien-Frontend wie Halcyon, das Videoverleih-Design der 90er für Jellyfin neben Immich auf demselben Server laufen. Das gilt auch für einen selbst gehosteten HarnessRouter, der Codex und Claude Code hinter einer API bereitstellt. Dieser bindet absichtlich an Loopback und ist erst erreichbar, sobald der Proxy davor TLS terminiert. Ändern Sie daher den Standard-Login, bevor Sie eine Subdomain darauf verweisen. Nicht jeder Container benötigt jedoch einen öffentlichen Hostnamen. Ein Administrationswerkzeug wie ein selbst gehosteter open-kritt-Sicherheitsscanner sollte besser vollständig vom Proxy ausgeschlossen und nur bei seltenem Bedarf über einen SSH-Tunnel erreicht werden, wenn Sie seine Benutzeroberfläche öffnen. Andere Dienste verzichten auf den Proxy, weil HTTP nicht ihr Protokoll ist. Ein selbst gehosteter RustDesk-Relay-Server ist dafür das deutlichste Beispiel. Er lauscht an mehreren direkten TCP- und UDP-Ports und benötigt Firewall-Regeln statt einer Subdomain. Für Immich ist eine Einstellung des Proxys besonders wichtig: Erhöhen Sie das Upload-Limit, weil Videos von Mobiltelefonen groß sind. In nginx lautet die Einstellung client_max_body_size 50000M; innerhalb des server-Blocks. Der Standardwert von 1 MB weist Video-Uploads mit 413 Request Entity Too Large zurück. Wenn Ihr Proxy außerdem die HTTP-01-Challenges von Let's Encrypt beantwortet, stellen Sie sicher, dass /.well-known/immich weiterhin an Immich und nicht an den Challenge-Handler weitergeleitet wird.
Die von der App erzwungene Regel lautet: Der Endpunkt muss genau unter der eingegebenen URL erreichbar sein. Die App akzeptiert ein einfaches http://YOUR_SERVER_IP:2283; der eigene Login-Hinweis lautet http://your-server-ip:port. Alles, was jedoch das Internet durchquert, sollte HTTPS verwenden. Das falsche Schema oder eine direkte IP-Adresse ohne Portangabe verursacht die Meldung „Die App kann den Server nicht erreichen“. Dieser Fall wird weiter unten als eigener Fehler behandelt.
Schritt 7: Externe Bibliotheken und Uploads, einen vorhandenen Fotobaum importieren
Fotos gelangen auf zwei Arten in Immich. Diese beiden Arten sind nicht gleich.
- Uploads sind Assets, die Immich verwaltet. Die Anwendung oder der Web-Uploader kopiert die Datei nach
UPLOAD_LOCATION. Immich kann die Dateien umbenennen, verschieben und löschen. - Externe Bibliotheken sind schreibgeschützte Importe von Dateien, die bereits in einem Ordner auf Ihrem Server, in einem alten
Pictures-Baum oder in einem NAS-Export liegen. Immich indiziert die Dateien am vorhandenen Speicherort und zeigt sie in der Zeitleiste an. Die Originaldateien werden jedoch niemals geändert oder gelöscht.
Um einen vorhandenen Baum zu importieren, binden Sie ihn schreibgeschützt in den Server-Container ein. Bearbeiten Sie docker-compose.yml unter immich-server: und fügen Sie ein Volume hinzu:
immich-server:
volumes:
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
- /srv/photos:/mnt/media/photos:roDer :ro stellt sicher, dass Immich die Originaldateien niemals ändern kann. Erstellen Sie den Container mit sudo docker compose up -d neu. Öffnen Sie anschließend in der Weboberfläche Ihr Avatar-Menü und wählen Sie Administration → External Libraries → Create Library. Wählen Sie den Benutzer aus, dem die Bibliothek gehört, klicken Sie unter Folders auf Add und geben Sie den Container-Pfad /mnt/media/photos ein, nicht den Host-Pfad /srv/photos. Klicken Sie auf Scan. Die Verwendung des Host-Pfads anstelle des Container-Pfads ist der häufigste Fehler bei externen Bibliotheken. Der Scan findet dann nichts und meldet null Assets.
Schritt 8: Die von Immich geforderte Upgrade-Disziplin
In diesem Abschnitt entscheidet sich, ob Immich stabil läuft oder ausfällt. Immich veröffentlicht schnell neue Versionen und stellt keine Fehlerkorrekturen für ältere Versionen bereit. Downgrades werden nicht unterstützt. Der bewegliche v3-Tag ist eine offiziell unterstützte Möglichkeit, Releases zu verfolgen. Immich versucht, inkompatible Änderungen auf Hauptversionen zu beschränken. Bei jedem Pull wird jedoch ein Upgrade durchgeführt, unabhängig davon, ob Sie die Hinweise gelesen haben. Ein nicht geplantes Upgrade kann nicht zurückgerollt werden. Dieselbe Gewohnheit, zuerst eine Version festzulegen und dann die Hinweise zu lesen, sollten Sie auf jeden langlebigen Container auf dem Server anwenden. Deshalb wird ein selbst gehosteter KiroCrew-Agent auf einen bekannten, funktionierenden Tag festgelegt, statt beim nächsten Neustart unkontrolliert auf eine andere Version zu wechseln. Die Disziplin:
- Legen Sie eine Version fest. Lassen Sie
IMMICH_VERSIONauf einen konkreten Tag wiev3.0.2zeigen, nicht aufv3, das immer das neueste v3.x abruft. - Lesen Sie vor jedem Upgrade die Release-Hinweise vollständig. Dort werden inkompatible Änderungen beschrieben, insbesondere Änderungen an der Datenbank oder an Vektorerweiterungen. Das Release v3.0 ist ein offensichtliches Beispiel: Es entfernte pgvecto.rs vollständig. Wer noch die alte Erweiterung verwendete, musste daher zuerst die VectorChord-Migration abschließen, die bereits mit v1.133 eingeführt worden war, bevor ein Upgrade möglich war.
- Sichern Sie zuerst die Datenbank (Schritt 9). Immer, insbesondere wenn die Hinweise Änderungen an der Datenbank erwähnen.
- Übernehmen Sie auch die neue Compose-Datei.
IMMICH_VERSIONlegt nur die Server- und ML-Images fest. Das Postgres-Image wird innerhalb vondocker-compose.ymlüber einen Digest festgelegt. Eine Version, die eine neuere Datenbankerweiterung benötigt, wird daher mit einer neuen Compose-Datei veröffentlicht. Laden Sie beide Release-Dateien erneut herunter, tragen Sie Ihre.env-Werte wieder ein und führen Sie anschließend das Upgrade durch. - Aktualisieren Sie zuerst Ihre mobilen Clients. Der Server unterstützt nur seine zugehörige Hauptversion. Die App ist normalerweise mit der aktuellen und der vorherigen Hauptversion kompatibel. Wenn der Server neuer als die App ist, zeigen aktuelle Releases (v3.3.1, geprüft am 2026-10-10) auf dem Smartphone den Hinweis App update is available mit einer Schaltfläche Update an. Immich empfiehlt, alle mobilen Clients vor dem Server zu aktualisieren.
Die eigentlichen Befehle, sobald die neuen Dateien bereitliegen:
cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image pruneSchritt 9: Backups, ein Datenbank-Dump UND die Originale, und das Ganze testen
Ein Backup von Immich besteht aus zwei Teilen. Einer davon ist ohne den anderen unbrauchbar. Die Datenbank enthält die Albumstruktur, Gesichter, Suchindizes und die Zuordnung von Assets zu Dateien. Das Originalverzeichnis enthält die eigentlichen Fotos. Stellen Sie nur einen Teil wieder her, erhalten Sie entweder Fotos ohne Organisation oder eine leere Struktur, die auf fehlende Dateien verweist. Diese zweiteilige Struktur ist keine Besonderheit von Immich: ein selbst gehostetes Chatwoot-Supportsystem benötigt dieselbe Kombination aus einem Postgres-Dump und seinem Upload-Verzeichnis. Andernfalls enthält der wiederhergestellte Posteingang keine Anhänge. Das Kopieren des Postgres-Datenverzeichnisses als Dateibaum wirkt wie eine Abkürzung gegenüber dem Dump-Schritt. Es ist jedoch kein verwendbares Backup, eine Falle, die die vollständige Anleitung zum Backup und zur Wiederherstellung von Immich zusammen mit dem Wiederherstellungsfehler behandelt, der eine leere Zeitleiste hinterlässt.
Sichern Sie die Datenbank mit pg_dump aus dem Postgres-Container heraus. Verwenden Sie dabei ausdrücklich die Datenbank immich und nicht den gesamten Cluster:
sudo docker exec -t immich_postgres pg_dump --clean --if-exists \
--dbname=immich --username=postgres | gzip > /opt/immich/immich-db-$(date +%F).sql.gzSichern Sie anschließend UPLOAD_LOCATION, also den gesamten /opt/immich/library-Baum, insbesondere die Unterverzeichnisse library/, upload/ und profile/, mit restic, rsync oder borg auf einem anderen Rechner oder in einem Objektspeicher. Unabhängig davon, ob dieser Vorgang über einen Cron-Eintrag oder einen systemd-Timer geplant wird, muss er einen Ort haben, an dem ein Fehler gemeldet wird. Eine systemd-OnFailure=-Unit, die auf Ihren eigenen ntfy-Push-Server verweist, sendet in der Nacht eine Nachricht an Ihr Telefon, wenn ein Dump fehlschlägt. So müssen Sie den Fehler nicht erst bei einer Wiederherstellung feststellen. Sichern Sie zuerst die Datenbank und danach die Dateien. Dadurch verweist der Dump niemals auf ein Foto, das noch nicht vom Datei-Backup kopiert wurde. Externe Bibliotheken sichern Sie separat an ihrer tatsächlichen Quelle. Immich verwaltet diese nicht.
Nun folgt der Schritt, den viele überspringen: Testen Sie die Wiederherstellung. Eine Wiederherstellung muss in einem frischen Stack ausgeführt werden, dessen Server noch nie gestartet wurde. Außerdem muss das verwendete Postgres-Image mit der Vektorerweiterung des Dumps kompatibel sein. Genau deshalb darf das DB-Image-Tag nicht improvisiert werden. Verwenden Sie auf einem Testrechner dieselbe Compose-Konfiguration und .env, löschen Sie den alten Zustand, starten Sie nur die Datenbank und laden Sie anschließend den Dump:
cd /opt/immich
sudo docker compose down -v
sudo docker compose pull
sudo docker compose create
sudo docker start immich_postgres
sleep 10
gunzip --stdout immich-db-2026-07-15.sql.gz |
sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" |
sudo docker exec -i immich_postgres psql --dbname=immich --username=postgres --single-transaction --set ON_ERROR_STOP=on
sudo docker compose up -dDie sed-Umschreibung von search_path ist bei einer VectorChord-Datenbank zwingend erforderlich. Ohne sie bricht die Wiederherstellung mitten im Vorgang ab. Wenn der Stack mit den wiederhergestellten Originalen wieder läuft, öffnen Sie die Weboberfläche. Sind Ihre Fotos und Alben vorhanden, funktioniert Ihr Backup. Wenn Sie diesen Vorgang noch nie ausgeführt haben, haben Sie kein Backup, sondern nur Hoffnung.
Fehlerbilder und die dabei angezeigten Meldungen
Der ML-Container wird wegen Speichermangels beendet. sudo docker compose logs immich-machine-learning endet abrupt, docker compose ps zeigt Restarting, und der Exit-Code ist 137. sudo dmesg | grep -i oom bestätigt dies: Out of memory: Killed process ... (python3). Such- und Gesichtserkennungsaufträge bleiben anschließend hängen. Die Ursache ist zu wenig RAM für die Modelle. Gehen Sie der Reihe nach so vor: Fügen Sie Swap hinzu (Schritt 1), geben Sie der VPS mehr RAM oder deaktivieren Sie, falls dies wirklich nicht möglich ist, unter Administration → Settings → Machine Learning Settings die übergeordnete ML-Option. Dadurch werden alle ML-Funktionen gleichzeitig deaktiviert. Nur Smart Search und Facial Recognition zu deaktivieren reicht nicht aus, weil OCR und die anderen Modelltypen standardmäßig aktiviert bleiben. Backups und Alben bleiben erhalten, aber die inhaltsbasierte Suche steht nicht mehr zur Verfügung. Das Entfernen des Dienstes immich-machine-learning aus der Compose-Datei hat denselben Effekt.
Der Immich-Server startet nach einem Upgrade nicht mehr. Der Postgres-Container kann problemlos laufen. Es ist immich_server, das beim Start die Version der Vektorerweiterung prüft und den Start verweigert. Im Log wird dann wiederholt eine Zeile wie The database currently has VectorChord 0.5.3 activated, but the Postgres instance only has 0.4.2 available. This most likely means the extension was downgraded. angezeigt oder, bei älteren Stacks, The pgvecto.rs extension is not available in this Postgres instance. Die Ursache ist ein Datenbank-Image, dessen Erweiterungsversion älter ist als die Version, auf die Ihre Daten aktualisiert wurden. Dies geschieht fast immer, wenn der Image-Tag manuell geändert oder ein neuerer Dump in ein älteres Image eingespielt wurde. Verwenden Sie das passende Postgres-Image, übernehmen Sie die Compose-Datei aus dem Release, das zu Ihrer Datenbank passt, führen Sie kein Downgrade durch und spielen Sie Backups nur in ein kompatibles Image ein.
Die mobile App kann den Server nicht erreichen. Nach der Eingabe der URL zeigt der Anmeldebildschirm einen Verbindungsfehler wie Could not connect to server. Häufige Ursachen sind: Sie haben http:// eingegeben, obwohl der Proxy nur https:// bereitstellt; Sie haben direkt eine Verbindung zum Backend hergestellt, aber den Port weggelassen, sodass example.com (Port 443) statt example.com:2283 verwendet wurde; der Reverse Proxy leitet /api nicht weiter; oder ein Proxy, der die HTTP-01-Challenges von Let's Encrypt verarbeitet, leitet /.well-known/immich an ein anderes Ziel als Immich weiter. Geben Sie die vollständige https://photos.example.com-URL ein und prüfen Sie zunächst, ob sie im Browser des Telefons geladen wird. Wenn die URL im Browser funktioniert, aber nicht in der App, entfernt der Proxy möglicherweise den Pfad oder leitet /.well-known/immich falsch weiter. Möglich ist auch ein selbstsigniertes Zertifikat, das die App mit einem Handshake-Fehler ablehnt, sofern Sie die Unterstützung für selbstsignierte Zertifikate nicht in den Einstellungen aktivieren.
Der Speicherplatz reicht während des Imports nicht aus. Uploads schlagen fehl, Vorschaubilder bleiben leer und die Logs zeigen ENOSPC: no space left on device oder, bei Postgres, could not extend file ... No space left on device. df -h zeigt, dass das Volume UPLOAD_LOCATION zu 100% belegt ist. Deshalb sollten Sie den benötigten Speicherplatz vor dem Import einer großen Bibliothek einplanen. Binden Sie zur Wiederherstellung ein größeres Volume ein, stoppen Sie den Stack, verschieben Sie UPLOAD_LOCATION dorthin, aktualisieren Sie .env und starten Sie den Stack erneut. Alternativ können Sie den vorhandenen Speicherplatz erweitern, sofern Ihr Anbieter dies unterstützt. Postgres kann blockieren, wenn der Speicherplatz vollständig belegt ist. Schaffen Sie daher zunächst freien Speicherplatz und starten Sie den Datenbank-Container neu, bevor Sie von einer Beschädigung ausgehen.
FAQ
Wie viel RAM und Speicherplatz benötigt Immich?
Die offiziellen Anforderungen von Immich liegen bei mindestens 6 GB RAM, empfohlen werden 8 GB. Für eine kleine Bibliothek sind 4 GB mit Swap in der Praxis die Untergrenze. Richten Sie Swap in jedem Fall ein, weil der Machine-Learning-Container kurzzeitig besonders viel Speicher benötigt. Planen Sie beim Speicherplatz die vollständige Größe Ihrer Bibliothek plus etwa 10–20 % für erzeugte Vorschaubilder und Previews ein. Verwenden Sie lokalen Speicher. Legen Sie das Postgres-Datenverzeichnis niemals auf einer Netzwerkfreigabe ab. Wenn Sie noch entscheiden, welche weiteren Dienste Sie betreiben möchten, stellt der Leitfaden zum Self-Hosting im Jahr 2026 den Speicherbedarf von Immich anderen Diensten gegenüber.
Kann ich Immich ohne GPU betreiben?
Ja. Der Machine-Learning-Container läuft problemlos auf der CPU. Eine GPU beschleunigt lediglich die Indexierung der intelligenten Suche und mit der passenden Image-Variante die Videotranscodierung. Auf der CPU kann die erste Indexierung einer großen Bibliothek im Hintergrund mehrere Stunden dauern. Backups und das Durchsuchen der Bibliothek werden dadurch jedoch nicht blockiert. Wenn Ihr System für Machine Learning insgesamt zu klein ist, können Sie Machine Learning mit dem übergeordneten Schalter in den Administratoreinstellungen vollständig deaktivieren und alle anderen Funktionen weiterverwenden.
Wie aktualisiere ich Immich sicher?
Fixieren Sie IMMICH_VERSION auf einen konkreten Tag wie v3.0.2, lesen Sie vor jedem Upgrade die Release Notes und sichern Sie zuerst die Datenbank. Da das Postgres-Image innerhalb von docker-compose.yml und nicht über IMMICH_VERSION fixiert ist, laden Sie sowohl die Compose-Datei als auch example.env aus dem Ziel-Release erneut herunter und übernehmen Sie Ihre Werte anschließend wieder. Führen Sie danach docker compose pull && docker compose up -d aus. Lassen Sie die Version niemals unbeaufsichtigt mitlaufen. Immich unterstützt keine Downgrades. Ein Upgrade, über das Sie sich nicht vorher informiert haben, kann daher nicht rückgängig gemacht werden.
Was muss ich genau sichern?
Zwei Dinge gemeinsam: ein pg_dump der immich-Datenbank und das vollständige UPLOAD_LOCATION-Verzeichnis mit den Originaldateien. Die Datenbank enthält Alben, Gesichter und die Zuordnung von Assets zu Dateien. Das Verzeichnis enthält die eigentlichen Fotos. Für eine Wiederherstellung benötigen Sie beides sowie ein Datenbank-Image mit einer kompatiblen Vektorerweiterung. Erstellen Sie zuerst den Datenbank-Dump und kopieren Sie anschließend die Dateien. Testen Sie die Wiederherstellung mindestens einmal auf einem Testsystem. Ein nicht getestetes Backup ist kein Backup.
Wie importiere ich meinen vorhandenen Fotoordner?
Binden Sie den Ordner als zusätzliches Volume schreibgeschützt in den immich-server-Container ein, zum Beispiel als - /srv/photos:/mnt/media/photos:ro. Erstellen Sie den Container neu. Öffnen Sie anschließend Administration → External Libraries, erstellen Sie eine Bibliothek und fügen Sie den container-Pfad /mnt/media/photos hinzu. Immich indexiert die Dateien direkt am vorhandenen Speicherort und ändert oder löscht sie nicht. Der häufigste Fehler besteht darin, den Host-Pfad statt des Container-Pfads einzugeben. Dadurch findet der Scan keine Dateien.