hosts: migrate to nilla

This commit is contained in:
Nikodem Rabuliński 2025-03-23 22:46:55 +01:00
parent c523ebe44b
commit ba23a8d7f5
Signed by: nrabulinski
SSH key fingerprint: SHA256:AZZVyfKStaCo8sbJB+3Rr/CRrlym1oEgw7vMnynJeR8
19 changed files with 78 additions and 205 deletions

View file

@ -1,8 +1,8 @@
{ lib, ... }: { lib }:
{ {
options.assets = lib.mkOption { options.assets = lib.options.create {
type = lib.types.unspecified; type = lib.types.raw;
readOnly = true; writable = false;
}; };
config.assets = { config.assets = {

View file

@ -21,12 +21,12 @@
flake-parts.lib.mkFlake { inherit inputs; } { flake-parts.lib.mkFlake { inherit inputs; } {
inherit systems; inherit systems;
imports = [ imports = [
./assets
./hosts
./modules ./modules
./services
]; ];
flake.nixosConfigurations = nilla.nixosConfigurations;
flake.darwinConfigurations = nilla.darwinConfigurations;
flake.homeConfigurations = nilla.homeConfigurations;
flake.devShells = transpose nilla.shells; flake.devShells = transpose nilla.shells;
flake.packages = transpose nilla.packages; flake.packages = transpose nilla.packages;
flake.formatter = nilla.packages.formatter.result; flake.formatter = nilla.packages.formatter.result;

View file

@ -1,11 +1,11 @@
{ {
config, config,
self,
inputs,
...
}: }:
let
inputs = builtins.mapAttrs (_: input: input.result) config.inputs;
in
{ {
imports = [ includes = [
./kazuki ./kazuki
./hijiri-vm ./hijiri-vm
./hijiri ./hijiri
@ -16,20 +16,20 @@
./youko ./youko
]; ];
builders = config.configBuilders =
let let
sharedOptions = { sharedOptions = {
_file = ./default.nix; _file = ./default.nix;
settei.sane-defaults.allSshKeys = config.assets.sshKeys.user; settei.sane-defaults.allSshKeys = config.assets.sshKeys.user;
settei.flake-qol.inputs = inputs // { settei.flake-qol.inputs = inputs // {
settei = self; settei = inputs.self;
}; };
}; };
baseNixos = inputs.nixpkgs.lib.nixosSystem { baseNixos = inputs.nixpkgs.lib.nixosSystem {
modules = [ modules = [
self.nixosModules.combined inputs.self.nixosModules.combined
sharedOptions sharedOptions
]; ];
specialArgs.configurationName = "base"; specialArgs.configurationName = "base";
@ -37,7 +37,7 @@
baseDarwin = inputs.darwin.lib.darwinSystem { baseDarwin = inputs.darwin.lib.darwinSystem {
modules = [ modules = [
self.darwinModules.combined inputs.self.darwinModules.combined
sharedOptions sharedOptions
]; ];
specialArgs.configurationName = "base"; specialArgs.configurationName = "base";
@ -49,7 +49,7 @@
baseNixos.extendModules { baseNixos.extendModules {
modules = [ modules = [
module module
config.__extraHostConfigs.${name} or { } config.extraHostConfigs.${name} or { }
]; ];
specialArgs.configurationName = name; specialArgs.configurationName = name;
}; };
@ -60,7 +60,7 @@
eval = baseDarwin._module.args.extendModules { eval = baseDarwin._module.args.extendModules {
modules = [ modules = [
module module
config.__extraHostConfigs.${name} or { } config.extraHostConfigs.${name} or { }
]; ];
specialArgs.configurationName = name; specialArgs.configurationName = name;
}; };

View file

@ -1,5 +1,5 @@
{ {
configurations.nixos.hijiri-vm = config.configurations.nixos.hijiri-vm =
{ {
modulesPath, modulesPath,
lib, lib,

View file

@ -1,5 +1,5 @@
{ {
configurations.darwin.hijiri = config.configurations.darwin.hijiri =
{ {
config, config,
pkgs, pkgs,

View file

@ -1,6 +1,6 @@
{ lib, ... }: { lib, ... }:
{ {
configurations.nixos = config.configurations.nixos =
let let
mkInstaller = mkInstaller =
system: system:

View file

@ -1,5 +1,5 @@
{ {
configurations.nixos.kazuki = config.configurations.nixos.kazuki =
{ {
modulesPath, modulesPath,
... ...

View file

@ -1,5 +1,5 @@
{ {
configurations.darwin.kogata = config.configurations.darwin.kogata =
{ pkgs, ... }: { pkgs, ... }:
{ {
nixpkgs.system = "aarch64-darwin"; nixpkgs.system = "aarch64-darwin";

View file

@ -1,5 +1,5 @@
{ {
configurations.nixos.ude = config.configurations.nixos.ude =
{ {
config, config,
modulesPath, modulesPath,

View file

@ -1,5 +1,5 @@
{ {
configurations.nixos.youko = config.configurations.nixos.youko =
{ {
config, config,
lib, lib,

View file

@ -3,24 +3,12 @@
inputs, inputs,
... ...
}: }:
let
flakeModule = import ./flake { inherit (inputs) nixpkgs darwin home-manager; };
in
{ {
imports = [
flakeModule
];
flake.homeModules = rec { flake.homeModules = rec {
settei = ./home; settei = ./home;
default = settei; default = settei;
}; };
flake.flakeModules = rec {
settei = flakeModule;
default = settei;
};
flake.nixosModules = rec { flake.nixosModules = rec {
settei = import ./system { settei = import ./system {
inherit (config) perInput; inherit (config) perInput;

View file

@ -1,54 +0,0 @@
{
nixpkgs,
darwin,
home-manager,
}:
{
config,
lib,
...
}:
with lib;
{
_file = ./configurations.nix;
options = {
# Those functions take the final arguments and emit a valid configuration.
# Probably should hardly ever be overriden
builders = {
nixos = mkOption {
type = types.functionTo types.unspecified;
default = _name: nixpkgs.lib.nixosSystem;
};
darwin = mkOption {
type = types.functionTo types.unspecified;
default = _name: darwin.lib.darwinSystem;
};
home = mkOption {
type = types.functionTo types.unspecified;
default = _name: home-manager.lib.homeManagerConfiguration;
};
};
configurations = {
nixos = mkOption {
type = types.lazyAttrsOf types.deferredModule;
default = { };
};
darwin = mkOption {
type = types.lazyAttrsOf types.deferredModule;
default = { };
};
home = mkOption {
type = types.lazyAttrsOf types.deferredModule;
default = { };
};
};
};
config.flake = {
nixosConfigurations = mapAttrs config.builders.nixos config.configurations.nixos;
darwinConfigurations = mapAttrs config.builders.darwin config.configurations.darwin;
homeConfigurations = mapAttrs config.builders.home config.configurations.home;
};
}

View file

@ -1,13 +0,0 @@
{
nixpkgs,
darwin,
home-manager,
}:
{
_file = ./default.nix;
imports = [
(import ./configurations.nix { inherit nixpkgs darwin home-manager; })
./services.nix
];
}

View file

@ -1,95 +0,0 @@
# List of features I want this module to eventually have
# TODO: Automatic port allocation
# TODO: Making it possible to conveniently isolate services (running them in NixOS containers)
# TODO: Handling specializations
# TODO: Convenient http handling
# TODO: Automatic backup
{ config, lib, ... }:
let
serviceModule =
{ config, ... }:
{
options = {
host = lib.mkOption {
type = lib.types.str;
};
ports = lib.mkOption {
type = with lib.types; listOf port;
default = [ ];
};
hosts = lib.mkOption {
type = with lib.types; listOf str;
default = [ config.host ];
};
module = lib.mkOption {
type = lib.types.deferredModule;
default = { };
};
hostModule = lib.mkOption {
type = with lib.types; attrsOf deferredModule;
default = { };
};
};
};
moduleToHostConfigs =
cfg:
lib.genAttrs cfg.hosts (host: {
imports = [
cfg.module
(cfg.hostModule.${host} or { })
];
});
maybeGetPreviousConfigs = acc: host: (acc.${host} or { imports = [ ]; }).imports;
in
{
_file = ./services.nix;
options = {
services = lib.mkOption {
type = with lib.types; attrsOf (submodule serviceModule);
default = { };
};
__extraHostConfigs = lib.mkOption {
type = with lib.types; attrsOf deferredModule;
readOnly = true;
};
};
config.__extraHostConfigs =
let
duplicatePorts = lib.pipe config.services [
lib.attrValues
(map (cfg: cfg.ports))
lib.flatten
(lib.groupBy' (cnt: _: cnt + 1) 0 toString)
(lib.filterAttrs (_: cnt: cnt > 1))
lib.attrNames
];
assertMsg =
let
plural = lib.length duplicatePorts > 1;
in
"\nBad service config:\nThe following port${if plural then "s" else ""} ${
if plural then "were" else "was"
} declared multiple times: ${lib.concatStringsSep ", " duplicatePorts}";
# Here I collect all the services.<name>.config into a flat
# __extraHostConfigs.<host>.imports = [
# ...
# ]
# so that I can easily import them in hosts/default.nix
hostConfigs = lib.pipe config.services [
lib.attrValues
(lib.foldl' (
acc: cfg:
acc
// lib.mapAttrs (host: c: {
imports = c.imports ++ (maybeGetPreviousConfigs acc host);
}) (moduleToHostConfigs cfg)
) { })
];
in
if duplicatePorts != [ ] then throw assertMsg else hostConfigs;
}

View file

@ -0,0 +1,47 @@
{ config, lib }:
{
options = {
configBuilders = {
nixos = lib.options.create {
type = lib.types.function lib.types.raw;
default.value = _name: config.inputs.nixpkgs.result.lib.nixosSystem;
};
darwin = lib.options.create {
type = lib.types.function lib.types.raw;
default.value = _name: config.inputs.darwin.result.lib.darwinSystem;
};
home = lib.options.create {
type = lib.types.function lib.types.raw;
default.value = _name: config.inputs.home-manager.result.lib.homeManagerConfiguration;
};
};
configurations = {
nixos = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = { };
};
darwin = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = { };
};
home = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = { };
};
};
nixosConfigurations = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = builtins.mapAttrs config.configBuilders.nixos config.configurations.nixos;
};
darwinConfigurations = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = builtins.mapAttrs config.configBuilders.darwin config.configurations.darwin;
};
homeConfigurations = lib.options.create {
type = lib.types.attrs.lazy lib.types.raw;
default.value = builtins.mapAttrs config.configBuilders.home config.configurations.home;
};
};
}

View file

@ -2,5 +2,6 @@
includes = [ includes = [
./builders ./builders
./services.nix ./services.nix
./configurations.nix
]; ];
} }

View file

@ -14,14 +14,14 @@ let
{ {
options = { options = {
host = lib.options.create { host = lib.options.create {
type = lib.types.str; type = lib.types.string;
}; };
ports = lib.options.create { ports = lib.options.create {
type = lib.types.list.of lib.types.port; type = lib.types.list.of lib.types.port;
default.value = [ ]; default.value = [ ];
}; };
hosts = lib.options.create { hosts = lib.options.create {
type = lib.types.list.of lib.types.str; type = lib.types.list.of lib.types.string;
default.value = [ config.host ]; default.value = [ config.host ];
}; };
module = lib.options.create { module = lib.options.create {

View file

@ -8,10 +8,9 @@
./modules/nilla ./modules/nilla
./pkgs ./pkgs
./wrappers ./wrappers
./hosts
./services/attic.nix ./assets
./services/forgejo-runner.nix ./services
./services/forgejo.nix
]; ];
config.inputs = builtins.mapAttrs (_: src: { config.inputs = builtins.mapAttrs (_: src: {

View file

@ -1,5 +1,5 @@
{ {
imports = [ includes = [
./attic.nix ./attic.nix
./forgejo-runner.nix ./forgejo-runner.nix
./forgejo.nix ./forgejo.nix