Immich:自建照片视频库

使用 Pigsty 自建 Google Photos 开源替代 Immich,并将元数据、向量检索、备份与入口交给 Pigsty 管理。

Immich 是高性能自托管照片与视频管理应用,也是最流行的 Google Photos 开源替代品之一。 它提供 Web 与移动端上传、相册共享、时间线、地图、EXIF、RAW、LivePhoto、语义搜索、人脸识别与自动备份等能力,采用 AGPL-3.0 许可证。

Pigsty 的 app/immich 模板使用 Docker Compose 拉起 Immich 应用层,并使用 Pigsty 托管的 PostgreSQL 保存元数据。 当前模板按 Immich v3 组织,默认使用 VectorChord 作为相似图片、智能搜索与人脸检索的向量扩展。

相比 Immich 官方的单机 Compose 模板,这里的关键差异是:PostgreSQL 不再跑在应用容器里,而是交给 Pigsty 管理,从而获得监控、备份、PITR、扩展管理与高可用接入能力。


快速开始

Immich 建议至少 2C / 6GB 内存,流畅使用建议 4C / 8GB 内存;v3 的 amd64 机器学习镜像需要 x86-64-v2 指令集。生产环境建议使用 Linux 与本地 SSD。

在运行 兼容操作系统 的全新 Linux x86 / ARM 服务器上执行:

curl -fsSL https://repo.pigsty.cc/get | bash; cd ~/pigsty
./bootstrap
./configure -c app/immich
vi pigsty.yml              # 必改:密码、域名、媒体文件路径

./deploy.yml               # 安装 Pigsty 与 PostgreSQL
./docker.yml               # 安装 Docker 和 Compose
./app.yml                  # 安装 Immich

默认入口:

http://photo.pigsty
http://10.10.10.10:2283

如果使用 photo.pigsty,请在浏览器所在主机添加 hosts 解析,或将模板中的域名替换为真实域名。


模板结构

conf/app/immich.yml 定义了单节点 Immich 自建模板。默认拓扑包括:

  • immich:Immich Server、Machine Learning 与本地 Valkey/Redis 容器所在节点。
  • pg-immich:Pigsty 托管的 PostgreSQL 数据库集群。
  • infra:Nginx 入口、Grafana、VictoriaMetrics 等基础设施。
  • etcd:Patroni 所需的分布式配置存储。

应用容器包括:

  • immich-server:API、Web UI 与后台任务,默认监听宿主机 2283 端口。
  • immich-machine-learning:CLIP 与人脸识别模型推理。
  • redis:本地 Valkey 队列与缓存。

模板不会启动 Immich 上游 Compose 中的 PostgreSQL 容器;数据库由 Pigsty 通过 DB_URL 提供。


数据存储策略

Immich 的状态被拆成三层,请分别管理:

  • 媒体文件:原图、原视频、缩略图、转码视频、头像与上传队列,保存在 UPLOAD_LOCATION 对应的宿主机目录。
  • PostgreSQL:保存用户、相册、资产、EXIF、文件路径、任务状态、人物、人脸与智能搜索向量等元数据。
  • Valkey/Redis:保存队列、缓存与运行时状态,不应当作为权威数据源。

照片和视频本体不会写入 PostgreSQL。反过来,Immich 也不会把媒体目录当成唯一真相重新扫描出完整业务状态;数据库里保存的路径与元数据同样关键。

因此,一个可恢复的 Immich 备份必须同时包含 PostgreSQL 与媒体目录。只备份数据库会丢照片,只备份文件也无法可靠恢复相册、用户、分享、人脸与检索状态。


PostgreSQL

默认数据库连接与向量扩展:

DB_URL=postgresql://dbuser_immich:DBUser.Immich@10.10.10.10:5432/immich
DB_VECTOR_EXTENSION=vectorchord

模板会在 pg-immich 集群安装扩展包并创建数据库扩展:

CREATE EXTENSION vchord CASCADE;
CREATE EXTENSION earthdistance CASCADE;

vchord 需要通过 pg_libs 加入 shared_preload_libraries,模板已经配置:

pg_extensions: [ pgvector, vchord ]
pg_libs: 'vchord.so, pg_stat_statements, auto_explain'

这里默认使用直连 PostgreSQL 的 5432 端口。不要把 Immich 指向事务池模式的 PgBouncer;迁移、索引和预备语句场景下,直连 PostgreSQL 或 session pooling 更稳妥。

Immich 官方仍然把预置 PostgreSQL 视为高级用法,但同时明确这种模式可以解锁 pgBackRest / Barman 这类 WAL 流式备份。Pigsty 模板选择无超级用户路径:由 Pigsty 预先创建数据库、用户和扩展,Immich 业务用户不需要 PostgreSQL 超级用户权限。


媒体文件

Immich 上传的照片、视频、缩略图、转码文件和头像保存在宿主机目录,也就是模板中的 UPLOAD_LOCATION

/data/immich/library

PostgreSQL 只保存元数据和文件路径。媒体文件不在 PostgreSQL 中,也不会被 pgBackRest 自动保护。

生产环境至少需要备份两层数据:

  • PostgreSQL:使用 Pigsty pgBackRest / PITR。
  • 媒体文件:对 /data/immich/library 做完整文件级备份,覆盖其中的原图、上传队列、缩略图、转码文件、头像与其他生成资产。

如果需要更一致的组合备份,先停止 immich-server,再同时备份数据库和媒体目录。如果业务不能停止,则建议先备份数据库,再备份文件系统。


镜像与网络

默认镜像来自 GHCR 与 Docker Hub:

docker pull ghcr.io/immich-app/immich-server:v3
docker pull ghcr.io/immich-app/immich-machine-learning:v3
docker pull docker.io/valkey/valkey:9

如果拉取镜像较慢或受限,请在 pigsty.yml 中配置 proxy_envdocker_registry_mirrors


运维命令

安装后进入 /opt/immich

cd /opt/immich

make up       # 启动 Immich
make logs     # 跟随日志
make info     # 查看容器状态
make pull     # 拉取镜像
make restart  # 重启容器
make down     # 停止并移除容器

如需固定具体 Immich 版本,在 pigsty.yml 中设置:

IMMICH_VERSION: v3.0.1

升级 Immich 或 VectorChord 前,请先阅读上游 release notes。VectorChord 包升级后,通常还需要在 immich 数据库中更新扩展并重建相关索引:

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

大型图库重建索引可能耗时较长,执行前请确认已有备份和维护窗口。


参考


最后修改 2026-07-09: update app docs (66e04f5)