main
 1{
 2  den,
 3  inputs,
 4  self,
 5  lib,
 6  ...
 7}: let
 8  # TODO: Standalone Home Manager deploy profile
 9  allHosts = lib.mergeAttrsList (lib.attrValues den.hosts);
10  deployableHosts =
11    lib.filterAttrs
12    (
13      n: v:
14        v.hasAspect den.aspects.core.openssh.access
15        && !(v.hasAspect den.aspects.core.installer)
16    )
17    allHosts;
18in {
19  flake-file.inputs.deploy-rs = {
20    url = "github:serokell/deploy-rs";
21    inputs.nixpkgs.follows = "nixpkgs";
22    inputs.flake-compat.follows = "flake-compat";
23  };
24
25  flake.deploy.nodes =
26    lib.mapAttrs (name: host: {
27      hostname = host.hostName;
28      profilesOrder = ["system"];
29      profiles.system = {
30        path =
31          inputs.deploy-rs.lib.${host.system}.activate.${host.class}
32          self."${host.class}Configurations".${name};
33        sshUser = "hpcesia";
34        user = "root";
35        interactiveSudo = true;
36      };
37    })
38    deployableHosts;
39
40  flake.checks =
41    builtins.mapAttrs (
42      system: deployLib: deployLib.deployChecks self.deploy
43    )
44    inputs.deploy-rs.lib;
45
46  den.schema.flake-parts.includes = [
47    {
48      devshell = {system, ...}: {
49        commands = [
50          {
51            name = "deploy";
52            package = inputs.deploy-rs.packages.${system}.deploy-rs;
53            help = "Deploy profiles to remote servers";
54          }
55        ];
56      };
57    }
58  ];
59}