Self-hosting my photos with Immich

Michael Stapelberg

用 Immich 自托管我的照片

原文由 Michael Stapelberg 发布,订阅该博客

对于我使用的每一项云服务,我都希望在本地保留一份数据副本,以作备份并保持独立性。不幸的是,由于 Google 收紧了 OAuth 授权范围,gphotos-sync 工具在 2025 年 3 月失效了,因此我需要为现有的 Google Photos 寻找替代方案。在本文中,我将介绍我是如何搭建Immich——一款可自托管的照片管理工具的。

成果如下:几张来自NixCon 2025 的(实况)照片:

浏览器中 Immich 的截图

步骤一:硬件

我在自己的 Ryzen 7 迷你主机(ASRock DeskMini X600)上运行 Immich,它在待机状态下功耗不到 10 瓦,却拥有充足的虚拟机资源(64 GB 内存、1 TB 硬盘)。你可以在我 2024 年 7 月的博文中了解更多:

我在这台迷你服务器上安装了Proxmox这一开源虚拟化平台,将其划分为多个虚拟机,当然你也可以直接在任意服务器上安装 Immich。

步骤二:安装 Immich

我创建了一台名为“photos”的虚拟机,分配了 500 GB 硬盘、4 个 CPU 核心和 4 GB 内存。

如果是首次导入,可以分配更多的 CPU 和内存,但日常使用的话这个配置就足够了。

以声明式的方式在该虚拟机上安装了 NixOS,具体方法如这篇博文所述:

随后,我用如下配置启用了 Immich:

services.immich = {
  enable = true;
};

此时 Immich 已在 localhost 上可用,但由于 NixOS 默认开启了防火墙,还无法通过网络访问。我可以开启 services.immich.openFirewall 选项,但我其实只想通过 Tailscale VPN 来访问 Immich,这样就无需开放防火墙端口——取而代之,我使用 tailscale serve 将流量转发到 localhost:2283

photos# tailscale serve --bg http://localhost:2283

由于我已启用了Tailscale 的 MagicDNSTLS 证书自动配置,现在我就可以在电脑、笔记本或手机的浏览器中直接打开https://photos.example.ts.net 了。

步骤二:初始照片导入

起初,我尝试使用官方的 Immich CLI 来导入照片:

% nix run nixpkgs#immich-cli -- login https://photos.example.ts.net secret
% nix run nixpkgs#immich-cli -- upload --recursive /home/michael/lib/photo/gphotos-takeout

不幸的是,上传并不稳定,遇到超时后不得不手动重启了好几次。后来我才意识到,这是因为 Immich 服务器会在后台执行缩略图生成、元数据提取或人脸识别等任务,这些后台任务会拖慢上传速度,甚至导致上传超时失败。

另一个问题是,即使上传完成了,我才发现 Google Photos 的 Takeout 归档会把元数据以单独的 JSON 文件形式保存在原始图片旁边:

Takeout:Google Photos 格式

遗憾的是,immich-cli 并不会处理这些文件。

好在有一款出色的第三方工具 immich-go,它同时解决了这两个问题!它会在上传前暂停后台任务、上传完成后再恢复,效果要好得多,而且它还能尽可能地解析 Google Takeout 归档。

我按如下方式运行了 immich-go,效果非常好:

% immich-go \
  upload \
  from-google-photos \
  --server=https://photos.example.ts.net \
  --api-key=secret \
  ~/Downloads/takeout-*.zip

步骤三:在 iPhone 上安装 Immich 应用

我的新照片主要来自手机,因此我在 iPhone 上安装了 Immich 应用,通过 Tailscale 域名登录到我的 Immich 服务器,并通过右上角的图标开启了新照片的自动备份。

我不太确定这些设置是否完全正确,但看起来相机拍摄的照片一般会归入 Live Photos,而 Recent 应该涵盖了其他文件……?!

如果有人了解确切情况,欢迎发来解释(或链接!),我会更新本文。

我也强烈建议关闭 Immich 的通知,否则每次它在后台上传图片时都会弹出通知。正如一位 Immich 开发者在 Reddit 上确认的那样,后台上传并不需要这些通知也能正常工作。请打开SettingsAppsImmichNotifications 并取消勾选权限复选框:

步骤四:备份

Immich 关于备份的文档中有一些不错的建议。Immich 开发者建议备份 UPLOAD_LOCATION 的全部内容,在 NixOS 上这个路径是 /var/lib/immich。其中 backups 子目录包含 SQL 转储文件,而 uploadlibraryprofile 这三个目录则包含了所有用户上传的数据。

因此,我设置了一个 systemd 定时器,通过 rsync/var/lib/immich 同步到我的电脑上,而我的电脑本身也已纳入3-2-1 备份策略中。

还有哪些不足?

Immich(目前?)还没有照片编辑功能,所以要旋转或裁剪图片时,我会先下载图片,再用GIMP 处理。

要分享图片时,我仍然会上传到 Google Photos(具体取决于分享对象)。

为什么选择 Immich 而不是……?

在自托管图片管理工具领域,目前看起来最有前景的两个选择是 ImmichEnte

在我的圈子里,Immich 似乎更受欢迎,而 Ente 给我的感觉是它的涵盖范围远比我的需求要大:

Ente 是一项提供完全开源、端到端加密平台的服务,让你无需信任服务提供商即可将数据存储在云端。在此平台之上,我们目前已构建了两款应用:Ente Photos(Apple 和 Google Photos 的替代品)和 Ente Auth(已弃用的 Authy 的双因素认证替代品)。

我并不需要端到端加密平台。我在传输层(Tailscale)和磁盘层(LUKS)上已经有了加密,没必要再增加复杂性。

结论

Immich 是一款令人愉悦的应用!它速度很快,总体运行良好。

初次导入很顺畅,但前提是用对工具。理想情况下,官方的 immich-cli 可以得到改进。或者,也可以让 immich-go 成为官方工具。

我觉得在 iPhone 上自动备份的配置太复杂了,这一点也可以改进。

但除了这些最初的小坎坷之外,我没有其他不满。

本文章由 muse-spark-1.2-contributor 进行翻译

评论