From 9414398f6861927e717bfdf3b6dd24f49176560b Mon Sep 17 00:00:00 2001 From: reidlab Date: Wed, 31 Dec 2025 22:36:01 -0800 Subject: [PATCH] abstract away architectures --- README.md | 9 +++++- flake.lock | 18 ++++++++++- flake.nix | 45 +++++++++++++++++----------- hosts/nixos-server-reid/hardware.nix | 4 +-- hosts/nixos-server-reid/meta.nix | 3 ++ lib/attrs.nix | 2 +- lib/nixos.nix | 25 ++++++++++------ lib/options.nix | 7 +++++ 8 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 hosts/nixos-server-reid/meta.nix create mode 100644 lib/options.nix diff --git a/README.md b/README.md index 3dc0cf9..8797600 100755 --- a/README.md +++ b/README.md @@ -12,10 +12,17 @@ run `rg /etc/secrets/` to see where you need to add secret files when deploying unfortunately, as a consequence of this secret method, you need to do impure builds +## hosts + +each host should have these files: + + - `default.nix`, contains everything relating to the basic system + - `hardware.nix`, hardware-specific configuration + - `meta.nix`, extra things passed thru to `mkHost` + ## todo - find a better way to do cloudflare ips - - per-host architecture selection, atm it is hardcoded to `aarch64` - swap back to hardened kernel - wtaf is going on w/ our user management?? - Jellyfin... yea,,, diff --git a/flake.lock b/flake.lock index 3d21d9c..921ec4f 100644 --- a/flake.lock +++ b/flake.lock @@ -21,7 +21,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1681202837, @@ -124,6 +124,7 @@ "hardware": "hardware", "home-manager": "home-manager", "nixpkgs": "nixpkgs_2", + "systems": "systems_2", "vscode-server": "vscode-server" } }, @@ -143,6 +144,21 @@ } }, "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "systems_3": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", diff --git a/flake.nix b/flake.nix index ee33fb5..a4cafda 100755 --- a/flake.nix +++ b/flake.nix @@ -3,6 +3,7 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + systems.url = "github:nix-systems/default-linux"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; @@ -14,41 +15,49 @@ vscode-server.url = "github:nix-community/nixos-vscode-server"; }; - outputs = inputs @ { self, nixpkgs, ... }: + outputs = inputs @ { self, nixpkgs, systems, ... }: let inherit (lib.my) mapModules mapModulesRec mapHosts; - system = "aarch64-linux"; + eachSystem = nixpkgs.lib.genAttrs (import systems); - mkPkgs = pkgs: extraOverlays: + lib = nixpkgs.lib.extend (final: prev: { + my = import ./lib { + inherit inputs; + lib = final; + pkgs = null; + }; + }); + + mkPkgs = system: pkgs: extraOverlays: import pkgs { inherit system; config.allowUnfree = true; config.allowAliases = true; overlays = extraOverlays ++ (lib.attrValues self.overlays); }; - pkgs = mkPkgs nixpkgs [ self.overlays.default ]; - lib = nixpkgs.lib.extend (final: prev: { - my = import ./lib { - inherit pkgs inputs; - lib = final; - }; - }); + pkgsFor = eachSystem (system: + mkPkgs system nixpkgs [ + self.overlays.default + ] + ); in { lib = lib.my; - overlays = - (mapModules ./overlays import) - // { - default = final: prev: { - my = self.packages.${system}; - }; + overlays = (mapModules ./overlays import) // { + default = final: prev: { + my = self.packages.${final.stdenv.hostPlatform.system}; }; + }; - packages."${system}" = mapModules ./packages (p: pkgs.callPackage p {}); + packages = eachSystem (system: let + pkgs = pkgsFor.${system}; + in + mapModules ./packages (p: pkgs.callPackage p {}) + ); nixosModules = mapModulesRec ./modules import; - nixosConfigurations = mapHosts ./hosts {}; + nixosConfigurations = mapHosts ./hosts { inherit pkgsFor; }; }; } diff --git a/hosts/nixos-server-reid/hardware.nix b/hosts/nixos-server-reid/hardware.nix index bfaaec9..cca53b4 100755 --- a/hosts/nixos-server-reid/hardware.nix +++ b/hosts/nixos-server-reid/hardware.nix @@ -25,7 +25,7 @@ # needed for initial framebuffer logs to appear on raspberry pi # i think. this fixes it but idk if they are all required - boot.kernelParams = [ + boot.kernelParams = [ "8250.nr_uarts=1" "cma=128M" "console=tty0" @@ -44,6 +44,4 @@ networking.useDHCP = lib.mkDefault true; # networking.interfaces.end0.useDHCP = lib.mkDefault true; # networking.interfaces.wlan0.useDHCP = lib.mkDefault true; - - nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux"; } diff --git a/hosts/nixos-server-reid/meta.nix b/hosts/nixos-server-reid/meta.nix new file mode 100644 index 0000000..38187ab --- /dev/null +++ b/hosts/nixos-server-reid/meta.nix @@ -0,0 +1,3 @@ +{ + system = "aarch64-linux"; +} diff --git a/lib/attrs.nix b/lib/attrs.nix index e5890b4..4c2d488 100644 --- a/lib/attrs.nix +++ b/lib/attrs.nix @@ -4,7 +4,7 @@ in rec { # attrsToList attrsToList = attrs: - mapAttrsToList (name: value: {inherit name value;}) attrs; + mapAttrsToList (name: value: { inherit name value; }) attrs; # mapFilterAttrs :: # (name -> value -> bool) diff --git a/lib/nixos.nix b/lib/nixos.nix index e39e809..af1c8c1 100755 --- a/lib/nixos.nix +++ b/lib/nixos.nix @@ -1,35 +1,42 @@ { inputs, lib, - pkgs, self, ... }: let inherit (inputs.nixpkgs.lib) nixosSystem; - inherit (builtins) baseNameOf elem; - inherit (lib.attrsets) filterAttrs; inherit (lib.modules) mkDefault; inherit (lib.strings) removeSuffix; inherit (self.modules) mapModules; in rec { - mkHost = path: attrs @ {system ? "aarch64-linux", ...}: + mkHost = path: { + system, + pkgsFor, + ... + }: nixosSystem { inherit system; - specialArgs = {inherit lib inputs system;}; + specialArgs = { inherit lib inputs system; }; modules = [ { - nixpkgs.pkgs = pkgs; + nixpkgs.pkgs = pkgsFor.${system}; + nixpkgs.hostPlatform = lib.mkDefault system; networking.hostName = mkDefault (removeSuffix ".nix" (baseNameOf path)); } - (filterAttrs (n: v: !elem n ["system"]) attrs) ../. # /default.nix (import path) ]; }; - mapHosts = dir: attrs @ {system ? system, ...}: - mapModules dir (hostPath: mkHost hostPath attrs); + mapHosts = dir: attrs: + mapModules dir (hostPath: + let + metaPath = "${hostPath}/meta.nix"; + meta = import metaPath; + in + mkHost hostPath (attrs // meta) + ); } diff --git a/lib/options.nix b/lib/options.nix new file mode 100644 index 0000000..98579ea --- /dev/null +++ b/lib/options.nix @@ -0,0 +1,7 @@ +{lib, ...}: let + inherit (lib.options) mkOption; +in { + mkOpt = type: default: mkOption { inherit type default; }; + + mkOpt' = type: default: description: mkOption { inherit type default description; }; +}