From c5c8e0050d8fc369fb818e14204d91128d9dd1e6 Mon Sep 17 00:00:00 2001 From: kurogeek Date: Wed, 30 Jul 2025 17:28:23 +0700 Subject: [PATCH] rework actual-budget to be more generic with test --- inventories/default.nix | 1 - machines/b4l/services/actual-budget.nix | 36 +++++++++++++ modules/clan/actual-budget/default.nix | 50 ++++--------------- modules/clan/actual-budget/flake-module.nix | 19 +++++++ .../clan/actual-budget/tests/vm/default.nix | 34 +++++++++++++ .../b4l/b4l-actual-budget/subdomain/value | 1 + 6 files changed, 101 insertions(+), 40 deletions(-) create mode 100644 machines/b4l/services/actual-budget.nix create mode 100644 modules/clan/actual-budget/flake-module.nix create mode 100644 modules/clan/actual-budget/tests/vm/default.nix create mode 100644 vars/per-machine/b4l/b4l-actual-budget/subdomain/value diff --git a/inventories/default.nix b/inventories/default.nix index bbff363..9474901 100644 --- a/inventories/default.nix +++ b/inventories/default.nix @@ -9,7 +9,6 @@ clan = { modules = { stirling-pdf = ../modules/clan/stirling-pdf; - actual-budget = ../modules/clan/actual-budget; victoria-metrics = ../modules/clan/victoria-metrics; }; inventory = { diff --git a/machines/b4l/services/actual-budget.nix b/machines/b4l/services/actual-budget.nix new file mode 100644 index 0000000..50b1538 --- /dev/null +++ b/machines/b4l/services/actual-budget.nix @@ -0,0 +1,36 @@ +{ config, ... }: +let + abDomain = "${config.clan.core.vars.generators.b4l-actual-budget.files.subdomain.value}.${config.networking.fqdn}"; +in +{ + clan.core.vars.generators.b4l-actual-budget = { + files.subdomain.secret = false; + + prompts = { + subdomain = { + persist = true; + type = "line"; + description = "Sub-domain for Actual Budget app. Default:(budget)"; + }; + }; + + script = ''cat $prompts/subdomain || echo -n "budget" > $out/subdomain''; + }; + + services.actual = { + settings = { + allowedLoginMethods = [ + "password" + "openid" + ]; + trustedProxies = [ "127.0.0.1" ]; + }; + }; + services.nginx.virtualHosts."${abDomain}" = { + useACMEHost = "${config.networking.fqdn}"; + forceSSL = true; + locations."/" = { + proxyPass = "http://localhost:${builtins.toString config.services.actual.settings.port}"; + }; + }; +} diff --git a/modules/clan/actual-budget/default.nix b/modules/clan/actual-budget/default.nix index d625ebb..e2c1df6 100644 --- a/modules/clan/actual-budget/default.nix +++ b/modules/clan/actual-budget/default.nix @@ -1,4 +1,4 @@ -{ lib, ... }: +{ ... }: { _class = "clan.service"; manifest.name = "actual-budget"; @@ -6,49 +6,21 @@ manifest.categories = [ "System" ]; roles.default = { - interface.options = { - domain = lib.mkOption { - type = lib.types.str; - default = "budget"; - description = "Sub domain for Actual Budget."; - }; - }; - perInstance = + perInstance.nixosModule = { - settings, + lib, + config, ... }: { - nixosModule = - { - config, - ... - }: - let - domain = "${settings.domain}.${config.networking.fqdn}"; - in - { - services.actual = { - enable = true; - openFirewall = true; - settings = { - port = 5006; - allowedLoginMethods = [ - "password" - "openid" - ]; - trustedProxies = [ "127.0.0.1" ]; - }; - }; - services.nginx.virtualHosts."${domain}" = { - forceSSL = true; - useACMEHost = "${config.networking.fqdn}"; - locations."/" = { - proxyPass = "http://localhost:${builtins.toString config.services.actual.settings.port}"; - }; - }; - }; + services.actual = { + enable = lib.mkDefault true; + }; + + clan.core.state.actual-budget.folders = [ + config.systemd.services.actual.serviceConfig.WorkingDirectory + ]; }; }; } diff --git a/modules/clan/actual-budget/flake-module.nix b/modules/clan/actual-budget/flake-module.nix new file mode 100644 index 0000000..73520c5 --- /dev/null +++ b/modules/clan/actual-budget/flake-module.nix @@ -0,0 +1,19 @@ +{ lib, ... }: +let + module = lib.modules.importApply ./default.nix { }; +in +{ + clan.modules = { + actual-budget = module; + }; + + perSystem = + { ... }: + { + clan.nixosTests.actual-budget = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules."@clan/actual-budget" = module; + }; + }; +} diff --git a/modules/clan/actual-budget/tests/vm/default.nix b/modules/clan/actual-budget/tests/vm/default.nix new file mode 100644 index 0000000..85fbd3d --- /dev/null +++ b/modules/clan/actual-budget/tests/vm/default.nix @@ -0,0 +1,34 @@ +{ + ... +}: +{ + name = "service-actual-budget"; + + clan = { + directory = ./.; + inventory = { + machines.server = { }; + + instances = { + actual-budget-test = { + module.name = "@clan/actual-budget"; + module.input = "self"; + roles.default.machines."server".settings = { }; + }; + }; + }; + }; + + nodes = { + server = { }; + }; + + testScript = '' + start_all() + + server.wait_for_unit("actual") + + server.succeed("systemctl status actual") + + ''; +} diff --git a/vars/per-machine/b4l/b4l-actual-budget/subdomain/value b/vars/per-machine/b4l/b4l-actual-budget/subdomain/value new file mode 100644 index 0000000..e215a09 --- /dev/null +++ b/vars/per-machine/b4l/b4l-actual-budget/subdomain/value @@ -0,0 +1 @@ +budget \ No newline at end of file