使用已有的 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 仓库,然后运行 apt install postgresql-NN-pgvector
,其中 NN
是您的 Postgres 版本(例如 16
)。
您需要按照其 安装指南 将 VectorChord 安装到您的 Postgres 实例中。安装后,在您的 postgresql.conf
文件中添加 shared_preload_libraries = 'vchord.so'
。如果您已设置了一些 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 仓库,然后运行apt install postgresql-NN-pgvector
,其中NN
为您的 Postgres 版本(例如16
) - 安装 VectorChord
- 在您的
postgresql.conf
文件中添加shared_preload_libraries= 'vchord.so, vectors.so'
,确保同时包含vchord.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
- 将列更改回适当的向量类型,用步骤 1 中的数字替换
<number>
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 迁移
迁移步骤
- 确保至少安装了 0.7.0 版本的 pgvector。如果版本低于此,请升级并使用 psql 或您选择的数据库客户端运行 SQL 命令
ALTER EXTENSION vector UPDATE;
- 按照先决条件安装 VectorChord
- 如果 Immich 没有超级用户权限,运行 SQL 命令
CREATE EXTENSION vchord CASCADE;
- 移除
DB_VECTOR_EXTENSION=pgvector
环境变量,因为设置它会使 Immich 继续使用 pgvector - 启动 Immich 并让其使用 VectorChord 创建新索引
请注意,VectorChord 本身使用 pgvector 类型,因此在完成这些步骤后不应卸载 pgvector。