SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-28

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 zur Sicherung von Fotos und Videos und ein echter Ersatz für Google Photos. Die Smartphone-App lädt Ihre Kamerarolle im Hintergrund hoch. Dazu kommen eine Zeitleiste, Alben, Gesichtserkennung und eine Suche mit maschinellem Lernen, die beispielsweise „Strand“ oder eine Person findet, ohne dass Sie etwas taggen müssen. Sie betreiben Immich auf einem eigenen VPS. Die Originaldateien bleiben auf Ihrer Festplatte, und niemand analysiert 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 RAM, Smartphone-Apps und Befehle für Sicherungen gegenüber.

Die Installation besteht aus vier Containern aus der Docker-Compose-Datei des Projekts. Das dauert zehn Minuten. Der aufwendige Teil dieses Leitfadens folgt danach: Der Machine-Learning-Container benötigt auf einem kleinen System viel Arbeitsspeicher, Originaldateien belegen schnell Speicherplatz, die mobile App akzeptiert keinen Server mit einfachem HTTP, und Immich veröffentlicht häufig inkompatible Änderungen. Dadurch kann ein unvorsichtiger docker compose pull dazu führen, dass Ihre Datenbank nicht mehr startet. Nehmen Sie diese vier Punkte ernst, läuft Immich äußerst zuverlässig. Ignorieren Sie sie, verlieren Sie 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-server und Postgres benötigen wenig Arbeitsspeicher. Der Container immich-machine-learning benö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 zuerst Swap hinzu

Der häufigste Fehler bei Immich auf einem kleinen VPS ist, dass der ML-Container wegen Speichermangels beendet wird. Richten Sie zuerst zusätzlichen Auslagerungsspeicher ein, damit der Kernel über Speicherreserven verfügt.

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 -h

free -h sollte jetzt eine Swap:-Zeile mit 4.0Gi anzeigen. Dadurch wird ML nicht schneller, aber der Container wird auf einer Maschine mit 4 GB Speicher nicht während der Indizierung beendet.

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.env

