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

Michael Stapelberg 工具

摘要

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

<p>在本文中,我想展示如何将现有的 Linux 服务器迁移到 NixOS — 在我的例子中,是我 NAS PC 上的 CoreOS/Flatcar Linux 安装。</p> <p>我将详细展示之前的 CoreOS 设置是什么样的(大量启动 Docker 容器的 systemd 单元),如何将其迁移到一个中间状态(在 NixOS 上使用 Docker)以使系统先运行起来,最后如何将所有单元从 Docker 逐步迁移到原生的 NixOS 模块。</p> <p>如果你还没听说过 NixOS,我建议你阅读 <a href="https://nixos.org">NixOS 网站首页</a>,了解 NixOS 是什么以及它能实现什么。</p> <p>这篇博文的目标读者是对尝试将 NixOS 用于 NAS 场景感兴趣的人,他们喜欢通过示例来理解如何配置系统。</p> <p>你可以按照我的博文<a href="/posts/2025-06-01-nixos-installation-declarative/">《我如何(声明式地)安装 NixOS》</a>中的步骤来应用这些示例,然后浏览你感兴趣的章节。如果你更想看完整配置,<a href="#conclusion">直接跳到结论</a>。</p> <a href="https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/IMG_5563.jpg"><img srcset="https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/IMG_5563_hu_90f92def47078a68.jpg 2x,https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/IMG_5563_hu_fbda205f2b2f2fa9.jpg 3x" src="https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/IMG_5563_hu_dfffd317a819e211.jpg" alt="2023年组装的PC NAS" title="2023年组装的PC NAS" width="600" height="479" style=" border: 1px solid #000; " loading="lazy"></a> <h2 id="history">背景/历史</h2> <p>在过去的十年中,我尝试了多种不同的操作系统来满足我的 NAS 需求。以下是两套 NAS 系统 storage2 和 storage3 的概览:</p> <table> <thead> <tr> <th>年份</th> <th>storage2</th> <th>storage3</th> <th>详情(博文)</th> </tr> </thead> <tbody> <tr> <td>2013</td> <td>Debian on qnap</td> <td>Debian on qnap</td> <td><a href="/posts/2014-01-28-qnap_ts119_wol/">在 qnap TS-119P2+ 上使用 Debian 实现 Wake-On-LAN</a></td> </tr> <tr> <td>2016</td> <td>CoreOS on PC</td> <td>CoreOS on PC</td> <td><a href="/posts/2016-11-21-gigabit-nas-coreos/">千兆 NAS(运行 CoreOS)</a></td> </tr> <tr> <td>2023</td> <td>CoreOS on PC</td> <td>Ubuntu+ZFS on PC</td> <td><a href="/posts/2023-10-25-my-all-flash-zfs-network-storage-build/">我的全闪存 ZFS NAS 构建</a></td> </tr> <tr> <td>2025</td> <td>NixOS on PC</td> <td>Ubuntu+ZFS on PC</td> <td>→ 你在这里 ←</td> </tr> <tr> <td>?</td> <td>NixOS on PC</td> <td>NixOS+ZFS on PC</td> <td>将更多 PC 转换为 NixOS 似乎不可避免 ;)</td> </tr> </tbody> </table> <h2 id="software-requirements">我的 NAS 软件需求</h2> <ul> <li>(本文仅涉及软件!关于我的使用模式和对硬件选型的需求,请参阅 <a href="/posts/2023-10-25-my-all-flash-zfs-network-storage-build/#design-goals">2023年《我的全闪存 ZFS NAS 构建》中的“设计目标”</a>。)</li> <li><strong>远程管理:</strong> 我非常喜欢将网络存储的配置进行版本控制并在我主 PC 上管理的模式。一个很好的特性是,我可以在几分钟内通过重新安装 NAS 来恢复对备份设置的访问。<behavior-explanation>“I can regain access to my backup setup by re-installing my NAS from my PC within minutes.” 翻译为“我可以在几分钟内通过从我的 PC 重新安装 NAS 来恢复对备份设置的访问。”</behavior-explanation></li> <li><strong>自动更新,易于回滚:</strong> 手动更新所有安装并不是我喜欢的做法。因此,自动更新是必须的 — 但当更新出错时,快速简便的恢复路径也是必须的。</li> </ul> <p>CoreOS/Flatcar 通过 A/B 更新方案实现这一点(更新失败?启动旧分区),而 NixOS 通过其“代”的概念实现,更加精细。</p> <h2 id="why-migrate">为什么从 CoreOS/Flatcar 迁移到 NixOS?</h2> <p>当我开始使用 CoreOS 时,Docker 还是相当新的技术。我喜欢使用 Docker 容器可以统一地管理服务 — 最终,它们都暴露某种端口(通过 HTTP、Postgres 等通信),所以你可以在稳定的操作系统上运行更近期的软件版本,或者在更新破坏某些东西时使用旧版本。</p> <p>十年后,Docker 已经成为成熟的技术。如今人们已经理所当然地接受了容器方法的各种好处。</p> <p>那么,以下是我对 Flatcar Linux 不再满意的原因列表。</p> <h4 id="cloud-init">R1. cloud-init 已弃用</h4> <p><a href="https://github.com/coreos/coreos-cloudinit">CoreOS cloud-init</a> 项目在某个时候被弃用,转而使用 <a href="https://github.com/coreos/ignition">Ignition</a>,后者显然更强大,但作为爱好者入门也更繁琐。据我所知,我必须将配置托管在某个 URL 上,然后通过内核参数提供。旧的方式只是复制一个文件似乎不再受支持。</p> <p>Ignition 在其他方面似乎也不太方便:不再支持 YAML,只支持 JSON,而我不喜欢手写 JSON。另外,格式看起来<a href="https://coreos.github.io/ignition/migrating-configs/">变化较大</a>。</p> <p>结果是,我从未从 cloud-init 迁移到 Ignition,依赖一个早已弃用的方式来使用你选择的操作系统是不好的。</p> <h4 id="container-bitrot">R2. 容器退化</h4> <p>在某个时候,我审查了 Docker Hub 上所有的容器,发现大多数都相当过时。有一段时间,Docker Hub 提供基于从 GitHub 获取的 <code>Dockerfile</code> 的自动构建。然而,自动构建现在需要订阅,我不会为了使用自己的计算机而接受订阅。</p> <h4 id="r3-dependency-on-a-central-service">R3. 对中心服务的依赖</h4> <p>如果 Docker 在某个时候停止运营 Docker Hub,我将无法将软件部署到我的 NAS。这并非一个非常假设性的担忧:2023 年,Docker Hub <a href="https://news.ycombinator.com/item?id=35154025">宣布终止免费层上的组织</a>,然后在社区反弹后退回了决定。</p> <p>谁知道他们还能向像我这样的爱好者提供免费服务多久。</p> <h4 id="no-immich">R4. 无法在 Flatcar 上尝试 Immich</h4> <p>最后一根稻草是当我注意到我无法在我的 NAS 系统上尝试 Immich 时!像 Immich 这样的现代 Web 应用需要多个 Docker 容器(用于 Postgres、Redis 等),因此只提供 <a href="https://immich.app/docs/install/docker-compose">Docker Compose</a> 作为受支持的安装方式。</p> <p>不幸的是,Flatcar <a href="https://github.com/flatcar/Flatcar/issues/894">不包含 Docker Compose</a>。</p> <p>我没有心情持续地为非 Docker Compose 系统重新打包 Immich,所以我决定一个既不能直接运行像 Immich 这样的软件、甚至不能运行 Docker Compose 的系统,已经不能满足我的需求了。</p> <h4 id="reason-summary">原因总结</h4> <p>基于以上所有原因,我将不得不设置自动容器构建、运行自己的中心注册表,并且仍然无法运行像 Immich 这样的知名开源软件。于是,我决定再次尝试 NixOS(时隔10年),因为它似乎是当下最流行的声明式解决方案,并且
查看原文
查看缓存全文

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

