使用 Immich 自托管我的照片

Michael Stapelberg 工具

摘要

本指南介绍如何设置 Immich(一个自托管的照片管理工具)以替代 Google Photos,涵盖硬件、在 NixOS 上的安装以及通过 Tailscale 的安全访问。

<p>对于我使用的每一个云服务,我都希望拥有一份本地数据副本以作备份和独立使用。不幸的是,当 Google 限制 OAuth 范围后,<code>gphotos-sync</code> 工具<a href="https://github.com/gilesknap/gphotos-sync-discussion/discussions/1">在 2025 年 3 月停止了工作</a>,因此我需要为现有的 Google Photos 设置寻找替代方案。本文将介绍我是如何设置 <a href="https://immich.app/">Immich</a>(一个可自托管的照片管理器)的。</p> <p>以下是最终结果:来自 <a href="/posts/2025-09-21-nixcon-2025-trip-report/">NixCon 2025</a> 的几张(实时)照片:</p> <a href="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-immich-screenshot-featured.jpg"><img srcset="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-immich-screenshot-featured_hu_6928fc2a893484f1.jpg 2x,https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-immich-screenshot-featured_hu_7c70567581178dd5.jpg 3x" src="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-immich-screenshot-featured_hu_744c6f048556917c.jpg" alt="Immich 在网页浏览器中的截图" title="Immich 在网页浏览器中的截图" width="600" height="504" style=" border: 1px solid #000; " loading="lazy"></a> <h2 id="step-1-hardware">第一步:硬件</h2> <p>我在我的 <a href="/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/">Ryzen 7 Mini PC (ASRock DeskMini X600)</a> 上运行 Immich,这款电脑闲置功耗低于 10 W,并且拥有充足的虚拟机资源(64 GB 内存、1 TB 磁盘)。你可以在我在 2024 年 7 月发布的博文中了解更多:</p> <div class="postlink"> <div> <a href="https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/"><h3>Ryzen 7 Mini-PC 成为高能效虚拟机主机</h3></a> </div> <div class="summary"> <a href="https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/" style="min-width: 200px; margin-right: 1.5rem; margin-bottom: 1.5rem"><img src="https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/240630-server-featured_hu_6c2736729d115f81.jpg" width="200" height="134"/></a> <p> <a href="https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/"> 当我第一次看到 ASRock DeskMini X600 准系统的评测时,我立刻对用它搭建家庭实验室虚拟机主机产生了兴趣。显然,DeskMini X600 功耗不到 10W,但却支持最新一代 AMD CPU,比如 Ryzen 7 8700G! <span class="readmore"><a href="https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/">阅读更多 →</a></span> </a> </p> </div> </div> <p>我安装了 <a href="https://proxmox.com/en/">Proxmox</a>(一个开源虚拟化平台)来将这台迷你服务器划分为多个虚拟机,当然你也可以直接在任意服务器上安装 Immich。</p> <h2 id="step-2-install-immich">第二步:安装 Immich</h2> <p>我创建了一个虚拟机(名为“photos”),分配了 500 GB 磁盘空间、4 个 CPU 核心和 4 GB 内存。</p> <p>对于初始导入,你可以分配更多 CPU 和内存,但正常使用时这些配置已经足够。</p> <p>我按照这篇博文中的描述,<a href="/posts/2025-06-01-nixos-installation-declarative/">(声明式地)在该虚拟机上安装了 NixOS</a>:</p> <div class="postlink"> <div> <a href="https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/"><h3>我喜欢的 NixOS 安装方式(声明式)</h3></a> </div> <div class="summary"> <a href="https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/" style="min-width: 200px; margin-right: 1.5rem; margin-bottom: 1.5rem"><img src="https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/nix-snowflake-rainbow-featured_hu_2c3edabdd6900fed.png" width="200" height="200"/></a> <p> <a href="https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/"> 在我搭建某台网络存储 PC 时,我正在寻找 Flatcar Container Linux 的替代品,于是(在中断近 10 年后)再次尝试了 NixOS。安装 NixOS 有多种方式,本文将介绍我喜欢的安装方式:通过网络进行完全声明式的安装,适用于物理硬件或虚拟机。 <span class="readmore"><a href="https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/">阅读更多 →</a></span> </a> </p> </div> </div> <p>之后,我使用以下精确配置启用了 Immich:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nix" data-lang="nix"><span style="display:flex;"><span>services<span style="color:#666">.</span>immich <span style="color:#666">=</span> { </span></span><span style="display:flex;"><span> enable <span style="color:#666">=</span> <span style="color:#60add5">true</span>; </span></span><span style="display:flex;"><span>}; </span></span></code></pre></div><p>此时,Immich 仅在 <code>localhost</code> 上可用,但无法通过网络访问,因为 NixOS 默认启用了防火墙。我可以启用 <code>services.immich.openFirewall</code> 选项,但实际上我希望 Immich 仅通过我的 Tailscale VPN 可用,因此无需开放防火墙访问——相反,我使用 <code>tailscale serve</code> 将流量转发到 <code>localhost:2283</code>:</p> <pre tabindex="0"><code>photos# tailscale serve --bg http://localhost:2283 </code></pre><p>由于我已启用 <a href="https://tailscale.com/kb/1081/magicdns">Tailscale 的 MagicDNS</a> 和 <a href="https://tailscale.com/kb/1153/enabling-https">TLS 证书自动配置</a>,现在我可以在 PC、笔记本电脑或手机的浏览器中打开 <a href="https://photos.example.ts.net">https://photos.example.ts.net</a>。</p> <h2 id="step-2-initial-photos-import">第二步:初始照片导入</h2> <p>起初,我尝试使用官方 Immich CLI 导入照片:</p> <pre tabindex="0"><code>% 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 </code></pre><p>遗憾的是,上传过程并不稳定,在遇到超时后需要手动重新启动几次。后来我意识到这是因为 Immich 服务器正在运行后台任务(如缩略图创建、元数据提取或人脸检测),这些后台任务会拖慢上传速度,以至于上传可能因超时而失败。</p> <p>另一个问题是,即使上传完成,我发现 Google Takeout 的 Google Photos 存档会在原始图片文件旁边包含单独的 JSON 元数据文件:</p> <a href="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-google-photos-takeout.jpg"><img srcset="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-google-photos-takeout_hu_c2ca8fd1cf90122a.jpg 2x,https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-google-photos-takeout_hu_7169d5fe6b33d18d.jpg 3x" src="https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-google-photos-takeout_hu_8ac7b224e95d405d.jpg" alt="Takeout:Google Photos 格式" title="Takeout:Google Photos 格式" width="600" height="720" style=" border: 1px solid #000; " loading="lazy"></a> <p>不幸的是,<code>immich-cli</code> 并没有考虑这些文件。</p> <p>幸运的是,有一个很棒的第三方工具叫 <a
查看原文
查看缓存全文

