nix: initiate NixOS module; add ncro to packages output

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I4948bbc2a53adbc64727a1dc935b750e6a6a6964
This commit is contained in:
raf 2026-03-06 22:44:41 +03:00
commit 20029edd1c
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
2 changed files with 74 additions and 2 deletions

67
nix/module.nix Normal file
View file

@ -0,0 +1,67 @@
self: {
config,
pkgs,
lib,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.options) mkOption mkEnableOption mkPackageOption;
format = pkgs.formats.yaml {};
cfg = config.services.ncro;
configFile = format.generate "ncro.yaml" cfg.settings;
in {
options.services.ncro = {
enable = mkEnableOption "ncro, the Nix cache route optimizer";
package = mkPackageOption self.packages.${pkgs.stdenv.hostPlatform.system} ["ncro"] {};
settings = mkOption {
type = format.type;
default = {};
description = ''
ncro configuration as an attribute set. Keys and structure match the
YAML config file format; all defaults are handled by the ncro binary.
'';
example = {
logging.level = "info";
server = {
listen = ":8080";
cache_priority = 20;
};
upstreams = [
{
url = "https://cache.nixos.org";
priority = 10;
}
{
url = "https://nix-community.cachix.org";
priority = 20;
}
];
cache = {
ttl = "2h";
negative_ttl = "15m";
};
};
};
};
config = mkIf cfg.enable {
systemd.services.ncro = {
description = "Nix Cache Route Optimizer";
wantedBy = ["multi-user.target"];
after = ["network.target"];
serviceConfig = {
ExecStart = "${lib.getExe cfg.package} -config ${configFile}";
DynamicUser = true;
StateDirectory = "ncro";
Restart = "on-failure";
RestartSec = "5s";
};
};
};
}