Zum Hauptinhalt springen

Vorhandenes Postgres

Obwohl es nicht offiziell empfohlen wird, ist es möglich, Immich mit einem vorhandenen Postgres-Server auszuführen. Für diese Konfiguration sollten Sie über grundlegende Kenntnisse in Postgres und der Linux-Befehlszeile verfügen. Falls Sie diese nicht haben, empfehlen wir die Verwendung der Standardkonfiguration mit einem dedizierten Postgres-Container.

Standardmäßig erwartet Immich Superuser-Rechte auf der Postgres-Datenbank und verlangt, dass bestimmte Erweiterungen installiert sind. Diese Anleitung beschreibt die Schritte, die erforderlich sind, um einen vorhandenen Postgres-Server für die Nutzung durch Immich vorzubereiten.

Tipp

Die Verwendung eines vorhandenen Postgres-Servers kann leistungsstarke Administrationsfunktionen freischalten, darunter logische Replikation und Streaming-Backups des Write-Ahead-Logs mithilfe von Programmen wie pgBackRest oder Barman.

Voraussetzungen

Sie müssen pgvector (>= 0.7.0, < 1.0.0) installieren, da es eine Voraussetzung für vchord ist. Der einfachste Weg auf Debian/Ubuntu besteht darin, das PostgreSQL Apt-Repository hinzuzufügen und anschließend apt install postgresql-NN-pgvector auszuführen, wobei NN Ihre Postgres-Version ist (z. B. 16).

Sie müssen VectorChord in Ihrer Postgres-Instanz basierend auf deren Anleitung installieren. Nach der Installation fügen Sie shared_preload_libraries = 'vchord.so' zu Ihrer postgresql.conf hinzu. Wenn bereits einige shared_preload_libraries gesetzt sind, können Sie jede Erweiterung mit einem Komma trennen. Zum Beispiel: shared_preload_libraries = 'pg_stat_statements, vchord.so'.

Notiz

Immich funktioniert nachweislich mit Postgres-Versionen >= 14, < 18.

Stellen Sie sicher, dass die installierte Version von VectorChord mit Ihrer Version von Immich kompatibel ist. Der derzeit akzeptierte Bereich für VectorChord liegt bei >= 0.3.0, < 0.5.0.

Verbindung-URL angeben

Sie können eine Verbindung zu Ihrem vorhandenen Postgres-Server herstellen, indem Sie die Umgebungsvariable DB_URL in der Datei .env festlegen.

DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename'

# SSL-Verbindung zu Postgres erforderlich
# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require'

# SSL-Verbindung erforderlich, jedoch ohne Überprüfung des Zertifikatsnamens
# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require&sslmode=no-verify'

Mit Superuser-Rechten

Normalerweise erwartet Immich Superuser-Rechte für die Datenbank, die Sie gewähren können, indem Sie ALTER USER <immichdbusername> WITH SUPERUSER; in der psql-Konsole ausführen. Wenn Sie die Vergabe von Superuser-Rechten vermeiden möchten, folgen Sie den Anweisungen im nächsten Abschnitt.

Ohne Superuser-Rechte

Vorsicht

Diese Methode wird nur fortgeschrittenen Benutzern empfohlen und erfordert häufig manuellen Eingriff bei der Aktualisierung von Immich.

Gefahr

Derzeit erfordern automatische Backups Superuser-Rechte aufgrund der Verwendung von pg_dumpall.

Immich kann ohne Superuser-Rechte ausgeführt werden, indem die unten stehenden Anweisungen an der psql-Eingabeaufforderung befolgt werden, um die Datenbank vorzubereiten.

Postgres für Immich einrichten
CREATE DATABASE <immichdatabasename>;
\c <immichdatabasename>
BEGIN;
ALTER DATABASE <immichdatabasename> OWNER TO <immichdbusername>;
CREATE EXTENSION vchord CASCADE;
CREATE EXTENSION earthdistance CASCADE;
COMMIT;

VectorChord aktualisieren

Beim Installieren einer neuen Version von VectorChord müssen Sie die Erweiterung manuell aktualisieren und neu indizieren, indem Sie sich mit der Immich-Datenbank verbinden und folgendes ausführen:

ALTER EXTENSION vchord UPDATE;
REINDEX INDEX face_index;
REINDEX INDEX clip_index;

Migration zu VectorChord

VectorChord ist die Nachfolgeverweiterung von pgvecto.rs und ermöglicht höhere Leistung, niedrigeren Speicherverbrauch und qualitativ hochwertigere Ergebnisse für intelligente Suche und Gesichtserkennung.

Migration von pgvecto.rs

Die Unterstützung für pgvecto.rs wird in einer späteren Version eingestellt, daher empfehlen wir allen Benutzern, die derzeit pgvecto.rs verwenden, zu VectorChord zu wechseln, sobald es möglich ist. Es gibt zwei Hauptansätze dafür.