# 将 NAS 从 CoreOS/Flatcar Linux 迁移至 NixOS 来源:https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/ 目录- 背景/历史 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#history) - 我的 NAS 软件需求 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#software-requirements) - 为什么从 CoreOS/Flatcar 迁移到 NixOS? (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#why-migrate) - 在虚拟机中原型验证 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#vm-prototyping) - 迁移 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#migrating)- M1\. 安装 NixOS (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#m1-install-nixos) - M2\. 设置远程磁盘解锁 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#m2-set-up-remote-disk-unlock) - M3\. 配置 Samba 实现访问 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#m3-set-up-samba-for-access) - M4\. 配置 SSH/rsync 实现备份 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#m4-set-up-sshrsync-for-backups) - 锦上添花 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#nice-to-haves)- N1\. Prometheus Node Exporter (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#prometheus-node-exporter) - N2\. 可靠挂载 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#reliable-mount) - N3\. nginx\-healthz (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#nginx-healthz) - N4\. NixOS Jellyfin (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#jellyfin) - N5\. NixOS samba (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#samba-nixos) - N6\. NixOS rrsync (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#rrsync-nixos) - N7\. sync\.pl 脚本 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#syncpl-nixos) - N8\. 共享配置 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#flakes) - N9\. 尝试 Immich! (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#immich-nixos) - 结论 (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#conclusion) 本文将展示如何将现有 Linux 服务器迁移至 NixOS —— 就以我网络附加存储 (NAS) 电脑上的 CoreOS/Flatcar Linux 系统为例。 我将详细展示之前的 CoreOS 配置是怎样的(大量 systemd unit 启动 Docker 容器),如何将其迁移至中间状态(在 NixOS 上使用 Docker)以快速启动,以及最终如何逐个将所有 Docker unit 迁移至原生 NixOS 模块。 如果你还未听说过 NixOS,建议先阅读 [NixOS 网站首页](https://nixos.org/) 了解 NixOS 是什么以及它能实现哪些功能。 这篇博文的目标读者是对 NixOS 感兴趣、想将其用于 NAS 场景的人,他们喜欢通过示例来理解如何配置系统。 你可以先参考我的博文《[我如何(声明式地)安装 NixOS](https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/)》,然后按你感兴趣的章节逐步实践。如果你想直接看完整配置,可以[跳到结论部分](https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/#conclusion)。 2023 年组装的 PC NAS (https://michael.stapelberg.ch/posts/2025-07-13-nixos-nas-network-storage-config/IMG_5563.jpg) ## 背景/历史 过去十年中,我为 NAS 需求使用了多种不同操作系统。以下是两个 NAS 系统 storage2 和 storage3 的概况: | 年份 | storage2 | storage3 | 详情(博客文章) | |------|----------|----------|------------------| | 2013 | Debian on qnap | Debian on qnap | [使用 Debian 在 qnap TS-119P2+ 上实现 Wake-On-LAN](https://michael.stapelberg.ch/posts/2014-01-28-qnap_ts119_wol/) | | 2016 | CoreOS on PC | CoreOS on PC | [千兆 NAS(运行 CoreOS)](https://michael.stapelberg.ch/posts/2016-11-21-gigabit-nas-coreos/) | | 2023 | CoreOS on PC | Ubuntu+ZFS on PC | [我的全闪 ZFS NAS 构建](https://michael.stapelberg.ch/posts/2023-10-25-my-all-flash-zfs-network-storage-build/) | | 2025 | **NixOS on PC** | Ubuntu+ZFS on PC | → 你在这里 ← | | ? | NixOS on PC | NixOS+ZFS on PC | 更多 PC 迁移至 NixOS 似乎不可避免 ;) | ## 我的 NAS 软件需求 - (本文仅涉及软件!关于我的使用模式和硬件选型需求,请参见《[我的全闪 ZFS NAS 构建](https://michael.stapelberg.ch/posts/2023-10-25-my-all-flash-zfs-network-storage-build/#design-goals)》中的“设计目标”部分。) - **远程管理:** 我非常喜欢将网络存储配置版本控制并托管在主 PC 上的模式。这样,如果我的 NAS 需要重装,我可以在几分钟内从 PC 重新部署配置,恢复对备份系统的访问。 - **自动更新,且易于回滚:** 手动更新所有安装既耗时又无趣,因此自动更新是必须的。但更新出错时,快速简单的恢复路径同样不可或缺。 - CoreOS/Flatcar 通过 A/B 分区更新方案实现(更新失败?启动旧分区),而 NixOS 通过“世代”(generation)的概念实现(更新失败?选择旧世代),粒度更细。 ## 为什么从 CoreOS/Flatcar 迁移到 NixOS? 我开始使用 CoreOS 时,Docker 还是相当新的技术。我喜欢用 Docker 容器来统一管理服务——最终它们都暴露某个端口(HTTP、Postgres 或其他协议),这样既可以在稳定的操作系统上运行更新版本的软件,也可以在更新出问题时回退到旧版本。 十年后,Docker 已经是成熟技术。如今人们理所当然地享受着容器方法的各种好处。 以下是我对 Flatcar Linux 不再满意的几个原因。 #### R1\. cloud-init 已废弃 CoreOS 的 [cloud-init](https://github.com/coreos/coreos-cloudinit) 项目后来被 [Ignition](https://github.com/coreos/ignition) 取代。Ignition 功能更强大,但对于业余爱好者来说起步也更麻烦。据我所知,我必须将配置托管在某个 URL 上,然后通过内核参数提供。旧版直接复制文件的方式似乎已不再支持。 Ignition 在其他方面也不够方便:不再支持 YAML,仅支持 JSON,而我不喜欢手写 JSON。此外,其格式似乎[变化较大](https://coreos.github.io/ignition/migrating-configs/)。 因此,我从未从 cloud-init 切换到 Ignition,而长期依赖一个早已废弃的方式使用你选择的操作系统并不好。 #### R2\. 容器腐化 某次我审查了 Docker Hub 上所有容器,发现大部分都相当过时。Docker Hub 曾一度支持基于 GitHub 上 `Dockerfile` 的自动构建。然而,自动构建现在需要订阅,而我不会仅仅为了使用自己的电脑而接受订阅。 #### R3\. 依赖中心化服务 如果 Docker 某天停止运营 Docker Hub,我将无法向 NAS 部署软件。这并非假设性担忧:2023 年,Docker Hub 曾宣布 [终止免费组织计划](https://news.ycombinator.com/item?id=35154025),随后在社区抗议下撤回。谁知道他们还能向像我这样的业余爱好者提供免费服务多久。 #### R4\. 无法在 Flatcar 上尝试 Immich 最后一根稻草是发现无法在 NAS 系统上尝试 Immich!现代 Web 应用如 Immich 需要多个 Docker 容器(Postgres、Redis 等),因此只提供 [Docker Compose](https://immich.app/docs/install/docker-compose) 作为受支持的安装方式。 不幸的是,Flatcar 并未 [包含 Docker Compose](https://github.com/flatcar/Flatcar/issues/894)。 我没有心情持续为不支持 Docker Compose 的系统重新打包 Immich,因此我判断,一个既不能直接运行 Immich 这样的软件,甚至不能运行 Docker Compose 的系统,已不再满足我的需求。 #### 原因总结 基于上述原因,我需要设置自动化容器构建、运行自己的中心注册表,却仍无法运行像 Immich 这样知名的开源软件。 于是,我决定(在中断十年后)再次尝试 NixOS,因为它如今似乎是最流行的声明式解决方案,拥有庞大的社区和丰富的软件包。 NixOS 对我的情况有何优劣? - **相同:** 我也需要设置一个自动化任务来更新 NixOS 系统。 - 我已经有一个类似的任务来更新我的 [gokrazy](https://gokrazy.org/) 设备。 - Docker push 是异步的:推送成功后,我还需要额外操作来在目标主机拉取更新后的容器并重启受影响的服务,而 NixOS 已经包含所有这些。 - **更优:** 没有中心注册表。使用 NixOS,我可以直接将构建结果通过 SSH 推送到目标主机。 - **更优:** NixOS 中可用的软件库规模大得多(例如包含 Immich),而且 NixOS 模块通常比单个 Docker 容器以更高层次抽象,意味着可以用更少的配置行实现更多功能。 ## 在虚拟机中原型验证 我的 NAS 设置需要每天正常工作,因此我打算先在虚拟机中原型验证所需配置,然后再对实际系统进行更改。这样不仅更安全,还能在不作任何承诺的情况下发现潜在障碍,并体验使用 NixOS 的感觉。 我将先前测试安装的 NixOS 配置(参见《[我如何(声明式地)安装 NixOS](https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/)》)复制过来,并用以下命令构建 VM 镜像并在 QEMU 中启动: `` nix build .#nixosConfigurations.storage2.config.system.build.vm export QEMU_NET_OPTS=hostfwd=tcp::2222-:22 export QEMU_KERNEL_PARAMS=console=ttyS0 ./result/bin/run-nixplay-vm `` 下面的配置说明可以在该 VM 中尝试,一旦你对自己的配置足够满意,就可以在实际机器上重复步骤进行迁移。 ## 迁移 对于实际系统的迁移,我设定了以下里程碑,每个里程碑应能在约一小时的典型会话中完成(在 VM 中原型验证后): - M1\. 安装 NixOS - M2\. 设置远程磁盘解锁 - M3\. 配置 Samba 实现访问 - M4\. 配置 SSH/rsync 实现备份 - 其他都是锦上添花,可以推迟到下次会话。 实际执行中完全按计划进行:实际安装 NixOS 并配置到 M4 里程碑花费了稍多于一小时。其他锦上添花的功能则是在接下来的几天和几周内有时间时陆续完成的。 **提示:** 由于在 2000 年代曾因安装程序 bug 丢失数据,我养成了解除所有数据磁盘物理连接(拔出 SATA 线)再重装系统盘的习惯。 ### M1\. 安装 NixOS 按照《[我如何(声明式地)安装 NixOS](https://michael.stapelberg.ch/posts/2025-06-01-nixos-installation-declarative/)》操作后,我的初始 `configuration.nix` 如下: `` { modulesPath, lib, pkgs, ... }: { imports = [ (modulesPath + "/installer/scan/not-detected.nix") ./hardware-configuration.nix ./disk-config.nix ]; # 添加 michael 为受信任用户,以便通过 SSH 升级系统(参见 Makefile)。 nix.settings.trusted-users = [ "michael" "root" ]; # 每周清理 Nix 存储。 nix.gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 7d"; }; boot.loader.systemd-boot = { enable = true; configurationLimit = 10; }; boot.loader.efi.canTouchEfiVariables = true; networking.hostName = "storage2"; time.timeZone = "Europe/Zurich"; # 使用 systemd 进行网络配置 services.resolved.enable = true; networking.useDHCP = false; systemd.network.enable = true; systemd.network.networks."10-e" = { matchConfig.Name = "e*"; # enp9s0 (10G) 或 enp8s0 (1G) networkConfig = { IPv6AcceptRA = true; DHCP = "yes"; }; }; i18n.supportedLocales = [ "en_DK.UTF-8/UTF-8" "de_DE.UTF-8/UTF-8" "de_CH.UTF-8/UTF-8" "en_US.UTF-8/UTF-8" ]; i18n.defaultLocale = "en_US.UTF-8"; users.mutableUsers = false; security.sudo.wheelNeedsPassword = false; users.users.michael = { openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5secret" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5key" ]; isNormalUser = true; description = "Michael Stapelberg"; extraGroups = [ "networkmanager" "wheel" ]; initialPassword = "secret"; # XXX: 请修改! shell = pkgs.zsh; packages = with pkgs; []; }; environment.systemPackages = with pkgs; [ git # 用于检出 github.com/stapelberg/configfiles rsync zsh vim emacs wget curl ]; programs.zsh.enable = true; services.openssh.enable = true; # 此值决定了系统状态数据的 NixOS 版本,如文件位置和数据库版本。 # 保持此值为首次安装该系统的发行版本即可,完全推荐。 # 在更改此值之前,请阅读该选项的文档(例如 man configuration.nix 或 https://nixos.org/nixos/options.html)。 system.stateVersion = "25.05"; # 记得阅读注释了吗? } `` 以下所有章节描述的都是对此 `configuration.nix` 的变更。 我家里的所有设备都通过 DHCP 获取 IP 地址。如果需要静态 IP,我在路由器上相应配置。 我的 NAS 电脑在 IP 地址方面有一个特点:它们同时通过 IPv4 和 IPv6 可达,且 IPv6 地址可以从 IPv4 地址推导出来。 因此,我将上述 systemd-networkd 配置修改为在动态配置的 IPv6 网络中设置静态 IPv6 地址: `` systemd.network.networks."10-e" = { matchConfig.Name = "e*"; # enp9s0 (10G) 或 enp8s0 (1G) networkConfig = { IPv6AcceptRA = true; DHCP = "yes"; }; ipv6AcceptRAConfig = { Token = "::10:0:0:252"; }; }; `` ✅ 至此完成里程碑 M1。 ### M2\. 设置远程磁盘解锁 为了在启动时解锁加密磁盘,我有一个自定义 systemd 服务单元,使用 `wget(1)` 和 `cryptsetup(8)` 将密钥文件分割存储在 NAS 和远程服务器上(攻击者需要同时获取两部分才能解锁)。 在 CoreOS/Flatcar 中,我的 `cloud-init` 配置如下: `` coreos: units: - name: unlock.service command: start content: | [Unit] Description=unlock hard drive Wants=network.target After=systemd-networkd-wait-online.service Before=samba.service [Service] Type=oneshot RemainAfterExit=yes # Wait until the host is actually reachable. ExecStar

相似文章

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

Michael Stapelberg

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

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

Michael Stapelberg

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

NixOS 与密钥管理

Lobsters Hottest

教程介绍 NixOS 的密钥管理选项,比较 sops-nix、agenix 和 ragenix 工具,并提供使用 sops-nix 进行加密密钥管理的实际示例。

使用 Immich 自托管我的照片

Michael Stapelberg

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