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

Immich: Alternative zu Google Photos für den Homeserver-heroimage

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.

Server Statistik

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.

Neues Verzeichnis

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.

Pfad

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.

Neues Verzeichnis

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.

Pfad

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:

1
2networks:
3 internal:
4 name: internal
5 external: false
6
7
8volumes:
9 model-cache:
10
11services:
12 redis:
13 container_name: immich_redis
14 image: redis:7-alpine
15 restart: unless-stopped
16 networks:
17 - internal
18 healthcheck:
19 test: redis-cli ping || exit 1
20
21 db:
22 container_name: immich_db
23 image: tensorchord/pgvecto-rs:pg16-v0.3.0
24 restart: unless-stopped
25 networks:
26 - internal
27 volumes:
28 - /volume1/docker/immich/db:/var/lib/postgresql/data
29 environment:
30 POSTGRES_DB: immich
31 POSTGRES_USER: immich
32 POSTGRES_PASSWORD: changeMeIamAPassword
33 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 1
36 interval: 5m
37 start_interval: 30s
38 start_period: 5m
39 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 ]
55
56 db_backup:
57 container_name: immich_db_backup
58 image: prodrigestivill/postgres-backup-local:16
59 restart: unless-stopped
60 environment:
61 POSTGRES_HOST: db
62 POSTGRES_CLUSTER: 'TRUE'
63 POSTGRES_USER: immich
64 POSTGRES_PASSWORD: changeMeIamAPassword
65 POSTGRES_DB: immich
66 SCHEDULE: "@daily"
67 POSTGRES_EXTRA_OPTS: '--clean --if-exists'
68 TZ: Europe/Berlin
69 volumes:
70 - /volume1/docker/immich/db-backup:/backups
71 depends_on:
72 - db
73 networks:
74 - internal
75
76 immich:
77 container_name: immich
78 image: ghcr.io/immich-app/immich-server:v1.119.1
79 restart: unless-stopped
80 depends_on:
81 - db
82 - redis
83 networks:
84 - internal
85
86 ports:
87 - 2283:2283
88 volumes:
89 - /etc/localtime:/etc/localtime:ro
90 - /volume1/docker/immich/data:/usr/src/app/upload
91 environment:
92 DB_HOSTNAME: db
93 DB_USERNAME: immich
94 DB_DATABASE_NAME: immich
95 DB_PASSWORD: changeMeIamAPassword
96 TZ: Europe/Berlin
97 healthcheck:
98 disable: false
99
100 immich-machine-learning:
101 container_name: immich-machine-learning
102 image: ghcr.io/immich-app/immich-machine-learning:v1.119.1
103 restart: unless-stopped
104 depends_on:
105 - db
106 - redis
107 networks:
108 - internal
109 volumes:
110 - model-cache:/cache
111 environment:
112 DB_HOSTNAME: db
113 DB_USERNAME: immich
114 DB_DATABASE_NAME: immich
115 DB_PASSWORD: changeMeIamAPassword
116 TZ: Europe/Berlin
117 healthcheck:
118 disable: false
119

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.

Neuer Stack

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.

Compose Datei in den Stack einfügen

Anschließend können die Container gestartet werden. Das kann einige Minuten dauern.

Container gestartet

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.

Neuer Stack

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.

Proxy Host

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.

Anmeldung

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.

Benachrichtigungen

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.

Immich App Android

Immich App iOS

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.


Diese Website verwendet Cookies. Diese sind notwendig, um die Funktionalität der Website zu gewährleisten. Weitere Informationen finden Sie in der Datenschutzerklärung