{ lib, config, ... }: let nixosModules = config.flake.modules.nixos; resolvePackagePath = { pkgs, path, }: lib.attrByPath path null pkgs; mkCaddyReverseProxy = { domain, port, extraHeaders ? [ ], extraConfigText ? "", }: let headerLines = map (header: " header_up ${header.name} ${header.value}") extraHeaders; extraConfigLines = map (line: " ${line}") ( lib.filter (line: line != "") (lib.splitString "\n" extraConfigText) ); bodyLines = headerLines ++ extraConfigLines; body = lib.concatStringsSep "\n" bodyLines; in { services.caddy.virtualHosts.${domain}.extraConfig = if body == "" then "reverse_proxy :${toString port}" else '' reverse_proxy :${toString port} { ${body} } ''; }; mkHost = name: machine: { pkgs, ... }: let account = config.repo.account; accountHome = account.homeDirectory or "/home/${account.name}"; normalizedMachine = machine // { inherit name; displays = machine.displays or { }; hmStateVersion = machine.hmStateVersion or machine.stateVersion; portable = machine.portable or false; sshKeys = machine.sshKeys or { }; syncthingId = machine.syncthingId or null; }; in { imports = [ nixosModules.${name} ]; facts.machine = normalizedMachine; networking.hostName = name; system.stateVersion = machine.stateVersion; programs.zsh.enable = true; users.users.${account.name} = { isNormalUser = true; home = accountHome; extraGroups = [ "wheel" "networkmanager" ]; shell = pkgs.zsh; }; home-manager.users.${account.name} = { home = { username = account.name; homeDirectory = accountHome; stateVersion = normalizedMachine.hmStateVersion; }; }; }; in { config.repo.helpers = { inherit mkCaddyReverseProxy mkHost resolvePackagePath ; }; }