metanix/flake.nix
2026-05-01 13:07:30 -05:00

106 lines
3 KiB
Nix

{
description = "Metanix static flake: meta.nix addressing, deploy-rs, disko, nixos-anywhere";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
deploy-rs.url = "github:serokell/deploy-rs";
disko.url = "github:nix-community/disko";
nixos-anywhere.url = "github:numtide/nixos-anywhere";
};
outputs = { self, nixpkgs, deploy-rs, disko, nixos-anywhere, ... }:
let
defaultSystem = "x86_64-linux";
pkgsFor = system: import nixpkgs { inherit system; };
lib = nixpkgs.lib;
meta = import ./meta.nix;
addressing = import ./lib/addressing { inherit lib; };
systemsFromMeta = meta.systems or { };
network = addressing.mkNetworkFromSpec meta;
in
{
lib.metanix = {
inherit meta addressing network;
};
nixosConfigurations =
lib.mapAttrs
(name: sysCfg:
let
system = sysCfg.system or defaultSystem;
in
lib.nixosSystem {
inherit system;
specialArgs = {
inherit lib meta addressing system network;
modulesPath = "${nixpkgs}/nixos/modules";
};
modules =
(sysCfg.modules or [ ]) ++ [
./modules/metanix/core.nix
./modules/metanix/networkd.nix
{
networking.hostName = sysCfg.hostName or name;
metanix.thisHost = sysCfg.metanixName or name;
}
(if sysCfg ? diskoConfig then
{
imports = [
disko.nixosModules.disko
sysCfg.diskoConfig
];
}
else
{ })
];
})
systemsFromMeta;
deploy = {
nodes =
lib.mapAttrs
(name: sysCfg:
let
hasNetworkHost = builtins.hasAttr name network.hosts;
hostInfo = if hasNetworkHost then network.hosts.${name} else null;
defaultHostname =
if hasNetworkHost && hostInfo ? fqdn then
hostInfo.fqdn
else
name;
in
{
hostname = sysCfg.deployHost or defaultHostname;
profiles.system = {
user = sysCfg.deployUser or "root";
path =
deploy-rs.lib.${defaultSystem}.activate.nixos
self.nixosConfigurations.${name};
};
})
systemsFromMeta;
};
checks =
builtins.mapAttrs
(system: deployLib: deployLib.deployChecks self.deploy)
deploy-rs.lib;
apps.${defaultSystem}.nixos-anywhere = {
type = "app";
program =
"${nixos-anywhere.packages.${defaultSystem}.nixos-anywhere}/bin/nixos-anywhere";
};
};
}