Diese 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, Container immich_server) stellt die API und die Weboberfläche bereit und lauscht auf Port 2283. Ihre Uploads werden unter /data eingebunden.
  • immich-machine-learning (ghcr.io/immich-app/immich-machine-learning, Container immich_machine_learning) übernimmt die CLIP-Suche und die Gesichtserkennung. Heruntergeladene Modelle werden in einem model-cache-Volume zwischengespeichert. Dieser Dienst benötigt besonders viel Arbeitsspeicher.
  • database (Container immich_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 Beispiel ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:.... Ältere Installationen verwendeten pgvecto.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 (Container immich_redis) stellt eine Valkey/Redis-Instanz für Auftragswarteschlangen bereit.

Schritt 3: .env konfigurieren, dort liegen Ihre Fotos und die Datenbank

Ö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=immich

Zwei Regeln ersparen Ihnen spätere Probleme. UPLOAD_LOCATION sollte auf Ihre große Festplatte zeigen. Wenn Sie später ein Daten-Volume einbinden, legen Sie den Mount-Pfad von Anfang an hier fest, denn eine nachträgliche Verschiebung bedeutet, dass Sie Vorschaubilder verschieben und Asset-Pfade aktualisieren müssen. DB_DATA_LOCATION muss sich auf einer lokalen Festplatte befinden: PostgreSQL kann auf einer NFS- oder SMB-Freigabe beschädigt werden, und die Dokumentation weist ausdrücklich darauf hin. Wenn Sie für DB_PASSWORD nur Buchstaben und Ziffern verwenden, vermeiden Sie eine Klasse von Fehlern beim Escaping von Connection Strings.

Schritt 4: Erster Start und Erstellen des Administratorkontos

cd /opt/immich
sudo docker compose up -d
sudo docker compose ps

Das 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 vollständige URLs

Die mobile App benötigt HTTPS. Setzen 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-Anwendungen die sauberste Option. Ein Label-Block leitet photos.example.com an den immich-server-Container weiter und ruft das Zertifikat automatisch ab. Wenn Sie nginx bevorzugen, stellt der Leitfaden Let's Encrypt mit Certbot und nginx ein Zertifikat und einen proxy_pass http://127.0.0.1:2283;-Block bereit. Sobald dieser Proxy vorhanden ist, fügen Sie den nächsten Dienst meist nur noch über eine neue Subdomain hinzu. So kann eine Medienoberfläche wie Halcyon, die Videoshop-Oberfläche im Stil 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 gemeinsamen API bündelt. Dieser bindet absichtlich an das Loopback-Interface und ist erst erreichbar, wenn der Proxy TLS davor terminiert. Ändern Sie deshalb das Standardpasswort, bevor Sie eine Subdomain darauf verweisen. Nicht jeder Container benötigt jedoch einen öffentlichen Hostnamen. Ein ausschließlich für Administratoren vorgesehenes Werkzeug wie ein selbst gehosteter open-kritt-Sicherheitsscanner sollte vollständig vom Proxy ausgeschlossen werden. Öffnen Sie seine Benutzeroberfläche nur selten und greifen Sie dann über einen SSH-Tunnel darauf zu. Andere Dienste benötigen keinen Proxy, weil sie nicht über HTTP kommunizieren. Ein selbst gehosteter RustDesk-Relay-Server ist dafür das deutlichste Beispiel. Er lauscht auf mehreren reinen TCP- und UDP-Ports und benötigt Firewall-Regeln statt einer Subdomain. Eine Proxy-Einstellung ist für Immich wichtig: Erhöhen Sie das Upload-Limit, weil Videos von Smartphones groß sind. In nginx setzen Sie dafür 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.

Die von der App erzwungene Regel lautet: Der Endpunkt muss erreichbar sein und in der Praxis HTTPS verwenden. http://-Endpunkte oder eine direkte IP-Adresse ohne angegebenen Port führen zur Meldung „Die App kann den Server nicht erreichen“. Dieser Fehler wird weiter unten als benannter Fehler beschrieben.

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:ro

Der :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 Upgrade-Disziplin, die Immich verlangt

Dieser Teil entscheidet darüber, ob Immich stabil läuft oder ausfällt. Immich veröffentlicht neue Versionen schnell und stellt keine rückportierten Fehlerbehebungen bereit. Downgrades werden nicht unterstützt. Wenn Sie das veränderliche v3-Tag blind verwenden, wird Ihre Datenbank früher oder später beschädigt. Diese Vorgehensweise mit dem Festlegen einer Version und dem Lesen der Versionshinweise eignet sich für jeden langfristig betriebenen Container auf dem Server. Deshalb wird ein selbst gehosteter KiroCrew-Agent auf ein bekannt funktionierendes Tag festgelegt, statt beim nächsten Neustart unbemerkt auf eine andere Version zu wechseln. Die Vorgehensweise:

  1. Legen Sie eine Version fest. Setzen Sie IMMICH_VERSION auf ein konkretes Tag wie v3.0.2 und nicht auf das veränderliche v3, das immer die neueste v3.x-Version abruft.
  2. Lesen Sie vor jedem Upgrade die Versionshinweise vollständig. Dort werden inkompatible Änderungen aufgeführt, insbesondere Änderungen an der Datenbank oder an Vektorerweiterungen. Die Version v3.0 ist ein offensichtliches Beispiel: Sie entfernte pgvecto.rs vollständig. Wer noch die alte Erweiterung verwendete, musste daher zunächst die Migration zu VectorChord abschließen, die bereits in v1.133 eingeführt worden war, bevor ein Upgrade möglich war.
  3. Sichern Sie zuerst die Datenbank (Schritt 9). Das gilt immer, besonders wenn in den Versionshinweisen Änderungen an der Datenbank erwähnt werden.
  4. Laden Sie auch die neue Compose-Datei herunter. IMMICH_VERSION legt nur die Images für Server und ML fest. Das Postgres-Image wird innerhalb von docker-compose.yml per Digest festgelegt. Wenn eine Version eine neuere Datenbankerweiterung benötigt, wird daher eine neue 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.
  5. Aktualisieren Sie Ihre mobilen Clients ungefähr zur gleichen Zeit. Der Server unterstützt nur die zugehörige Hauptversion. Die App unterstützt die aktuelle und die vorherige Hauptversion. Wenn der Server der App voraus ist, zeigt das Telefon Your app major version is not compatible with the server! an, bis Sie die App aktualisieren. Aktualisieren Sie daher am besten zuerst die App.

Die konkreten Befehle, sobald die neuen Dateien bereitliegen:

cd /opt/immich
sudo docker compose pull
sudo docker compose up -d
sudo docker image prune

Schritt 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.gz

Sichern 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 -d

Die 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 mit den dabei angezeigten Zeichenfolgen

Der ML-Container wird wegen Speichermangels beendet. sudo docker compose logs immich-machine-learning endet abrupt, docker compose ps zeigt Restarting an, und der Exit-Code lautet 137. sudo dmesg | grep -i oom bestätigt dies: Out of memory: Killed process ... (python3). Such- und Gesichtserkennungsjobs bleiben anschließend hängen. Die Ursache ist zu wenig RAM für die Modelle. Gehen Sie in dieser Reihenfolge vor: Fügen Sie Swap hinzu (Schritt 1), weisen Sie der VPS mehr RAM zu oder deaktivieren Sie ML unter Administration → Settings → Machine Learning Settings, wenn dies wirklich nicht möglich ist. Deaktivieren Sie dazu Smart Search und Facial Recognition. Backups und Alben bleiben erhalten, die Suche nach Inhalten steht jedoch nicht mehr zur Verfügung. Das Entfernen des Dienstes immich-machine-learning aus der Compose-Datei hat denselben Effekt.

Postgres startet nach einem Upgrade nicht mehr. Das Server-Log 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. oder bei älteren Stacks The pgvecto.rs extension is not available in this Postgres instance.. Die Ursache ist ein Datenbank-Image mit einer älteren Erweiterungsversion als der Version, auf die Ihre Daten aktualisiert wurden. Das liegt fast immer daran, dass 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 Daten nur in ein kompatibles Image ein.

Die mobile App kann den Server nicht erreichen. Nach der Eingabe der URL zeigt der Anmeldebildschirm einen Verbindungsfehler oder Server is not reachable an. Es gibt drei Ursachen: 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; oder der Reverse Proxy leitet /api nicht weiter. Geben Sie die vollständige https://photos.example.com-URL ein und prüfen Sie zuerst, ob sie im Browser des Telefons geladen wird. Wenn der Browser funktioniert und die App nicht, entfernt der Proxy möglicherweise den Pfad, oder das Zertifikat ist selbst signiert. Die App weist nicht vertrauenswürdige Zertifikate zurück.

Der Speicherplatz ist während des Imports erschöpft. 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 sollte die benötigte Festplattenkapazität vor dem Import einer großen Bibliothek dimensioniert werden. 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 die vorhandene Festplatte erweitern, sofern Ihr Provider dies erlaubt. Postgres kann in einen blockierten Zustand geraten, wenn der Speicherplatz vollständig belegt ist. Geben Sie Speicherplatz frei 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 und empfohlenen 8 GB. Für eine kleine Bibliothek sind 4 GB mit Swap in der Praxis die Untergrenze. Konfigurieren Sie Swap in jedem Fall, weil der Machine-Learning-Container die höchste Lastspitze erzeugt. 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, ordnet der Leitfaden zum Self-Hosting im Jahr 2026 den Platzbedarf von Immich neben dem anderer Dienste ein.

Kann ich Immich ohne GPU betreiben?

Ja. Der Machine-Learning-Container läuft problemlos auf der CPU. Eine GPU beschleunigt lediglich die Indexierung für die intelligente Suche und mit der passenden Image-Variante die Videotranskodierung. 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 Server für Machine Learning insgesamt zu klein ist, können Sie Smart Search und Facial Recognition in den Administratoreinstellungen deaktivieren und alle übrigen 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 statt über IMMICH_VERSION fixiert wird, laden Sie die Compose-Datei und 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 variabel. Immich veröffentlicht inkompatible Änderungen und unterstützt keine Downgrades.

Was muss ich genau sichern?

Zwei Dinge müssen gemeinsam gesichert werden: 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 Vektor-Erweiterung. Erstellen Sie zuerst den Datenbank-Dump und kopieren Sie danach die Dateien. Testen Sie die Wiederherstellung mindestens einmal auf einem Testserver. Ein nicht getestetes Backup ist kein Backup.

Wie importiere ich meinen vorhandenen Fotoordner?

Binden Sie den Ordner schreibgeschützt als zusätzliches Volume in den immich-server-Container ein, zum Beispiel als - /srv/photos:/mnt/media/photos:ro. Erstellen Sie den Container anschließend neu. Öffnen Sie dann Administration → External Libraries, erstellen Sie eine Bibliothek und fügen Sie den container-Pfad /mnt/media/photos hinzu. Immich indexiert die Dateien 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.