跳到主要内容

預先存在的 Postgres

雖然不是官方推薦,但可以使用已經存在的 Postgres 伺服器運行 Immich。使用這種設置時,您應該具備基本的 Postgres 和 Linux 命令行知識。如果您沒有這些知識,我們建議使用具有專用 Postgres 容器的默認設置。

默認情況下,Immich 需要對 Postgres 資料庫具有超級使用者許可權,並且需要安裝一些擴展。本指南概述瞭如何準備已存在的 Postgres 伺服器以供 Immich 使用所需的步驟。

提示

使用已存在的 Postgres 伺服器可以解鎖強大的管理功能,包括使用 pgBackRest 或 Barman 等程式進行邏輯複製以及流式寫入日誌備份。

必要條件

您必須安裝 pgvector (>= 0.7.0, < 1.0.0),因為它是 vchord 的必要條件。 在 Debian/Ubuntu 上,最簡單的方式是添加 PostgreSQL Apt repository,然後執行 apt install postgresql-NN-pgvector,其中 NN 是您的 Postgres 版本(例如,16)。

您必須按照他們的說明將 VectorChord 安裝到您的 Postgres 實例中。安裝後,將 shared_preload_libraries = 'vchord.so' 添加到您的 postgresql.conf 中。如果您已經設置了一些 shared_preload_libraries,每個擴展可以用逗號分隔。例如,shared_preload_libraries = 'pg_stat_statements, vchord.so'

注释

已知 Immich 可與 Postgres 版本 >= 14, < 18 配合使用。

確保 VectorChord 的已安裝版本與您的 Immich 版本兼容。VectorChord 的當前接受範圍為 >= 0.3.0, < 0.5.0

指定連接 URL

通過在 .env 文件中設置 DB_URL 環境變數,您可以連接到已存在的 Postgres 伺服器。

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

# 需要與 Postgres 建立 SSL 連接
# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require'

# 需要 SSL 連接,但不強制檢查證書名稱
# DB_URL='postgresql://immichdbusername:immichdbpassword@postgreshost:postgresport/immichdatabasename?sslmode=require&sslmode=no-verify'

擁有超級使用者許可權

通常 Immich 期望在資料庫中擁有超級使用者許可權,您可以通過在 psql 控制台運行 ALTER USER <immichdbusername> WITH SUPERUSER; 來授予。如果您不希望授予超級使用者許可權,請遵循下一部分中的說明。

沒有超級使用者許可權

注释

此方法僅適用於高級使用者,並且在更新 Immich 時通常需要進行手動干預。

警告

目前,因使用 pg_dumpall,自動備份需要超級使用者許可權。

按照以下指示在 psql 提示符下準備資料庫,Immich 可以在沒有超級使用者許可權的情況下運行。

為 Immich 設置 Postgres
CREATE DATABASE <immichdatabasename>;
\c <immichdatabasename>
BEGIN;
ALTER DATABASE <immichdatabasename> OWNER TO <immichdbusername>;
CREATE EXTENSION vchord CASCADE;
CREATE EXTENSION earthdistance CASCADE;
COMMIT;

更新 VectorChord

安裝新版本的 VectorChord 時,您需要手動更新擴展並重新索引,方法如下:連接到 Immich 資料庫並運行以下命令:

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

遷移到 VectorChord

VectorChord 是 pgvecto.rs 的後繼擴展,具備更高性能、更低內存使用量以及更高品質的智能搜索和面部識別結果。

從 pgvecto.rs 遷移

pgvecto.rs 的支持將在未來版本中被刪除,因此我們建議所有當前使用 pgvecto.rs 的使用者在方便時遷移到 VectorChord。遷移有兩種主要方式。

最簡單的選擇是在遷移過程中同時安裝兩個擴展:

遷移步驟(自動)
  1. 確保仍然安裝了 pgvecto.rs
  2. 安裝 pgvector (>= 0.7.0, < 1.0.0)。在 Debian/Ubuntu 上最簡單的方法是添加 PostgreSQL Apt repository,然後執行 apt install postgresql-NN-pgvector,其中 NN 是您的 Postgres 版本(例如,16
  3. 安裝 VectorChord
  4. shared_preload_libraries= 'vchord.so, vectors.so' 添加到您的 postgresql.conf 中,確保包含 both vchord.sovectors.so。如果需要,您可以在此處包括其他庫
  5. 重啟 Postgres 資料庫
  6. 如果 Immich 沒有超級使用者許可權,使用 psql 或其他資料庫客戶端運行 SQL 命令 CREATE EXTENSION vchord CASCADE;
  7. 啟動 Immich 並等待輸出 Reindexed face_indexReindexed clip_index 日誌
  8. 如果 Immich 沒有超級使用者許可權,使用 SQL 命令 DROP EXTENSION vectors;
  9. 運行 DROP SCHEMA vectors; 刪除舊架構
  10. shared_preload_libraries 設置中移除 vectors.so 條目
  11. 重啟 Postgres 資料庫
  12. 卸載 pgvecto.rs(例如在基於 Debian 的環境中執行 apt-get purge vectors-pg14,根據需要替換 pg14)。保留 pgvector,因為它提供了 vchord 使用的數據類型

如果無法同時安裝 VectorChord 和 pgvecto.rs,可以通過更手動的步驟進行遷移:

遷移步驟(手動)
  1. 在 pgvecto.rs 仍然安裝時,使用 psql 或其他資料庫客戶端運行以下 SQL 命令。記下此命令輸出的數字,稍後將需要它
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. 使用以下 SQL 命令移除 pgvecto.rs 的引用
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
  2. 將列更改回適當的向量類型,將 <number> 替換為步驟 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. 啟動 Immich,讓它使用 VectorChord 創建新的索引

從 pgvector 遷移

遷移步驟
  1. 確保您安裝的 pgvector 至少是 0.7.0。如果低於此版本,請升級並使用 psql 或其他資料庫客戶端執行 SQL 命令 ALTER EXTENSION vector UPDATE;
  2. 遵循必要條件安裝 VectorChord
  3. 如果 Immich 沒有超級使用者許可權,運行 SQL 命令 CREATE EXTENSION vchord CASCADE;
  4. 移除 DB_VECTOR_EXTENSION=pgvector 環境變數,否則 Immich 將仍然使用 pgvector
  5. 啟動 Immich,讓它使用 VectorChord 創建新的索引

請注意,VectorChord 本身使用 pgvector 類型,因此在完成這些步驟後,您不應該卸載 pgvector。