用 Immich 自托管我的照片
对我使用的每一个云服务,我都希望有一份数据的本地副本,用于备份和保持独立性。遗憾的是,gphotos-sync 工具在 2025 年 3 月停止工作,因为 Google 限制了 OAuth scopes,所以我需要为现有的 Google Photos 设置寻找替代方案。在这篇文章中,我将介绍我如何搭建 Immich——一个可自托管(self-hosting,自托管)的照片管理器。
以下是最终效果:几张来自 NixCon 2025 的(实况)照片:

第 1 步:硬件
我在我的 Ryzen 7 迷你主机(ASRock DeskMini X600)上运行 Immich,它待机功耗不到 10 W,并且有充足的资源供虚拟机使用(64 GB 内存、1 TB 磁盘)。你可以在 2024 年 7 月的这篇博客文章中了解更多:
我安装了 Proxmox——一个开源虚拟化平台——来把这个迷你服务器划分成多个虚拟机,不过当然你也可以直接在任何服务器上安装 Immich。
第 2 步:安装 Immich
我创建了一个名为“photos”的虚拟机,配置为 500 GB 磁盘空间、4 个 CPU 核心和 4 GB 内存。
初次导入时可以分配更多的 CPU 和内存,但对于日常使用来说,这样的配置已经足够了。
我按照这篇博客文章中的描述,在该虚拟机上以声明式方式安装了 NixOS:
之后,我用下面这段配置启用了 Immich:
services.immich = {
enable = true;
};此时,Immich 可以在 localhost 上访问,但无法通过网络访问,因为 NixOS 默认开启了防火墙。我可以启用 services.immich.openFirewall 选项,但实际上我希望 Immich 只能通过我的 Tailscale VPN 访问,这样就无需开放防火墙端口——而是用 tailscale serve 把流量转发到 localhost:2283:
photos# tailscale serve --bg http://localhost:2283由于我启用了 Tailscale 的 MagicDNS 和 TLS 证书自动签发功能,现在我可以在 PC、笔记本或手机的浏览器中打开 https://photos.example.ts.net 了。
第 2 步:初次照片导入
起初,我尝试用官方的 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 Takeout 归档会在原始图片文件旁边以单独的 JSON 文件存放元数据:

遗憾的是,immich-cli 并不会处理这些文件。
幸运的是,有一个很棒的第三方工具叫 immich-go(immich-go),它同时解决了这两个问题!它会在上传前暂停后台任务并在上传后恢复,效果要好得多,而且它会尽力解析 Google Takeout 归档。
我按如下方式运行了 immich-go,效果非常好:
% immich-go \
upload \
from-google-photos \
--server=https://photos.example.ts.net \
--api-key=secret \
~/Downloads/takeout-*.zip第 3 步:安装 Immich iPhone 应用
我新照片的主要来源是手机,所以我在 iPhone 上安装了 Immich 应用,通过它的 Tailscale URL 登录了我的 Immich 服务器,并通过右上角的图标开启了新照片的自动备份。
我不完全确定这些设置是否正确,但看起来相机拍摄的照片一般会进入“实况照片”,而“最近项目”应该涵盖其他文件……?!
如果有人知道答案,请发给我一个解释(或链接!),我会更新这篇文章。
我还强烈建议关闭 Immich 的通知,否则每当它在后台上传图片时你都会收到通知。这些通知并不是后台上传正常工作所必需的,Immich 的一位开发者在 Reddit 上已确认这一点。打开“设置”→“App”→“Immich”→“通知”,然后取消勾选权限复选框:
第 4 步:备份
Immich 关于备份的文档中有一些不错的建议。Immich 开发者建议备份 UPLOAD_LOCATION 的全部内容,在 NixOS 上该目录是 /var/lib/immich。其中 backups 子目录包含 SQL 转储文件,而 upload、library 和 profile 这三个目录则包含所有用户上传的数据。
因此,我设置了一个 systemd 定时器来运行 rsync,把 /var/lib/immich 复制到我的 PC 上,而我的 PC 已纳入一套 3-2-1 备份方案。
还缺什么?
Immich(目前?)没有照片编辑功能,所以要旋转或裁剪图片时,我会下载图片然后用 GIMP 处理。
要分享图片时,我仍然会把它们上传到 Google Photos(取决于分享对象是谁)。
为什么选 Immich 而不是……?
在自托管图片管理工具这个领域,最有希望的两个选择似乎是 Immich 和 Ente。
我的印象是 Immich 在我所在的圈子里更流行,而 Ente 给我的感觉是其范围远超我的需求:
Ente 是一个提供完全开源、端到端加密平台的服务,让你可以把数据存储在云端而无需信任服务提供商。在这个平台之上,我们目前构建了两款应用:Ente Photos(Apple 和 Google Photos 的替代品)和 Ente Auth(已被弃用的 Authy 的双因素认证替代品)。
我不需要端到端加密平台。我在传输层(Tailscale)和磁盘层(LUKS)都已经有加密了,没必要再增加复杂度。
结论
Immich 是一款令人愉悦的应用!它非常快,总体上运行良好。
初次导入很顺畅,但前提是你得用对工具。理想情况下,官方的 immich-cli 应该得到改进。或者也许可以让 immich-go 成为官方工具。
我觉得在 iPhone 上配置自动备份太困难了,这一点也可以改进。
但除了这些初期的磕磕绊绊之外,我没有任何抱怨。
随机一篇博客