Die einfachste Option besteht darin, beide Erweiterungen während der Migration installiert zu haben:

Migrationsschritte (automatisch)
  1. Stellen Sie sicher, dass pgvecto.rs weiterhin installiert ist
  2. Installieren Sie pgvector (>= 0.7.0, < 1.0.0). Der einfachste Weg dazu ist unter Debian/Ubuntu die Hinzufügung des PostgreSQL Apt-Repositories und anschließend die Ausführung von apt install postgresql-NN-pgvector, wobei NN Ihre Postgres-Version ist (z. B. 16)
  3. VectorChord installieren
  4. Fügen Sie shared_preload_libraries= 'vchord.so, vectors.so' zu Ihrer postgresql.conf hinzu und stellen Sie sicher, dass beide vchord.so und vectors.so enthalten sind. Bei Bedarf können hier auch andere Bibliotheken hinzugefügt werden
  5. Starten Sie die Postgres-Datenbank neu
  6. Falls Immich keine Superuser-Rechte hat, führen Sie den SQL-Befehl CREATE EXTENSION vchord CASCADE; aus, indem Sie psql oder Ihren bevorzugten Datenbank-Client verwenden
  7. Starten Sie Immich und warten Sie, bis die Logs Reindexed face_index und Reindexed clip_index ausgegeben werden
  8. Falls Immich keine Superuser-Rechte hat, führen Sie den SQL-Befehl DROP EXTENSION vectors; aus
  9. Löschen Sie das alte Schema durch Ausführen von DROP SCHEMA vectors;
  10. Entfernen Sie den Eintrag vectors.so aus der Einstellung shared_preload_libraries
  11. Starten Sie die Postgres-Datenbank neu
  12. Deinstallieren Sie pgvecto.rs (z. B. apt-get purge vectors-pg14 auf Debian-basierten Systemen, wobei pg14 entsprechend angepasst wird). pgvector muss weiterhin installiert bleiben, da es die Datentypen bereitstellt, die von vchord verwendet werden

Falls es nicht möglich ist, VectorChord und pgvecto.rs gleichzeitig installiert zu haben, können Sie die Migration mit mehr manuellen Schritten durchführen:

Migrationsschritte (manuell)
  1. Während pgvecto.rs noch installiert ist, führen Sie den folgenden SQL-Befehl mithilfe von psql oder einem bevorzugten Datenbank-Client aus. Merken Sie sich die durch diesen Befehl ausgegebene Zahl, da Sie sie später benötigen
SELECT atttypmod as dimsize
FROM pg_attribute f
JOIN pg_class c ON c.oid = f.attrelid
WHERE c.relkind = 'r'::char
AND f.attnum > 0
AND c.relname = 'smart_search'::text
AND f.attname = 'embedding'::text;
  1. Entfernen Sie Verweise auf pgvecto.rs mithilfe der untenstehenden SQL-Befehle
DROP INDEX IF EXISTS clip_index;
DROP INDEX IF EXISTS face_index;
ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE real[];
ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE real[];
  1. VectorChord installieren
  2. Ändern Sie die Spalten zurück in die entsprechenden Vektortypen und ersetzen Sie <number> durch die Zahl aus Schritt 1
CREATE EXTENSION IF NOT EXISTS vchord CASCADE;
ALTER TABLE smart_search ALTER COLUMN embedding SET DATA TYPE vector(<number>);
ALTER TABLE face_search ALTER COLUMN embedding SET DATA TYPE vector(512);
  1. Starten Sie Immich und lassen Sie es neue Indizes mithilfe von VectorChord erstellen

Migration von pgvector

Migrationsschritte
  1. Stellen Sie sicher, dass mindestens Version 0.7.0 von pgvector installiert ist. Wenn dies nicht der Fall ist, aktualisieren Sie es und führen Sie den SQL-Befehl ALTER EXTENSION vector UPDATE; mithilfe von psql oder einem bevorzugten Datenbank-Client aus
  2. Folgen Sie den Voraussetzungen, um VectorChord zu installieren
  3. Falls Immich keine Superuser-Rechte hat, führen Sie den SQL-Befehl CREATE EXTENSION vchord CASCADE; aus
  4. Entfernen Sie die Umgebungsvariable DB_VECTOR_EXTENSION=pgvector, da Immich sonst weiterhin pgvector verwenden würde, falls die Variable gesetzt ist
  5. Starten Sie Immich und lassen Sie es neue Indizes mithilfe von VectorChord erstellen

Beachten Sie, dass VectorChord selbst pgvector-Typen verwendet, daher sollten Sie pgvector nach diesen Schritten nicht deinstallieren.