跳转到主要内容

使用已有的 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。迁移主要有两种方法。

最简单的选择是在迁移期间同时安装两个扩展:

迁移步骤(自动)
  1. 确保仍安装有 pgvecto.rs
  2. 安装 pgvector (>= 0.7.0, < 1.0.0)。最简单的方法是在 Debian/Ubuntu 上添加 PostgreSQL Apt 仓库,然后运行 apt install postgresql-NN-pgvector,其中 NN 为您的 Postgres 版本(例如 16
  3. 安装 VectorChord
  4. 在您的 postgresql.conf 文件中添加 shared_preload_libraries= 'vchord.so, vectors.so',确保同时包含 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. 将列更改回适当的向量类型,用步骤 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);
  1. 启动 Immich 并让其使用 VectorChord 创建新索引

从 pgvector 迁移

迁移步骤
  1. 确保至少安装了 0.7.0 版本的 pgvector。如果版本低于此,请升级并使用 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。