🍁 nix-topology
通过 nix-topology,你可以从你的 NixOS 配置中自动生成基础设施和网络图 模,并获得类似上面的图表。它定义了一个新的全局模块系统,你可以在其中指定你拥有的节点和网络。大部分工作由包含的 NixOS 模块完成 , 该模块自动从你的主机中收集所有信息。
- 🌱 从你的 NixOS 配置中自动提取大量信息:
- 🔗 来自 systemd-networkd 的接口
- 🍵 已知的配置服务
- 🖥️ 来自 microvm.nix 的访客
- 🖥️ 来自 NixOS 容器的访客
- 🌐 来自 kea 的网络信息
- 🗺️ 渲染主要图表 (物理连接)和以网络为中心的图表
- ➡️ 自动传播通过你的连接分配的网络
- 🖨️ 允许你添加外部设备,如交换机,路由器,打印机...
查看 示例 目录以获取一些独立的示例,或在 文档 中查看渲染结果。
为什么?
我对 r/homelab 上所有手工制作的基础设施图有点嫉妒。但谁有时间做这些?我更愿意花更多的时间来创建一个我一生中会使用一次或两次的生成器 🤡👍。也许它对其他人也有用。
📦 安装和使用
安装过程应该很简单,只需将 nix-topology 添加到你的 flake.nix,定义全局模块并将 NixOS 模块添加到你的系统中。 也有一个 flake-parts 模块可用(请参见本节末尾的示例)。
- 将 nix-topology 作为输入添加到你的 flake
inputs.nix-topology.url = "github:oddlama/nix-topology";
- 将公开的覆盖层添加到你的全局 pkgs 定义中,以便提供必要的工具来渲染
pkgs = import nixpkgs { inherit system; overlays = [nix-topology.overlays.default]; };
- 在你的主机配置中导入公开的 NixOS 模块
nix-topology.nixosModules.default
nixosConfigurations.host1 = lib.nixosSystem { system = "x86_64-linux"; modules = [ ./host1/configuration.nix nix-topology.nixosModules.default ]; };
- 使用
topology = import nix-topology { pkgs = /*...*/; };
创建全局拓扑。在你的 flake 中将其暴露为输出,以便你可以访问它。# 为你希望在其中构建拓扑的每个系统重复此操作。 # 你可以手动执行此操作或使用 flake-utils。 topology.x86_64-linux = import nix-topology { inherit pkgs; # 只有这个包集必须包含 nix-topology.overlays.default modules = [ # 定义全局拓扑的文件。本质上像一个 nixos 模块,但使用不同的选项。 ./topology.nix # 内联模块,用于将现有的 NixOS 主机告知拓扑。 { nixosConfigurations = self.nixosConfigurations; } ]; };
- 通过
nix build .#topology.x86_64-linux.config.output
渲染你的拓扑,结果目录将包含完成的 SVGs。请注意,这可能需要一分钟,具体取决于你定义了多少主机。评估许多 NixOS 配置需要时间,有时渲染器在及时处理较大的 PNG 时会遇到困难。
示例 flake.nix
{
inputs = {
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nix-topology.url = "github:oddlama/nix-topology";
nix-topology.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, flake-utils, nixpkgs, nix-topology, ... }: {
# 示例。使用你自己的主机并向它们添加模块
nixosConfigurations.host1 = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./host1/configuration.nix
nix-topology.nixosModules.default
];
};
}
// flake-utils.lib.eachDefaultSystem (system: rec {
pkgs = import nixpkgs {
inherit system;
overlays = [ nix-topology.overlays.default ];
};
topology = import nix-topology {
inherit pkgs;
modules = [
# 定义全局拓扑的文件。本质上像一个 nixos 模块,但使用不同的选项。
./topology.nix
# 内联模块,用于将现有的 NixOS 主机告知拓扑。
{ nixosConfigurations = self.nixosConfigurations; }
];
};
});
}
示例 flake.nix 与 flake-parts
{
inputs.flake-parts.url = "github:hercules-ci/flake-parts";
inputs.nix-topology.url = "github:oddlama/nix-topology";
# ...
outputs = inputs:
inputs.flake-parts.lib.mkFlake {inherit inputs;} {
imports = [
inputs.nix-topology.flakeModule
];
perSystem = {...}: {
topology.modules = [
{
# 你的全局拓扑定义
}
];
};
};
}
🌱 添加连接,网络和其他设备
第一次渲染后,初始图表可能显得有点无结构。这只是因为 nix-topology 缺少一些关键信息,这些信息不能从一堆 NixOS 配置中推导出来,比如物理连接。你可能还需要添加一些常见设备,如互联网的图像,交换机,路由器等。但不用担心,这些都相当简单。文档中有一整章 https://oddlama.github.io/nix-topology/defining-additional-things.html 会指导你完成这一过程。
TL;DR:你可以通过在全局拓扑模块中或在你的某个 NixOS 配置中指定这些信息来添加连接和网络:
# 这是一个拓扑模块,所以在你的全局拓扑中使用它,或者在任何参与的 NixOS 节点下的 `topology = {};` 中使用它
{
# 连接 node1.lan -> node2.wan
nodes.node1.interfaces.lan.physicalConnections = [{ node = "node2"; interface = "wan"; }];
# 添加家庭网络
networks.home = {
name = "家用网络";
cidrv4 = "192.168.1.1/24";
};
# 告诉 nix-topology 我的主机.lan1 是这个网络的一部分。
# 网络将通过接口的连接自动传播。
nodes.myhost.interfaces.lan1.network = "home";
}
或在本地(例如 host1/configuration.nix
):
{
topology.networks.home = {
name = "由 Host1 创建的网络";
cidrv4 = "192.168.178.1/24";
};
topology.self.interfaces.lan1.network = "home";
}
🔨 待办事项
是的,还有很多可以添加或改进的内容。
信息收集 (提取器)
- Podman / docker 收集
- networking.interfaces 提取器
- 磁盘(来自 disko)+ 渲染
- 渲染 Impermanence?
- 渲染 Nixos nftables 防火墙?
通用
- NAT 指示
- Macvtap/vlan/桥接口类型 SVG 带小连接
- 可配置字体
- 使颜色可配置
❤️ 贡献
热烈欢迎贡献!请随时建议新功能,实现提取器,其他东西,或一般性帮助。如果你愿意,我们很高兴能够得到你的帮助。文档中的 CONTRIBUTING.md 和 开发章节 提供了更多信息。
📜 许可证
根据 MIT 许可证 (LICENSE 或 https://opensource.org/licenses/MIT) 获得许可。 除非你明确声明,否则你为包括在此项目中而有意提交的任何贡献都应按上述方式获得许可,且无需任何附加条款。