{ lib, config, ... }: with lib; { options = { headscale = { enable = mkEnableOption "enables headscale"; port = lib.mkOption { type = lib.types.int; default = 8082; description = "The port that headscale is served on."; }; domain = lib.mkOption { type = lib.types.str; default = "headscale.wastring.com"; description = "The domain that headscale is served on."; }; baseDomain = lib.mkOption { type = lib.types.str; default = "tailnet.wastring.com"; description = "The base-domain that headscale is served on."; }; }; }; config = mkMerge [ (mkIf config.headscale.enable { services = { headscale = { enable = true; address = "0.0.0.0"; port = config.headscale.port; settings = { server_url = "https://${config.headscale.domain}"; logtail.enabled = false; dns = { base_domain = config.headscale.baseDomain; nameservers.global = [ "1.1.1.1" "8.8.8.8" ]; }; }; }; nginx.virtualHosts.${config.headscale.domain} = { forceSSL = true; enableACME = true; locations."/" = { proxyPass = "http://localhost:${toString config.headscale.port}"; proxyWebsockets = true; }; }; }; }) ]; }