{ description = "Metanix static flake: meta.nix → addressing, deploy-rs, disko, nixos-anywhere"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.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 system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; lib = pkgs.lib; addressing = import ./lib/addressing { inherit lib; }; meta = import ./meta.nix; systemsFromMeta = meta.systems or { }; in { lib.metanix = { inherit meta addressing; network = addressing.mkNetworkFromSpec meta; }; nixosConfigurations = lib.mapAttrs (name: sysCfg: let systemForHost = sysCfg.system or system; in lib.nixosSystem { system = systemForHost; # Make meta + addressing available to all modules specialArgs = { inherit meta addressing; }; modules = (sysCfg.modules or [ ]) ++ [ ./modules/metanix-core.nix # Disko wiring if present (if sysCfg ? diskoConfig then { imports = [ disko.nixosModules.disko sysCfg.diskoConfig ]; } else { }) ]; }) systemsFromMeta; deploy = { nodes = lib.mapAttrs (name: sysCfg: let network = addressing.mkNetworkFromSpec meta; hasNetworkHost = builtins.hasAttr name network.hosts; hostInfo = if hasNetworkHost then network.hosts.${name} else null; defaultHostname = if hasNetworkHost then hostInfo.fqdn else "${name}.${meta.domain}"; in { hostname = sysCfg.deployHost or defaultHostname; profiles.system = { user = sysCfg.deployUser or "root"; path = deploy-rs.lib.${system}.activate.nixos self.nixosConfigurations.${name}; }; }) systemsFromMeta; }; checks.${system}.deploy = deploy-rs.lib.${system}.deployChecks self.deploy; apps.${system}.nixos-anywhere = { type = "app"; program = "${nixos-anywhere.packages.${system}.nixos-anywhere}/bin/nixos-anywhere"; }; }; }