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
Immich ist eine selbstgehostete, quelloffene Lösung zum Speichern und Verwalten von Fotos und Videos. Sie bietet eine Alternative zu Cloud-Diensten wie Google Photos und iCloud und setzt dabei auf Datenschutz und Benutzerkontrolle. In diesem Artikel zeige ich, wie Immich auf verschiedenen Servern installiert werden kann, sei es auf einem Synology NAS, einem Ugreen NAS oder einem anderen Computer.
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. 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
db-backup
.
Beispiele:
Ubuntu Server
cd ~
mkdir immich
cd immich
mkdir db db-backup data
Ergebnis:
/home/user/immich
├── db
├── db-backup
└── 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
, ./db-backup
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
└── db-backup
/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
|── db-backup
└── data
# oder
/volume1/docker/
└── immich
|── db
└── db-backup
/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 db_backup:57 container_name: immich_db_backup58 image: prodrigestivill/postgres-backup-local:1659 restart: unless-stopped60 environment:61 POSTGRES_HOST: db62 POSTGRES_CLUSTER: 'TRUE'63 POSTGRES_USER: immich64 POSTGRES_PASSWORD: changeMeIamAPassword65 POSTGRES_DB: immich66 SCHEDULE: "@daily"67 POSTGRES_EXTRA_OPTS: '--clean --if-exists'68 TZ: Europe/Berlin69 volumes:70 - /volume1/docker/immich/db-backup:/backups71 depends_on:72 - db73 networks:74 - internal7576 immich:77 container_name: immich78 image: ghcr.io/immich-app/immich-server:v1.119.179 restart: unless-stopped80 depends_on:81 - db82 - redis83 networks:84 - internal8586 ports:87 - 2283:228388 volumes:89 - /etc/localtime:/etc/localtime:ro90 - /volume1/docker/immich/data:/usr/src/app/upload91 environment:92 DB_HOSTNAME: db93 DB_USERNAME: immich94 DB_DATABASE_NAME: immich95 DB_PASSWORD: changeMeIamAPassword96 TZ: Europe/Berlin97 healthcheck:98 disable: false99100 immich-machine-learning:101 container_name: immich-machine-learning102 image: ghcr.io/immich-app/immich-machine-learning:v1.119.1103 restart: unless-stopped104 depends_on:105 - db106 - redis107 networks:108 - internal109 volumes:110 - model-cache:/cache111 environment:112 DB_HOSTNAME: db113 DB_USERNAME: immich114 DB_DATABASE_NAME: immich115 DB_PASSWORD: changeMeIamAPassword116 TZ: Europe/Berlin117 healthcheck:118 disable: false119
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 db-backup
(Datenbank) sowie data
(Bilder und Videos) 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.