nix-config/flake.nix

372 lines
12 KiB
Nix
Raw Normal View History

{
description = "C3D2 NixOS configurations";
2020-06-11 07:50:42 +02:00
inputs = {
2021-06-07 02:30:56 +02:00
nixpkgs.url = "github:nixos/nixpkgs/release-21.05";
nixpkgs-mobilizon.url = "github:minijackson/nixpkgs/init-mobilizon";
2021-02-24 11:52:19 +01:00
secrets.url = "git+ssh://git@gitea.c3d2.de:2222/c3d2-admins/secrets.git";
zentralwerk.url = "git+https://gitea.c3d2.de/zentralwerk/network.git";
2021-03-06 01:13:27 +01:00
yammat.url = "git+https://gitea.c3d2.de/astro/yammat.git?ref=nix";
2021-03-10 01:54:28 +01:00
yammat.inputs.nixpkgs.follows = "nixpkgs";
scrapers.url = "git+https://gitea.c3d2.de/astro/scrapers.git";
scrapers.flake = false;
2021-09-10 00:21:38 +02:00
spacemsg.url = "github:astro/spacemsg";
spacemsg.flake = false;
2021-03-22 16:22:57 +01:00
tigger.url = "github:astro/tigger";
tigger.flake = false;
2021-09-08 01:22:40 +02:00
ticker.url = "git+https://gitea.c3d2.de/astro/ticker.git";
ticker.flake = false;
2020-06-11 07:50:42 +02:00
};
2020-04-15 19:00:56 +02:00
outputs = inputs@{ self, nixpkgs, secrets, nixos-hardware, zentralwerk, yammat, scrapers, spacemsg, tigger, ticker, ... }:
2021-02-22 12:31:58 +01:00
let
2021-03-03 16:20:17 +01:00
forAllSystems = nixpkgs.lib.genAttrs [ "aarch64-linux" "x86_64-linux" ];
2021-02-24 11:52:19 +01:00
inherit (nixpkgs.lib) recursiveUpdate;
extractZwHosts = { hosts4, hosts6, ... }:
recursiveUpdate (
builtins.foldl' (result: name:
recursiveUpdate result {
"${name}".ip4 = hosts4.${name};
}
) {} (builtins.attrNames hosts4)
) (
builtins.foldl' (result: ctx:
builtins.foldl' (result: name:
recursiveUpdate result {
"${name}".ip6 = hosts6.${ctx}.${name};
}
) result (builtins.attrNames hosts6.${ctx})
) {} (builtins.attrNames hosts6)
);
zwHostRegistry = {
hosts =
builtins.foldl' (result: net:
recursiveUpdate result (extractZwHosts zentralwerk.lib.config.site.net.${net})
) {} [ "core" "c3d2" "serv" ];
};
extraHostRegistry = import ./host-registry.nix;
hostRegistry = nixpkgs.lib.recursiveUpdate zwHostRegistry extraHostRegistry;
flakifiedHosts = nixpkgs.lib.filterAttrs (name: _: self.nixosConfigurations ? ${name}) hostRegistry.hosts;
getHostAddr = name:
let
hostConf = hostRegistry.hosts.${name};
in
if hostConf ? ip4
then hostConf.ip4
else if hostConf ? ip6
then hostConf.ip6
else null;
in {
2021-02-26 20:22:15 +01:00
overlay = import ./overlay;
legacyPackages = forAllSystems
(system: nixpkgs.legacyPackages.${system}.extend self.overlay);
2021-02-22 12:31:58 +01:00
packages = forAllSystems (system:
let
pkgs = self.legacyPackages.${system};
mkDeploy =
# Generate a small script for copying this flake to the
# remote machine and bulding and switching there.
# Can be run with nix run c3d2#deploy-…
{ name
2021-09-08 22:48:13 +02:00
, host
# remote builders to pass
, builders ? null
}:
2021-02-22 12:31:58 +01:00
let target = "root@${host}";
rebuildArg =
"--flake ${self}#${name}" +
(if builders != null
then " --builders \"" +
builtins.concatStringsSep " " builders +
"\""
else "");
2021-02-22 12:31:58 +01:00
in pkgs.writeScriptBin "${name}-nixos-rebuild" ''
2021-06-07 02:30:16 +02:00
#!${pkgs.runtimeShell} -e
2021-03-04 00:47:05 +01:00
nix-copy-closure --to ${target} ${secrets}
2021-02-22 12:31:58 +01:00
nix-copy-closure --to ${target} ${self}
if [ "$1" = "--flakify" ]; then
shift
exec ssh -t ${target} "nix-shell -p nixFlakes -p git --command '_NIXOS_REBUILD_REEXEC=1 nixos-rebuild ${rebuildArg} '$@"
else
exec ssh -t ${target} nixos-rebuild ${rebuildArg} $@
fi
2021-02-22 12:31:58 +01:00
'';
2021-02-22 13:21:31 +01:00
mkWake = name:
pkgs.writeScriptBin "${name}-wake" ''
#!${pkgs.runtimeShell}
exec ${pkgs.wol}/bin/wol ${hostRegistry.hosts.${name}.ether}
'';
# TODO: check if the ethernet address is reachable and if not,
# execute wol on a machine in HQ.
2021-02-22 12:31:58 +01:00
in {
2021-09-22 20:33:41 +02:00
inherit (pkgs) bmxd openwebrx;
2021-02-26 20:22:15 +01:00
2021-09-08 00:34:38 +02:00
list-upgradable = pkgs.writeScriptBin "list-upgradable" ''
#! ${pkgs.runtimeShell}
NORMAL="\033[0m"
RED="\033[0;31m"
YELLOW="\033[0;33m"
GREEN="\033[0;32m"
${pkgs.lib.concatMapStringsSep "\n" (name:
let
addr = getHostAddr name;
in nixpkgs.lib.optionalString (addr != null) ''
echo -n -e "${name}: $RED"
RUNNING=$(ssh -o PreferredAuthentications=publickey -o StrictHostKeyChecking=accept-new root@"${addr}" "readlink /run/current-system")
if [ $? = 0 ] && [ -n "$RUNNING" ]; then
2021-09-08 00:34:38 +02:00
CURRENT=$(nix eval --raw ".#nixosConfigurations.${name}.config.system.build.toplevel" 2>/dev/null)
RUNNING_VER=$(basename $RUNNING|rev|cut -d - -f 1|rev)
CURRENT_VER=$(basename $CURRENT|rev|cut -d - -f 1|rev)
2021-09-08 00:34:38 +02:00
if [ "$RUNNING" = "$CURRENT" ]; then
echo -e "$GREEN"current"$NORMAL $RUNNING_VER"
elif [ "$RUNNING_VER" = "$CURRENT_VER" ]; then
echo -e "$GREEN"modified"$NORMAL $RUNNING_VER"
2021-09-08 00:34:38 +02:00
else
echo -e "$YELLOW"outdated"$NORMAL $RUNNING_VER < $CURRENT_VER"
2021-09-08 00:34:38 +02:00
fi
fi
echo -n -e "$NORMAL"
'') (builtins.attrNames flakifiedHosts)}
'';
} //
builtins.foldl' (result: host: result // {
"${host}-wake" = mkWake host;
}) {} (builtins.attrNames (nixpkgs.lib.filterAttrs (_: { wol ? false, ... }: wol) hostRegistry.hosts)) //
builtins.foldl' (result: name: result // {
"${name}-nixos-rebuild" = mkDeploy ({
inherit name;
host = getHostAddr name;
} // nixpkgs.lib.optionalAttrs (hostRegistry.hosts.${name} ? builders) {
inherit (hostRegistry.hosts.${name}) builders;
});
2021-09-08 22:48:13 +02:00
"${name}-nixos-rebuild-local" =
let
host = getHostAddr name;
target = ''root@"${host}"'';
profile = self.nixosConfigurations.${name}.config.system.build.toplevel;
in pkgs.writeScriptBin "${name}-nixos-rebuild" ''
#!${pkgs.runtimeShell} -e
nix-copy-closure --to ${target} ${profile}
exec ssh -t ${target} "${profile}/bin/switch-to-configuration $@"
'';
2021-09-23 19:34:09 +02:00
}) {} (builtins.attrNames flakifiedHosts) //
builtins.foldl' (result: host: result // {
"${host}-sdImage" = self.nixosConfigurations.${host}.config.system.build.sdImage;
}) {} (builtins.attrNames (nixpkgs.lib.filterAttrs (host: nixosConfiguration:
nixosConfiguration.config.system.build ? sdImage
) self.nixosConfigurations))
);
2020-08-04 17:15:07 +02:00
2021-02-22 12:31:58 +01:00
nixosConfigurations = let
nixosSystem' =
# Our custom NixOS builder
{ nixpkgs ? inputs.nixpkgs, extraArgs ? {}, ... }@args:
nixpkgs.lib.nixosSystem (nixpkgs.lib.filterAttrs (n: _: n != "nixpkgs") args // {
extraArgs = extraArgs // {
2021-09-23 19:34:09 +02:00
inherit hostRegistry inputs;
};
2021-02-22 12:31:58 +01:00
extraModules = [
self.nixosModules.c3d2
({ pkgs, ... }: {
nix = {
package = pkgs.nixFlakes;
extraOptions = "experimental-features = nix-command flakes";
};
2021-02-26 20:22:15 +01:00
nixpkgs.overlays = [ self.overlay ];
2021-02-22 12:31:58 +01:00
})
];
});
in {
2020-08-04 17:15:07 +02:00
2021-02-26 20:22:15 +01:00
freifunk = nixosSystem' {
2021-03-05 01:16:57 +01:00
modules = [
./hosts/containers/freifunk
({ ... }: {
nixpkgs.overlays = with secrets.overlays; [
freifunk ospf
];
})
];
2021-02-26 20:22:15 +01:00
system = "x86_64-linux";
};
2021-02-22 13:21:31 +01:00
glotzbert = nixosSystem' {
modules = [
./hosts/glotzbert
nixos-hardware.nixosModules.common-cpu-intel
nixos-hardware.nixosModules.common-pc-ssd
2021-03-12 17:06:37 +01:00
secrets.nixosModules.admins
];
2021-02-22 13:21:31 +01:00
system = "x86_64-linux";
};
pulsebert = nixosSystem' {
2021-09-23 19:34:09 +02:00
modules = [
"${inputs.nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
./hosts/pulsebert
];
2021-02-22 13:21:31 +01:00
system = "aarch64-linux";
};
2020-08-04 17:15:07 +02:00
2021-09-23 03:32:17 +02:00
radiobert = nixosSystem' {
modules = [
2021-09-23 19:34:09 +02:00
"${inputs.nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
2021-09-23 03:32:17 +02:00
./hosts/radiobert
];
system = "aarch64-linux";
};
2021-09-27 22:19:24 +02:00
dacbert = nixosSystem' {
modules = [
"${inputs.nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix"
./hosts/dacbert
];
system = "aarch64-linux";
};
2021-03-03 16:20:17 +01:00
yggdrasil = nixosSystem' {
modules = [
./hosts/containers/yggdrasil
./lib/lxc-container.nix
./lib/users/emery.nix
({ ... }: {
nixpkgs.overlays = [ secrets.overlays.ospf ];
})
2021-03-03 16:20:17 +01:00
];
system = "x86_64-linux";
};
2021-03-06 01:13:27 +01:00
matemat = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/matemat
2021-03-10 01:54:28 +01:00
yammat.nixosModule
secrets.nixosModules.admins
2021-03-06 02:28:46 +01:00
({ ... }: {
nixpkgs.overlays = [ secrets.overlays.matemat ];
})
2021-03-06 01:13:27 +01:00
];
system = "x86_64-linux";
};
2021-03-06 02:57:35 +01:00
scrape = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/scrape
({ ... }: {
nixpkgs.overlays = [ secrets.overlays.scrape ];
})
];
extraArgs = { inherit scrapers; };
2021-03-06 02:57:35 +01:00
system = "x86_64-linux";
};
2021-03-11 15:59:00 +01:00
dn42 = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/dn42
({ ... }: {
nixpkgs.overlays = [ secrets.overlays.dn42 ];
})
];
system = "x86_64-linux";
};
2021-03-11 16:40:39 +01:00
grafana = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/grafana
];
system = "x86_64-linux";
};
2021-03-12 21:45:12 +01:00
hydra = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/hydra
];
system = "x86_64-linux";
};
2021-03-22 16:22:57 +01:00
mucbot = nixosSystem' {
modules = [
./lib/lxc-container.nix
"${tigger}/module.nix"
{ nixpkgs.overlays = [ secrets.overlays.mucbot ]; }
./hosts/containers/mucbot
];
extraArgs = { inherit tigger; };
system = "x86_64-linux";
};
2021-05-10 00:28:27 +02:00
kibana = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/kibana
];
system = "x86_64-linux";
};
2021-06-23 21:59:10 +02:00
public-access-proxy = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/public-access-proxy
];
system = "x86_64-linux";
};
2021-09-08 01:22:40 +02:00
ticker = nixosSystem' {
modules = [
./lib/lxc-container.nix
"${ticker}/nixos-module.nix"
./hosts/containers/ticker
];
system = "x86_64-linux";
};
2021-09-10 00:21:38 +02:00
spaceapi = nixosSystem' {
modules = [
./lib/lxc-container.nix
"${spacemsg}/spaceapi/module.nix"
./hosts/containers/spaceapi
];
system = "x86_64-linux";
};
2021-09-10 22:59:40 +02:00
stream = nixosSystem' {
modules = [
./lib/lxc-container.nix
./hosts/containers/stream
];
system = "x86_64-linux";
};
mobilizon = nixosSystem' {
# TODO: pending https://github.com/NixOS/nixpkgs/pull/119132
nixpkgs = inputs.nixpkgs-mobilizon;
modules = [
./lib/lxc-container.nix
./hosts/containers/mobilizon
];
system = "x86_64-linux";
};
2020-08-04 17:15:07 +02:00
};
nixosModule = import ./lib;
nixosModules.c3d2 = self.nixosModule;
2021-02-22 12:31:58 +01:00
};
}