nix machine / user configurations

feat(wolumonde): setup headplane as headscale ui [skip ci]

ptr.pet 93f1e8de 7512a05e

verified
Changed files
+93
_sources
hosts
wolumonde
pkgs-set
secrets
+21
_sources/generated.json
···
},
"version": "be828766411cad04c194c8f714d46aa2b2596362"
},
+
"headplane": {
+
"cargoLocks": null,
+
"date": "2025-07-23",
+
"extract": null,
+
"name": "headplane",
+
"passthru": null,
+
"pinned": false,
+
"src": {
+
"deepClone": false,
+
"fetchSubmodules": false,
+
"leaveDotGit": false,
+
"name": null,
+
"owner": "90-008",
+
"repo": "headplane",
+
"rev": "e9fe8625db3b03c121e0b7fb50add4cd729d986c",
+
"sha256": "sha256-KM7Jxrab3o38tJr3gA6wQ2zalZ2N5yK4d65r3KhGZKg=",
+
"sparseCheckout": [],
+
"type": "github"
+
},
+
"version": "e9fe8625db3b03c121e0b7fb50add4cd729d986c"
+
},
"home": {
"cargoLocks": null,
"date": "2025-07-22",
+12
_sources/generated.nix
···
};
date = "2025-07-21";
};
+
headplane = {
+
pname = "headplane";
+
version = "e9fe8625db3b03c121e0b7fb50add4cd729d986c";
+
src = fetchFromGitHub {
+
owner = "90-008";
+
repo = "headplane";
+
rev = "e9fe8625db3b03c121e0b7fb50add4cd729d986c";
+
fetchSubmodules = false;
+
sha256 = "sha256-KM7Jxrab3o38tJr3gA6wQ2zalZ2N5yK4d65r3KhGZKg=";
+
};
+
date = "2025-07-23";
+
};
home = {
pname = "home";
version = "0cdfcdbb525b77b951c889b6131047bc374f48fe";
+50
hosts/wolumonde/modules/headplane.nix
···
+
{lib, config, pkgs, terra, inputs, ...}:
+
let
+
format = pkgs.formats.yaml {};
+
+
# A workaround generate a valid Headscale config accepted by Headplane when `config_strict == true`.
+
settings = lib.recursiveUpdate config.services.headscale.settings {
+
acme_email = "/dev/null";
+
tls_cert_path = "/dev/null";
+
tls_key_path = "/dev/null";
+
policy.path = "/dev/null";
+
oidc.client_secret_path = "/dev/null";
+
};
+
+
headscaleConfig = format.generate "headscale.yml" settings;
+
+
cfg = config.services.headplane.settings;
+
in {
+
imports = ["${inputs.headplane}/nix/module.nix"];
+
+
services.headplane = {
+
enable = true;
+
package = terra.headplane;
+
agent.enable = false;
+
settings = {
+
server = {
+
host = "0.0.0.0";
+
port = 4444;
+
cookie_secret = lib.fixedWidthString 32 "0" "";
+
cookie_secure = false;
+
};
+
headscale = {
+
url = config.services.headscale.settings.server_url;
+
config_path = "${headscaleConfig}";
+
config_strict = true;
+
};
+
integration.proc.enabled = true;
+
oidc = {
+
issuer = config.services.pocket-id.settings.APP_URL;
+
client_id = "2aae8944-94c3-42bb-8cb9-86ce85b1ee43";
+
client_secret = "";
+
token_endpoint_auth_method = "client_secret_post";
+
headscale_api_key = "";
+
disable_api_key_login = true;
+
redirect_uri = "http://wolumonde:${toString cfg.server.port}/admin/oidc/callback";
+
};
+
};
+
};
+
age.secrets.headplaneSecrets.file = ../../../secrets/headplaneSecrets.age;
+
systemd.services.headplane.serviceConfig.EnvironmentFile = config.age.secrets.headplaneSecrets.path;
+
}
+1
hosts/wolumonde/modules/headscale.nix
···
port = 1111;
settings = {
server_url = "https://${domain}";
+
policy.mode = "database";
dns = {
base_domain = "lan.${rootDomain}";
nameservers.global = ["1.1.1.1" "1.0.0.1" "9.9.9.9" "149.112.112.112"];
+4
nvfetcher.toml
···
# nvfetcher configuration for Nix flake inputs
+
[headplane]
+
src.git = "https://github.com/90-008/headplane"
+
fetch.github = "90-008/headplane"
+
[lix-module]
src.manual = "2.93.2-1"
fetch.tarball = "https://git.lix.systems/lix-project/nixos-module/archive/2.93.2-1.tar.gz"
+1
pkgs-set/pkgs/headplane.nix
···
+
{callPackage, inputs, ...}: callPackage "${inputs.headplane}/nix/package.nix" {}
secrets/headplaneSecrets.age

This is a binary file and will not be displayed.

+4
secrets/secrets.nix
···
yusdacra
wolumonde
];
+
"headplaneSecrets.age".publicKeys = [
+
yusdacra
+
wolumonde
+
];
"tailscaleAuthKey.age".publicKeys = [
yusdacra
wolumonde