From 846d689b2ce4d6c4df53f12f9b2b636b4351654f Mon Sep 17 00:00:00 2001 From: kurogeek Date: Tue, 5 Aug 2025 16:59:34 +0700 Subject: [PATCH] pingvin service --- inventories/default.nix | 7 +++ machines/b4l/services/pingvin.nix | 45 +++++++++++++++++++ modules/clan/pingvin/default.nix | 23 ++++++++++ modules/clan/pingvin/flake-module.nix | 19 ++++++++ modules/clan/pingvin/tests/vm/default.nix | 42 +++++++++++++++++ .../b4l/b4l-pingvin/subdomain/value | 1 + 6 files changed, 137 insertions(+) create mode 100644 machines/b4l/services/pingvin.nix create mode 100644 modules/clan/pingvin/default.nix create mode 100644 modules/clan/pingvin/flake-module.nix create mode 100644 modules/clan/pingvin/tests/vm/default.nix create mode 100644 vars/per-machine/b4l/b4l-pingvin/subdomain/value diff --git a/inventories/default.nix b/inventories/default.nix index c21931a..2bb8cfd 100644 --- a/inventories/default.nix +++ b/inventories/default.nix @@ -76,6 +76,13 @@ }; roles.default.machines.b4l = { }; }; + pingvin = { + module = { + name = "pingvin"; + input = "self"; + }; + roles.default.machines.b4l = { }; + }; }; }; }; diff --git a/machines/b4l/services/pingvin.nix b/machines/b4l/services/pingvin.nix new file mode 100644 index 0000000..39fbc11 --- /dev/null +++ b/machines/b4l/services/pingvin.nix @@ -0,0 +1,45 @@ +{ + pkgs, + config, + ... +}: +let + serviceName = "${config.networking.hostName}-pingvin"; + domain-name = "${ + config.clan.core.vars.generators."${serviceName}".files.subdomain.value + }.${config.networking.fqdn}"; +in +{ + clan.core.vars.generators."${serviceName}" = { + files = { + subdomain.secret = false; + }; + prompts = { + subdomain = { + persist = true; + type = "line"; + description = "Sub-domain for Pingvin. Default:(share)"; + }; + }; + + runtimeInputs = [ + pkgs.xkcdpass + pkgs.coreutils + ]; + + script = '' + prompt_domain=$(cat "$prompts"/subdomain) + if [[ -n "''${prompt_domain-}" ]]; then + echo $prompt_domain | tr -d "\n" > "$out"/subdomain + else + echo -n "share" > "$out"/subdomain + fi + ''; + }; + + services.pingvin-share = { + nginx.enable = true; + https = true; + hostname = domain-name; + }; +} diff --git a/modules/clan/pingvin/default.nix b/modules/clan/pingvin/default.nix new file mode 100644 index 0000000..4852840 --- /dev/null +++ b/modules/clan/pingvin/default.nix @@ -0,0 +1,23 @@ +{ ... }: +{ + _class = "clan.service"; + manifest.name = "pingvin"; + manifest.description = "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing."; + manifest.categories = [ "System" ]; + + roles.default = { + + perInstance.nixosModule = + { + config, + ... + }: + { + services.pingvin-share = { + enable = true; + }; + + clan.core.state.pingvin-share.folders = [ config.services.pingvin-share.dataDir ]; + }; + }; +} diff --git a/modules/clan/pingvin/flake-module.nix b/modules/clan/pingvin/flake-module.nix new file mode 100644 index 0000000..c750e22 --- /dev/null +++ b/modules/clan/pingvin/flake-module.nix @@ -0,0 +1,19 @@ +{ lib, ... }: +let + module = lib.modules.importApply ./default.nix { }; +in +{ + clan.modules = { + pingvin = module; + }; + + perSystem = + { ... }: + { + clan.nixosTests.pingvin = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules."@clan/pingvin" = module; + }; + }; +} diff --git a/modules/clan/pingvin/tests/vm/default.nix b/modules/clan/pingvin/tests/vm/default.nix new file mode 100644 index 0000000..6fb5316 --- /dev/null +++ b/modules/clan/pingvin/tests/vm/default.nix @@ -0,0 +1,42 @@ +{ + ... +}: +{ + name = "service-pingvin"; + + clan = { + directory = ./.; + inventory = { + machines.server = { }; + + instances = { + pingvin-test = { + module.name = "@clan/pingvin"; + module.input = "self"; + roles.default.machines."server".settings = { }; + }; + }; + }; + }; + + nodes = { + server = { + services.pingvin-share = { + hostname = "share.localhost"; + frontend.port = 3000; + backend.port = 8000; + }; + }; + }; + + testScript = '' + start_all() + + server.wait_for_unit("pingvin-share-frontend") + + server.succeed("systemctl status pingvin-share-frontend") + server.wait_for_open_port(3000) + server.wait_for_open_port(8000) + server.succeed("curl -H \"Host: share.localhost\" http://127.0.0.1:3000 ") + ''; +} diff --git a/vars/per-machine/b4l/b4l-pingvin/subdomain/value b/vars/per-machine/b4l/b4l-pingvin/subdomain/value new file mode 100644 index 0000000..fbd69c0 --- /dev/null +++ b/vars/per-machine/b4l/b4l-pingvin/subdomain/value @@ -0,0 +1 @@ +share \ No newline at end of file