{ description = "LaSuite Federez Deployment"; inputs = { # General sources deploy-rs.url = "github:serokell/deploy-rs"; agenix.url = "github:ryantm/agenix"; nixpkgs-25-05.url = "github:NixOS/nixpkgs/nixos-25.05"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs-25-05, nixpkgs-unstable, deploy-rs, agenix }: let system = "x86_64-linux"; lib = nixpkgs-25-05.lib; # Mapping version identifiers to nixpkgs nixpkgsMap = { "25.05" = nixpkgs-25-05; "unstable" = nixpkgs-unstable; }; importPkgs = version: overlays: import nixpkgsMap.${version} { inherit system; overlays = if overlays == null then [] else overlays; }; # Unmodified nixpkgs getNixpkgs = version: importPkgs version []; # nixpkgs with deploy-rs overlay but force the nixpkgs package getDeployPkgs = version: importPkgs version [ deploy-rs.overlays.default (self: super: { deploy-rs = { inherit (getNixpkgs version) deploy-rs; lib = super.deploy-rs.lib; }; }) ]; nodes = import ./nodes.nix; mapping = import ./mapping.nix; findRolesForHost = hostName: lib.filter (roleName: lib.elem hostName mapping.${roleName}.hosts) (lib.attrNames mapping); getModulesForHost = hostName: let roles = findRolesForHost hostName; modulesList = map (role: mapping.${role}._inherit or []) roles; in lib.lists.concatLists modulesList; defaultModules = [ agenix.nixosModules.default ./shared/users.nix ./shared/commons.nix ]; in { nixosConfigurations = lib.mapAttrs (name: config: nixpkgsMap.${config.ver}.lib.nixosSystem { system = config.system; modules = getModulesForHost "${name}" ++ defaultModules ++ [{ hostName = "${name}"; }]; } ) nodes; deploy = { user = "root"; autoRollback = true; magicRollback = true; remoteBuild = false; nodes = lib.mapAttrs (name: config: { hostname = lib.lists.head (lib.strings.splitString "/" config.ip4); profilesOrder = [ "system" ]; profiles = { system = { path = (getDeployPkgs config.ver).deploy-rs.lib.activate.nixos self.nixosConfigurations.${name}; }; }; }) nodes; }; # This is highly advised, and will prevent many possible mistakes, just run "deploy -s" to bypass it checks = lib.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib; }; }