預先存在的 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 可以在沒有超級使用者許可權的情況下運行。
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。遷移有兩種主要方式。
最簡單的選擇是在遷移過程中同時安裝兩個擴展:
遷移步驟(自動)
- 確保仍然安裝了 pgvecto.rs
- 安裝
pgvector
(>= 0.7.0, < 1.0.0
)。在 Debian/Ubuntu 上最簡單的方法是添加 PostgreSQL Apt repository,然後執行apt install postgresql-NN-pgvector
,其中NN
是您的 Postgres 版本(例如,16
) - 安裝 VectorChord
- 將
shared_preload_libraries= 'vchord.so, vectors.so'
添加到您的postgresql.conf
中,確保包含 bothvchord.so
和vectors.so
。如果需要,您可以在此處包括其他庫 - 重啟 Postgres 資料庫
- 如果 Immich 沒有超級使用者許可權,使用 psql 或其他資料庫客戶端運行 SQL 命令
CREATE EXTENSION vchord CASCADE;
- 啟動 Immich 並等待輸出
Reindexed face_index
和Reindexed clip_index
日誌 - 如果 Immich 沒有超級使用者許可權,使用 SQL 命令
DROP EXTENSION vectors;
- 運行
DROP SCHEMA vectors;
刪除舊架構 - 從
shared_preload_libraries
設置中移除vectors.so
條目 - 重啟 Postgres 資料庫
- 卸載 pgvecto.rs(例如在基於 Debian 的環境中執行
apt-get purge vectors-pg14
,根據需要替換pg14
)。保留pgvector
,因為它提供了vchord
使用的數據類型
如果無法同時安裝 VectorChord 和 pgvecto.rs,可以通過更手動的步驟進行遷移:
遷移步驟(手動)
- 在 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;
- 使用以下 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[];
- 安裝 VectorChord
- 將列更改回適當的向量類型,將
<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);
- 啟動 Immich,讓它使用 VectorChord 創建新的索引
從 pgvector 遷移
遷移步驟
- 確保您安裝的 pgvector 至少是 0.7.0。如果低於此版本,請升級並使用 psql 或其他資料庫客戶端執行 SQL 命令
ALTER EXTENSION vector UPDATE;
- 遵循必要條件安裝 VectorChord
- 如果 Immich 沒有超級使用者許可權,運行 SQL 命令
CREATE EXTENSION vchord CASCADE;
- 移除
DB_VECTOR_EXTENSION=pgvector
環境變數,否則 Immich 將仍然使用 pgvector - 啟動 Immich,讓它使用 VectorChord 創建新的索引
請注意,VectorChord 本身使用 pgvector 類型,因此在完成這些步驟後,您不應該卸載 pgvector。