It is something like this. I’ll try to clean my actual impl up and publish it on github
{ name, nodes, lib, ... }:
{
networking.hostName = name;
# Using avahi for now for mDNS; however I want to switch to networkd for some
# boxes this will expose each node as ${networking.hostName}.local aka
# ${name}.local
services.avahi = {
enable = true;
nssmdns = true;
ipv6 = true;
publish = {
enable = true;
domain = true;
addresses = true;
userServices = true;
workstation = true;
};
};
nix = {
distributedBuilds = true;
# have a binary cache public key for each node with nix-store --generate-binary-cache-key
binaryCachePublicKeys = lib.mapAttrsToList (builtins.readFile (./. + "${node}.pub")) nodes;
binaryCaches = lib.mapAttrsToList (name: node: "http://${name}:${toString node.config.nix-serve.port}") nodes;
buildMachines = lib.mapAttrsToList (
name: node: {
hostName = name;
sshUser = "arian";
sshKey = "/root/.ssh/id_ed25519";
system = "x86_64-linux"; # TODO paarameterize
supportedFeatures = node.config.nix.systemFeatures;
maxJobs = node.config.nix.maxJobs;
}
) nodes;
};
services.nix-serve.enable = true;
}