缓存时间: 2026/05/16 03:32

# 用 Immich 自托管我的照片 来源:https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/ 目录- 第一步:硬件 (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#step-1-hardware) - 第二步:安装 Immich (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#step-2-install-immich) - 第二步:初始照片导入 (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#step-2-initial-photos-import) - 第三步:安装 Immich iPhone 应用 (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#step-3-install-the-immich-iphone-app) - 第四步:备份 (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#step-4-backup) - 缺少什么? (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#whats-missing) - 为什么选择 Immich 而不是……? (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#why-immich-instead-of) - 结论 (https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/#conclusion) 对于我使用的每一个云服务,我都希望拥有一份本地数据副本,用于备份和保持独立性。不幸的是,`gphotos-sync` 工具在 2025 年 3 月停止工作(https://github.com/gilesknap/gphotos-sync-discussion/discussions/1),因为谷歌限制了 OAuth 作用域,所以我需要为现有的 Google Photos 设置寻找替代方案。在这篇文章中,我将介绍如何搭建 Immich(https://immich.app/),一个可自托管的照片管理器。 以下是最终效果:几张来自 NixCon 2025(https://michael.stapelberg.ch/posts/2025-09-21-nixcon-2025-trip-report/)的(实时)照片: Immich 在网页浏览器中的截图(https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-immich-screenshot-featured.jpg) ## 第一步:硬件 我在我的 Ryzen 7 Mini PC(ASRock DeskMini X600)上运行 Immich(https://michael.stapelberg.ch/posts/2024-07-02-ryzen-7-mini-pc-low-power-proxmox-hypervisor/),它在空闲时功耗低于 10 瓦,并为虚拟机提供了充足的资源(64 GB 内存,1 TB 磁盘)。你可以在我 2024 年 7 月的博文中了解更多: 我安装了 Proxmox(https://proxmox.com/en/),一个开源虚拟化平台,将这台迷你服务器划分为多个虚拟机,不过你也可以直接将 Immich 安装在任何服务器上。 ## 第二步:安装 Immich 我创建了一台虚拟机(名为 "photos"),配置了 500 GB 磁盘空间、4 个 CPU 核心和 4 GB 内存。 对于初始导入,你可以分配更多 CPU 和内存,但日常使用这些足够了。 我(声明式地)在该虚拟机上安装了 NixOS(https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/),具体方法见这篇博文: 随后,我通过以下精确配置启用了 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(https://tailscale.com/kb/1081/magicdns)和 TLS 证书配置(https://tailscale.com/kb/1153/enabling-https),现在可以在我的 PC、笔记本或手机的浏览器中打开 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 Takeout 存档中的 Google Photos 元数据是以单独的 JSON 文件存放在原始图片文件旁边的: Takeout:Google Photos 格式(https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/2025-11-19-google-photos-takeout.jpg) 遗憾的是,`immich-cli` 并未考虑这些文件。 幸运的是,有一个很棒的第三方工具叫做 immich-go(https://github.com/simulot/immich-go),它同时解决了这两个问题!它会在上传前暂停后台任务,并在上传后重启,运行效果更好,而且它还尽力理解 Google Takeout 存档。 我按如下方式运行 `immich-go`,效果非常好: `` % immich-go \ upload \ from-google-photos \ --server=https://photos.example.ts.net \ --api-key=secret \ ~/Downloads/takeout-*.zip `` ## 第三步:安装 Immich iPhone 应用 我新照片的主要来源是手机,所以我在 iPhone 上安装了 Immich 应用,通过 Tailscale URL 登录到我的 Immich 服务器,并通过右上角的图标启用了新照片的自动备份。 我不完全确定这些设置是否正确,但似乎相机照片通常会进入 Live Photos,而 "最新" 应该覆盖其他文件……? 如果有人知道,请发送解释(或链接!),我会更新这篇文章。 [图片:Immich iPhone 设置界面截图](https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/IMG_5893.PNG) 我还强烈建议禁用 Immich 的通知,因为否则每当它在后台上传图片时你都会收到通知。这些通知对于后台上传并非必需,正如 Immich 开发者 在 Reddit 上确认的(https://www.reddit.com/r/immich/comments/1nnk8i9/comment/nfoffbb/)。打开 *设置* → *应用* → *Immich* → *通知*,并取消勾选权限复选框: [图片:通知设置界面截图](https://michael.stapelberg.ch/posts/2025-11-29-self-hosting-photos-with-immich/IMG_5894.PNG) ## 第四步:备份 Immich 的备份文档(https://docs.immich.app/administration/backup-and-restore)提供了一些很好的建议。Immich 开发者建议备份 `UPLOAD_LOCATION` 的全部内容,在 NixOS 上即 `/var/lib/immich`。`backups` 子目录包含 SQL 转储,而 `upload`、`library` 和 `profile` 这三个目录则包含所有用户上传的数据。 因此,我设置了一个 systemd 定时器,通过 `rsync` 将 `/var/lib/immich` 拷贝到我的 PC 上,这台 PC 已纳入 3-2-1 备份方案(https://www.backblaze.com/blog/the-3-2-1-backup-strategy/)。 ## 缺少什么? Immich(目前?)不包含照片编辑功能,因此要旋转或裁剪图片,我得下载图片并使用 GIMP(https://www.gimp.org/)。 要分享图片时,我仍然会上传到 Google Photos(取决于分享对象是谁)。 ## 为什么选择 Immich 而不是……? 在自托管图片管理工具领域,两个最有前途的选择似乎是 Immich(https://immich.app/)和 Ente(http://ente.io/)。 我的印象是 Immich 在我的人际圈中更受欢迎,而 Ente 给我的感觉是它的范围远比我需要的广泛: > Ente 是一项服务,它提供一个完全开源、端到端加密的平台,让你可以在不需要信任服务提供商的情况下将数据存储在云端。在这个平台之上,我们目前构建了两个应用:Ente Photos(苹果和谷歌相册的替代品)和 Ente Auth(已弃用的 Authy 的双因素认证替代品)。 我不需要端到端加密平台。我已在传输层(Tailscale)和磁盘层(LUKS)实现了加密,不需要更多复杂性。 ## 结论 Immich 是一个令人愉悦的应用!它非常快,总体运行良好。 初始导入很顺畅,但前提是你使用正确的工具。理想情况下,官方的 `immich-cli` 可以改进。或者,也许可以将 `immich-go` 官方化。 我认为在 iPhone 上自动备份的配置太难了,这方面也可以改进。 但除了这些初始的绊脚石之外,我没有任何抱怨。 喜欢这篇文章吗?订阅本博客的 RSS 订阅源(https://michael.stapelberg.ch/feed.xml)以不错过任何新文章! 我从 2005 年开始运营博客,分享知识和经验已超过 20 年!:)

相似文章

将我的 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS

Michael Stapelberg

Michael Stapelberg 详细介绍了他将一台 NAS 从 CoreOS/Flatcar Linux 迁移到 NixOS 的过程,涵盖了从 Docker 容器逐步过渡到原生 NixOS 模块的步骤,并附有实际示例。

我喜欢的 NixOS 声明式安装方式

Michael Stapelberg

一份关于使用 nixos-anywhere 等工具通过网络声明式安装 NixOS 的指南,重点强调在版本控制下管理配置文件。

在树莓派上托管网站

Hacker News Top

技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。

使用Nix的开发环境:四个快速示例

Michael Stapelberg

本教程演示了使用Nix设置开发环境的四种方法,包括交互式一次性使用、配置文件以及密封的Nix Flakes,并以GoCV和OpenCV为例。

Open WebUI 的更简单的自托管替代方案

Reddit r/LocalLLaMA

OvertChat 是 Open WebUI 的一个更简单、精致的自托管替代方案,适用于本地 AI 模型,具有单一的 Docker Compose 设置、内置网页搜索和 Kokoro TTS,全部采用 MIT 许可证。