Immich: Alternative zu Google Photos für den Homeserver
Immich, eine private Cloud für Fotos und Videos, auf einem Server einrichten. Schritt-für-Schritt-Anleitung für eine erfolgreiche Einrichtung der Bildverwaltung

Inhaltsverzeichnis
In einer Welt, in der Datenschutz immer wichtiger wird, ist Immich eine erfrischende Alternative zu den großen Cloud-Diensten wie Google Photos oder iCloud. Es handelt sich dabei um eine selbstgehostete, quelloffene Lösung, die dir volle Kontrolle über deine Fotos und Videos gibt. In diesem Artikel zeige ich dir Schritt für Schritt, wie du Immich auf deinem Homeserver, NAS oder einem anderen Linux-basierten System installieren kannst.
Open Source: Was macht Immich so besonders?
Immich ist mehr als nur eine weitere Fotoverwaltung. Der Entwickler Alex Tran hat die Software ursprünglich entwickelt, um die Fotos seines Neugeborenen sicher und privat zu speichern - eine Alternative zu Google Photos, die er selbst kontrollieren konnte. Heute ist Immich deutlich ausgereifter, mit beeindruckenden Funktionen:
- Moderne, Google Photos-ähnliche Benutzeroberfläche
- Automatische Foto-Uploads von Android und iOS
- Gesichtserkennung und KI-basierte Bildsuche
- Volle Kontrolle über deine Daten
Voraussetzungen für die Installation
Immich kann mittels Docker auf den meisten Linux-Systemen installiert werden. In diesem Video (YouTube) gehe ich die Installation auf einem VPS durch. Folgendes wird benötigt:
- Server mit Docker: Ein Server, auf dem Docker installiert ist.
- Hardware-Anforderungen: Empfohlen werden 6 GB RAM und 4 CPU-Kerne. In der Regel reichen jedoch auch 4 GB RAM und 2 CPU-Kerne aus.
- Speicherplatz: Ausreichend Speicherplatz für Fotos und Videos.*
- Optional:
- Reverse Proxy: Ein Reverse Proxy (z. B. Nginx Proxy Manager, Caddy, Traefik) für den externen Zugriff und die Nutzung einer Domain.
- DNS-Server: Ein DNS-Server (z. B. Adguard Home, Pi-Hole, Technitium) für die interne Weiterleitung.
- VPN-Server: Falls der Server nicht im eigenen Netzwerk steht, empfiehlt sich die Einrichtung eines VPN-Servers wie WireGuard oder OpenVPN.
- SMTP-E-Mail-Adresse: Für Benachrichtigungen kann eine SMTP-Adresse genutzt werden, z. B. ein Shared-Webhosting-Tarif von Netcup.
INFO
Wenn ein NAS verwendet wird, sollte Portainer (Portainer auf Synology), Dockge (Dockge auf
Ugreen) oder ein anderes Docker-Management-Tool installiert sein, um mehrere Container zu
verwalten. Bei einem Ubuntu Server (Anleitung zur Einrichtung) kann docker compose
genutzt werden.
* In meiner Instanz von Immich habe ich knapp 2200 Fotos und knapp 400 Videos, die zusammen 25 GB Speicherplatz belegen.
Vorbereitung
Ordnerstruktur erstellen
Zunächst erstellen wir eine Ordnerstruktur für Immich auf dem Server. Diese Ordner werden für die Datenbank und die Speicherung der Fotos und Videos verwendet.
Benötigte Ordner:
data
db
Beispiele:
Ubuntu Server
cd ~
mkdir immich
cd immich
mkdir db data
Ergebnis:
/home/user/immich
├── db
└── data
Wir können hier auch gleich eine leere Datei docker-compose.yml
erstellen, die wir später benötigen.
touch docker-compose.yml
Als Datenpfad benötigen wir in diesem Fall nur den relativen Bezug zur docker-compose.yml
Datei. Das wäre in diesem Fall ./db
und ./data
.
Synology NAS
Bei einem Synology NAS können wir entweder einen neuen Freigabeordner für Immich erstellen oder einen Freigabeordner für alle Docker-Container nutzen. Bei meiner Konfiguration habe ich einen Freigabeordner docker
auf meiner SSD erstellt und einen Freigabeordner dockerhdd
auf meiner HDD. In beiden erstelle ich einen Ordner immich
und auf der SSD zusätzlich den Unterordner db
und auf der HDD den Unterordner data
. Somit kann ich die Datenbank auf der SSD und die Fotos und Videos auf der HDD speichern.
Wo auch immer die Ordner erstellt werden, über die Eigenschaften lässt sich der komplette Pfad herausfinden. Dieser wird später für die Docker-Container benötigt.
Beispiel-Ergebnis:
/volume1/docker/
└── immich
└── db
/volume2/dockerhdd/
└── immich
└── data
Ugreen NAS
Bei einem Ugreen NAS können wir einfach einen neuen immich
Ordner im freigegebenen Ordner docker
erstellen. In diesem Ordner erstellen wir dann die Unterordner data
und db
.
Natürlich kann man auch einen anderen Freigabeordner erstellen. Das ist insbesondere dann nützlich, wenn man die Datenbank (db
) auf einer SSD und die Bilder und Videos (data
) auf einer HDD speichern möchte.
Wir benötigen den vollständigen Pfad, den wir über die Eigenschaften des Ordners herausfinden können. Dieser wird später für die Docker-Container benötigt. Dazu muss man auf den Link kopieren Button klicken.
Beispiel-Ergebnis:
/volume1/docker/
└── immich
|── db
└── data
# oder
/volume1/docker/
└── immich
└── db
/volume2/dockerhdd/
└── immich
└── data
Firewall
Um sicherzustellen, dass die erstellten Container miteinander kommunizieren können, empfiehlt es sich bei einer restriktiven Firewall entweder gleich den kompletten internen IP-Bereich freizugeben oder nach der Installation die von den Containern verwendeten IP-Adressen zu überprüfen. Andernfalls kann es vorkommen, dass die Container nicht miteinander kommunizieren können.
Installation leicht gemacht
Immich benötigt folgende Docker-Container:
- Ein Redis-Broker für schnelle Zwischenspeicherung
- Eine PostgreSQL-Datenbank mit der cleveren pgvecto.rs Erweiterung
- Den Immich-Server als Herzstück
- Die Immich-Machine für KI-Funktionen wie Gesichtserkennung
CAUTION
Sowohl der pgvector-Container als auch Immich befinden sich in der Beta-Phase. Updates können zu grundlegenden Änderungen führen. Daher sollten Updates mit Bedacht durchgeführt und stets Backups angelegt werden. Verwende nicht einfach die “latest” Tags für die Container.
Docker Compose Datei
Wir brauchen zunächst die Containerbefehle, die wir zur Installation durchführen.
Docker Compose Generator
Generierte Docker Compose:
12networks:3 internal:4 name: internal5 external: false678volumes:9 model-cache:1011services:12 redis:13 container_name: immich_redis14 image: redis:7-alpine15 restart: unless-stopped16 networks:17 - internal18 healthcheck:19 test: redis-cli ping || exit 12021 db:22 container_name: immich_db23 image: tensorchord/pgvecto-rs:pg16-v0.3.024 restart: unless-stopped25 networks:26 - internal27 volumes:28 - /volume1/docker/immich/db:/var/lib/postgresql/data29 environment:30 POSTGRES_DB: immich31 POSTGRES_USER: immich32 POSTGRES_PASSWORD: changeMeIamAPassword33 POSTGRES_INITDB_ARGS: '--data-checksums'34 healthcheck:35 test: pg_isready --dbname='immich' --username='immich' || exit 1; Chksum="$$(psql --dbname='immich' --username='immich' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 136 interval: 5m37 start_interval: 30s38 start_period: 5m39 command:40 [41 'postgres',42 '-c',43 'shared_preload_libraries=vectors.so',44 '-c',45 'search_path="$$user", public, vectors',46 '-c',47 'logging_collector=on',48 '-c',49 'max_wal_size=2GB',50 '-c',51 'shared_buffers=512MB',52 '-c',53 'wal_compression=on',54 ]5556 immich:57 container_name: immich58 image: ghcr.io/immich-app/immich-server:v1.125.759 restart: unless-stopped60 depends_on:61 - db62 - redis63 networks:64 - internal6566 ports:67 - 2283:228368 volumes:69 - /etc/localtime:/etc/localtime:ro70 - /volume1/docker/immich/data:/usr/src/app/upload71 environment:72 DB_HOSTNAME: db73 DB_USERNAME: immich74 DB_DATABASE_NAME: immich75 DB_PASSWORD: changeMeIamAPassword76 TZ: Europe/Berlin77 healthcheck:78 disable: false7980 immich-machine-learning:81 container_name: immich-machine-learning82 image: ghcr.io/immich-app/immich-machine-learning:v1.125.783 restart: unless-stopped84 depends_on:85 - db86 - redis87 networks:88 - internal89 volumes:90 - model-cache:/cache91 environment:92 DB_HOSTNAME: db93 DB_USERNAME: immich94 DB_DATABASE_NAME: immich95 DB_PASSWORD: changeMeIamAPassword96 TZ: Europe/Berlin97 healthcheck:98 disable: false99
Die Images können angepasst werden, ich rate davon ab latest
bzw. release
zu nutzen, da es zu Problemen führen kann, wenn ein neues Image veröffentlicht wird, das nicht kompatibel ist. Insbesondere solange sich Immich in der Beta befindet, sollte man nicht einfach andere tags angeben. Man kann auf der Container-Seite gucken, welches Image momentan das neuste ist.
Deine Installationsoptionen
Je nachdem, welches System du verwendest, hast du verschiedene Möglichkeiten.
Installation über Docker-Compose (Ubuntu Server)
Der Docker-Compose Code kann in die Datei docker-compose.yml
kopiert werden. Bei den Pfaden können relative Pfade (z. B. ./db
) oder absolute Pfade (z. B. /home/user/immich/db
) verwendet werden. Die Pfade sollten zu den zuvor erstellten Ordnern führen.
Anschließend können die Container mit dem Befehl docker compose up -d
oder sudo docker compose up -d
gestartet werden.
Installation über Portainer
Unter Stacks kann nun ein neuer Stack hinzugefügt werden.
Wenn dieser Menüpunkt fehlt, sollte man erneut sichergehen, dass man die lokale (“local”) Umgebung ausgewählt hat und Portainer mit dem Image portainer/portainer-ce und nicht portainer/portainer betrieben wird.
Hier fügen wir den Docker Compose Code ein.
Anschließend können die Container gestartet werden. Das kann einige Minuten dauern.
Installation über Dockge
In Dockge kann ein neuer Stack erstellt werden. Dazu wird der Docker-Compose Code in das Textfeld eingefügt und der Stack erstellt. Anschließend können die Container gestartet werden.
Die erstmalige Installation kann einige Minuten dauern.
Reverse Proxy
Um Immich über eine Domain wie immich.domain.de erreichbar zu machen, richten wir in der Zwischenzeit einen Reverse Proxy ein.
Nginx Proxy
Dabei gebe ich die Adresse meines Synology-NAS sowie die oben gewählte Portnummer ein. Außerdem kann ich mit einer Access Liste einstellen, ob nur ein lokaler Zugriff möglich ist.
Wenn sich der Nginx Proxy Manager auf dem NAS befindet und der Webserver im gleichen Docker Netzwerk ist, kann man hier den Containernamen immich
eingeben sowie den Port 2283
.
Nachdem ich das SSL Zertifikat für den Proxy Host besorgt habe, füge ich aber auch noch ein paar zusätzliche Einstellungen in die “Custom Nginx Configuration” ein.
client_max_body_size 50000M;
proxy_redirect off;
Das sorgt dafür, dass auch größere Dateien (50.000 MB) zu Immich geladen werden können.
Caddy Proxy
Alternativ können auch andere Proxy Server genutzt werden. Insbesondere dann, wenn man ein anderes Gerät dafür verwendet, gibt es viele Optionen. Mit Caddy kann das so aussehen:
{
acme_ca https://acme-v02.api.letsencrypt.org/directory
email mail@domain.com
}
immich.domain.de {
@blocked not remote_ip private_ranges
respond @blocked 403
reverse_proxy 192.168.1.123:8010
client_max_body_size 50G
}
Oder (wenn man Zugriff von überall haben möchte):
{
acme_ca https://acme-v02.api.letsencrypt.org/directory
email mail@domain.de
}
immich.domain.de {
reverse_proxy 192.168.1.123:8010
client_max_body_size 50G
}
Erster Login
Immich sollte nun unter der Domain oder der IP-Adresse des Servers (mit Port 2283) erreichbar sein.
Der erste Benutzer ist ein Admin-Benutzer. Dieser kann weitere Benutzer hinzufügen und die Einstellungen ändern.
Das Setup ist selbsterklärend. In der Verwaltung kann man nun neue Benutzer hinzufügen und diesen ein Speicherkontingent zuweisen. Die Benutzer können sich dann mit ihrer E-Mail-Adresse und einem Passwort anmelden.
Hat man eine SMTP-Adresse, kann man auch Benachrichtigungen einrichten. Das ist insbesondere dann nützlich, wenn mehrere Benutzer auf Immich zugreifen und Bilder teilen. Hier kann beispielsweise ein Webhosting Tarif von Netcup mit E-Mail Postfach genutzt werden. Die Kosten beginnen bei 2,17 € im Monat.
Apps
Immich bietet auch Apps für Android und iOS an. Diese können im jeweiligen App Store heruntergeladen werden. Die Apps sind kostenlos und ermöglichen es, Fotos und Videos direkt von den Geräten hochzuladen.
Features:
- Automatischer Upload: Neue Fotos und Videos werden automatisch hochgeladen.
- Teilen und Zusammenarbeiten: Alben können mit Familie und Freunden geteilt werden.
Backup erstellen
Für ein vollständiges Backup sollten die Ordner data/uploads
(Bilder und Videos) sowie data/backups
(Datenbank) gesichert werden. Das lässt sich manuell machen. Alternativ auch automatisiert mit einem Skript oder einem Backup-Tool wie rsync oder Duplicati.
Ein Vorteil (und gleichzeitig Nachteil) von Immich liegt darin, dass die Bilder in einem normalen Dateisystem gespeichert werden. Das bedeutet falls irgendwas schief laufen sollte und Immich nicht mehr funktioniert, kann man die Bilder auch einfach so kopieren und auf einem anderen System wiederherstellen (vorausgesetzt die Bilder sind nicht gelöschte worden).
Fazit
Immich ist eine fantastische Alternative zu Google Photos und Synology Photos. Mit seiner Open-Source-DNA, den starken Funktionen und der aktiven Community bist du bestens für die private Fotoverwaltung gerüstet.