sfos/flake.nix

151 lines
5.1 KiB
Nix
Raw Permalink Normal View History

2024-11-23 19:57:39 +00:00
{
description = "sfos (self-host os)";
inputs = {
flake-utils.url = "github:numtide/flake-utils";
2024-12-29 01:29:47 +00:00
nixpkgs.url = "github:NixOS/nixpkgs/master";
2025-03-16 15:55:55 +00:00
nixos-facter-modules.url = "github:numtide/nixos-facter-modules";
2024-11-29 00:21:06 +00:00
systems.url = "github:nix-systems/default";
2025-03-16 15:55:55 +00:00
colmena = {
url = "github:zhaofengli/colmena";
inputs.nixpkgs.follows = "nixpkgs";
};
2024-11-23 19:57:39 +00:00
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
2024-11-29 00:21:06 +00:00
devenv.url = "github:cachix/devenv";
2024-12-16 14:46:07 +00:00
nix-editor = {
url = "github:snowfallorg/nix-editor";
inputs.nixpkgs.follows = "nixpkgs";
};
disko = {
url = "github:nix-community/disko";
inputs.nixpkgs.follows = "nixpkgs";
};
2024-11-29 00:21:06 +00:00
ess = {
url = "github:acaloiaro/ess/v2.13.0";
inputs.nixpkgs.follows = "nixpkgs";
};
2024-11-23 19:57:39 +00:00
agenix = {
url = "github:ryantm/agenix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = inputs @ {
agenix,
2025-03-16 15:55:55 +00:00
colmena,
2024-11-29 00:21:06 +00:00
devenv,
2025-03-16 15:55:55 +00:00
disko,
2024-11-23 19:57:39 +00:00
nixpkgs,
2024-12-16 14:46:07 +00:00
nix-editor,
2024-11-23 19:57:39 +00:00
self,
2024-11-29 00:21:06 +00:00
systems,
2024-11-23 19:57:39 +00:00
...
}: let
lib = nixpkgs.lib;
2024-11-29 00:21:06 +00:00
pkgs = nixpkgs.legacyPackages."x86_64-linux";
forEachSystem = nixpkgs.lib.genAttrs (import systems);
2024-11-23 19:57:39 +00:00
in {
inherit lib;
2025-03-16 15:55:55 +00:00
colmenaHive = colmena.lib.makeHive self.outputs.colmena;
colmena = {
meta = {
nixpkgs = import nixpkgs {
system = "x86_64-linux";
overlays = [
inputs.agenix.overlays.default
];
};
specialArgs = {
inherit self;
inherit inputs;
inherit (inputs) agenix;
};
};
2025-03-16 21:55:50 +00:00
sfos-0 = ./hosts/sfos-0;
sfos-1 = ./hosts/sfos-1;
sfos-2 = ./hosts/sfos-2;
2025-03-16 15:55:55 +00:00
};
2024-11-29 00:21:06 +00:00
devShells = forEachSystem (system: let
config = self.devShells.${system}.default.config;
in {
default = devenv.lib.mkShell {
inherit inputs pkgs;
modules = [
{
languages = {
nix.enable = true;
};
2024-11-23 23:15:48 +00:00
2024-11-29 00:21:06 +00:00
packages = with pkgs; [
2024-12-16 14:46:07 +00:00
inputs.nix-editor.packages.${system}.default
2025-03-16 15:55:55 +00:00
inputs.colmena.packages.${system}.colmena
2024-12-22 22:18:20 +00:00
jq
opentofu
2024-11-29 00:21:06 +00:00
pre-commit
];
2024-11-23 19:57:39 +00:00
2024-11-29 00:21:06 +00:00
enterShell =
#bash
''
run-show-help
'';
pre-commit.hooks.env-sample-sync = {
enable = true;
always_run = true;
pass_filenames = false;
name = "env-sample-sync";
description = "Sync secrets to env.sample";
entry = "${inputs.ess.packages.${system}.default}/bin/ess";
};
scripts = {
run-show-help = {
description = "Show this help text";
exec = ''
echo
echo Helper scripts available:
echo
${pkgs.gnused}/bin/sed -e 's| |XX|g' \
-e 's|=| |' <<EOF | \
${pkgs.util-linuxMinimal}/bin/column -t | \
${pkgs.gnused}/bin/sed -e 's|XX| |g'
${pkgs.lib.generators.toKeyValue {} (pkgs.lib.mapAttrs (name: value: value.description) config.scripts)}
EOF
'';
};
2024-12-16 14:46:07 +00:00
sfos-init = {
description = "Initialize cluster members";
exec = ''
#!/run/current-system/sw/bin/bash
2025-03-16 21:55:50 +00:00
cwd=$(pwd)
2024-12-29 01:29:47 +00:00
# tofu apply -auto-approve
2025-03-16 21:55:50 +00:00
tofu -chdir="$cwd/bootstrap" output -json | jq '.cluster_ips.value | join(",")' | tr -d '"' | tr ',' "\n" | while read host; do
cd "$cwd/hosts"
echo "Initializing $host"
2025-03-16 21:55:50 +00:00
hostName=$(tofu -chdir="$cwd/bootstrap" output -json | hostName=$host jq -r ".cluster_nodes.value[] | select(.ipv4_address == \"$host\").name")
2025-02-15 17:14:37 +00:00
echo "Setting host name: $hostName"
2024-12-29 01:29:47 +00:00
ssh_public_key=$(ssh-keyscan $host | grep ssh-ed25519 | cut -d " " -f 2,3)
2025-03-16 21:55:50 +00:00
mkdir -p "$hostName/secrets"
cp -rf ../common/* "$hostName/"
nix-editor "$hostName/default.nix" users.users.sfos.openssh.authorizedKeys.keys -i -v "[\"$TF_VAR_admin_ssh_public_key\"]"
nix-editor "$hostName/default.nix" users.users.root.openssh.authorizedKeys.keys -i -v "[\"$TF_VAR_admin_ssh_public_key\"]"
nix-editor "$hostName/default.nix" networking.hostName -i -v "\"$hostName\"\;"
nix-editor "$hostName/default.nix" deployment.targetHost -i -v "\"$host\"\;"
nix-editor "$hostName/secrets/secrets.nix" tailscale_auth_key.publicKeys -i -v "[localMachine \"$ssh_public_key\"]"
nix-editor ../flake.nix "outputs.colmena.$hostName" -i -v "./hosts/$hostName";
cd "$hostName/secrets"
echo "$TF_VAR_tailscale_auth_key" | agenix -e tailscale_auth_key -i ~/.ssh/id_rsa_agenix
2024-12-16 14:46:07 +00:00
done
2025-03-16 15:55:55 +00:00
cd ../../..
2025-03-16 21:55:50 +00:00
git add hosts
2024-12-16 14:46:07 +00:00
'';
};
2024-11-29 00:21:06 +00:00
};
}
];
};
});
2024-11-23 19:57:39 +00:00
};
}