PhotoPrism 与 Immich 哪个更适合搭建照片服务器?
比较 PhotoPrism 与 Immich 的真实内存下限、手机自动备份、地图功能和 VPS 备份命令,了解两者在文件管理与机器学习上的关键差异。
PhotoPrism 与 Immich:简短结论
PhotoPrism 与 Immich 的选择,取决于两者要解决的是不同的问题,而不是同一产品的两个版本。Immich 可以替代 Google Photos:手机应用会自动备份相机胶卷,生成的时间线对离开手机图库的用户来说很熟悉。PhotoPrism 用于整理已有的照片库:它会索引磁盘上的文件目录,读取文件元数据,将照片显示在地图上,并让文件保留在原来的位置。
如果问题是“我的手机存储空间已满,我想停止使用 Google Photos”,请选择 Immich。如果问题是“我的硬盘上有 400 GB 照片,但我无法找到其中的任何照片”,请选择 PhotoPrism。两者都是开源软件,都可以作为 Docker 容器运行在普通 VPS 上,并且都能在不向第三方发送数据的情况下索引和搜索您的照片库。
设计理念的差异,以及它为何决定一切
Immich 管理文件。您将其指向上传位置,手机应用或 Web 上传器将原始文件上传到该位置,Immich 再使用自己的路径和命名方式存储这些文件。数据库保存相册、人脸和搜索信息的真实状态。正因为采用这种设计,手机端体验才更好:服务器始终掌握每个资产的完整状态。
PhotoPrism 读取文件。您挂载一个已由自己管理的 originals 文件夹,PhotoPrism 在其上建立索引。目录树仍归您所有。如果您明天移除 PhotoPrism,照片仍会以相同的名称保存在相同的文件夹中;PhotoPrism 还会在照片旁写入描述其分析结果的 YAML sidecar 文件。
这一个差异解释了后续的大部分区别。Immich 控制数据导入,因此移动端支持更强。PhotoPrism 从不破坏您现有的目录结构,因此更适合整理和管理资料库。对于照片主要存储在手机上的家庭,Immich 是更好的选择。对于存储在磁盘上的档案,PhotoPrism 是更好的选择。
硬件需求:Immich 要求更高
文档中记录的内存最低要求差距很大。对于小型 VPS,这通常是决定性因素。
The data behind this chart
[
{
"label": "Immich",
"min_ram_gb": 6,
"recommended_ram_gb": 8
},
{
"label": "PhotoPrism",
"min_ram_gb": 3,
"recommended_ram_gb": 4
}
]Immich 将 6 GB RAM 列为最低要求,将 8 GB 列为推荐值,并注明只有关闭机器学习后,4 GB 的机器才能运行它。PhotoPrism 要求 3 GB 物理内存和 2 个 CPU 核心,并说明 RAM 大小应与核心数匹配。
这种差距确实存在,原因在于机器学习容器。Immich 在单独的 immich-machine-learning 服务中运行模型。该服务会将 CLIP(对比语言-图像预训练)模型和人脸检测模型加载到内存中。在 2 GB 的主机上,内核会终止该容器。你会看到它以代码 137 退出,这表示 Docker 进行了内存不足终止。PhotoPrism 的 TensorFlow 模型更小。内存不足时,它会降低功能而不是退出:在内存为 1 GB 或更少的机器上,它会禁用 RAW 转换和 TensorFlow,而不是崩溃。
两个项目都要求配置 swap。PhotoPrism 文档明确要求服务器至少有 4 GB swap。在安装任一应用之前先添加 swap。
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hfree -h 现在应输出一行 Swap:,其中显示 4.0Gi。如果输出 0B,则表示 swapon 失败。通常是因为文件系统不支持 fallocate,此时 sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 会作为回退方案。容器内存上限在这里同样重要。在 Docker Compose 中设置内存限制 可以防止某个高内存服务耗尽整台主机的资源。
还有一个要求经常被忽略。Immich 的 Postgres 数据库必须位于正常的 Unix 文件系统中,并具有实际的所有权和权限。它必须使用本地存储,不能使用网络共享。PhotoPrism 对其数据库文件也有相同要求。不要将任一应用的数据库放在已挂载的对象存储上运行。
如何安装每个应用
两种安装方式都需要使用供应商提供的 compose 文件,然后执行一个命令。先设置 Docker Engine 和 Compose 插件,具体步骤请参阅我们的 VPS Docker Compose 指南。
Immich 会在每个版本发布时提供 compose 文件和示例环境文件。
sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env开始前先编辑 .env。UPLOAD_LOCATION 是存放原始照片的位置,DB_PASSWORD 必须使用 A-Za-z0-9 中的字符修改,不能使用其他字符,因为特殊字符会破坏连接字符串。然后启动应用。
docker compose up -d
docker compose psWeb 界面监听端口 2283。通过该页面注册的第一个账户会成为管理员,因此应立即访问该页面并完成注册,不要让未保护的实例暴露在互联网上。
PhotoPrism 提供一个已包含 MariaDB 的 compose 文件。
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yaml打开 compose.yaml,并在首次启动前修改 PHOTOPRISM_ADMIN_PASSWORD。文档对此说明得很明确:应用会使用该文件中的初始密码启动,密码长度至少为 8 个字符,默认值绝不能用于公共服务器。同时将 originals 卷设置为存放照片的文件夹。
docker compose up -d
docker compose logs -f photoprismPhotoPrism 使用用户 admin 监听端口 2342。两个应用都不应直接暴露在互联网上。应在前面配置带 TLS(传输层安全)的反向代理,配置方式与使用 Docker、TLS 和备份自托管 Nextcloud相同。
哪个项目的手机应用更好
这是两个项目差距最大的方面,也是大多数人最终选择 Immich 的原因。
Immich 提供官方 Android 和 iOS 应用。这些应用支持在后台备份相机胶卷,因此新照片无需打开任何应用即可离开手机。该应用需要 HTTPS 端点,因此如果您计划在家外使用它,反向代理不是可选项。
PhotoPrism 没有官方原生应用。它提供渐进式 Web 应用,您可以在浏览器中将其添加到主屏幕。项目文档将 WebDAV(Web 分布式创作与版本控制)列为从手机同步的方式。项目建议使用名为 PhotoSync 的第三方应用,并通过 WebDAV 将其指向 /import/ 或 /originals/ 目录。它可以正常工作,但这是由付费第三方应用完成的功能,而 Immich 可在自己的客户端中直接完成。
如果要求为多个家庭成员自动备份手机照片,结论很明确:Immich。
机器学习实际提供的功能
Immich 使用 CLIP 对您的照片库执行语义搜索,因此“雪地里的红色自行车”这类查询可以找到从未有人标记过的照片。它还支持人脸检测与聚类,以及重复项检测。在 CPU 上为大型导入任务建立索引可能会在后台运行数小时,这是正常现象,不需要 GPU(图形处理器)。
PhotoPrism 使用 TensorFlow 为图像分类并生成标签,检测人脸并将其归类为人物,还会读取位置元数据来构建地点地图。地点地图是用户持续使用它的主要功能:按照拍摄地点建立索引的照片库,为浏览二十年的照片提供了完全不同的方式。免费 Community 版本包含人脸识别功能。付费的 Essentials 和 Plus 会员增加了更丰富的地图图层、更多用户角色和用户管理界面等功能。截至 2026 年 7 月,价格从每月几欧元起。
Immich 完全免费,不设付费层级。PhotoPrism 的核心功能免费,并提供可选的付费扩展。
备份决定您能否保留数据
没有备份的照片服务器只要磁盘发生故障,家庭中的所有照片都可能丢失。两个应用都需要备份两类数据:数据库和文件。
对于 Immich,请从 Postgres 容器导出数据库,并复制上传位置。
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gz然后备份 UPLOAD_LOCATION。存放不可替代数据的文件夹是 upload、library 和 profile。thumbs 和 encoded-video 文件夹可以重新生成,但需要耗费数小时的 CPU 时间。仅有数据库转储无法恢复任何内容,因为其中只保存元数据。
对于 PhotoPrism,索引有专用命令。
docker compose exec photoprism photoprism backup -i -f该命令会在 storage/backup/ 下写入 SQL 转储。然后复制 originals 文件夹和 storage 文件夹。由于 PhotoPrism 还会写入描述每张照片的 YAML 旁车文件,即使索引丢失,也可以仅从文件重新构建索引。对于计划保存数十年的归档,这是一项实际优势。
无论选择哪个应用,都应按计划将这些备份发送到服务器之外,使用加密、去重的 restic 备份传输到远程存储。与图库位于同一磁盘上的备份不是真正的备份。
应该运行哪个
如果您的照片主要在手机上,或者有多个人需要备份相机胶卷,并且服务器可提供 6 GB 或更多 RAM,请运行 Immich。它是目前最接近可自行托管的 Google Photos 的方案,重点在于移动端体验。我们的 Immich 分步安装指南详细介绍了内存不足导致进程被终止的问题和升级陷阱。
如果您已经在磁盘上保存了照片存档,重视地图、元数据和保留自己的文件夹结构,或者 VPS 只有 4 GB RAM,且您更希望使用正常运行的图库而不是频繁交换内存的图库,请运行 PhotoPrism。它更适合整理照片,对小型硬件的负载也更低。
同时运行两者也很合理。Immich 负责每天从手机导入照片。您可以每年将需要保留的照片整理到存档中,再让 PhotoPrism 为其建立索引。两者不会冲突,因为 PhotoPrism 读取文件夹,而 Immich 使用自己的存储。
FAQ
PhotoPrism 和 Immich 可以共用同一个照片文件夹吗?
不建议双向安全地共用。PhotoPrism 读取 originals 文件夹,并在图像旁写入 YAML 伴随文件;Immich 则预期独占其上传位置中的内容。您可以将 PhotoPrism 指向 Immich 的 library 文件夹的只读副本来浏览照片,但不要让两个应用管理同一组文件,因为 Immich 在建立索引时,其存储模板可能会在 PhotoPrism 使用这些文件期间移动或重命名资源。
Immich 是否足够稳定,可以作为照片的唯一副本存储?
任何自托管应用都不应保存某个数据的唯一副本。Immich 经常发布包含破坏性变更的版本,而不谨慎的 docker compose pull 可能导致数据库无法启动。因此,请固定版本,并在升级前阅读发行说明。将原始文件备份到服务器之外,风险就会很小。
为什么 Immich 机器学习容器会不断重启?
因为它使用了过多内存而被终止。运行 docker compose ps,查找机器学习服务是否以代码 137 退出。代码 137 表示内核的 out of memory killer 终止了进程。您可以添加 swap,或为容器设置内存限制,使其受到限流而不是被终止;也可以在 4 GB 机器上完全禁用机器学习。禁用后搜索将无法工作,但 Immich 的其余功能运行正常。
PhotoPrism 是否需要 MariaDB,还是使用 SQLite 也可以?
SQLite 可以正常工作,适合个人图库,但 PhotoPrism 使用 SQLite 时会将自身限制为 4 个 worker。文档建议切换到 MariaDB,因为 MariaDB 能更好地处理高并发。项目发布的 compose 文件已经包含 MariaDB,因此推荐方案也是默认方案。
应在图库大小之外预留多少磁盘空间?
对于任一应用,都应在原始文件大小基础上额外增加 10 到 20 percent。这些空间用于生成的缩略图和转码后的视频预览。一个 200 GB 的图库大约需要 300 GB 的卷,以便为数据库、本地备份副本和后续增长留出空间。