diff --git a/nixos/doc/manual/release-notes/rl-2405.section.md b/nixos/doc/manual/release-notes/rl-2405.section.md index 92702cce1896..f2ca81f4c445 100644 --- a/nixos/doc/manual/release-notes/rl-2405.section.md +++ b/nixos/doc/manual/release-notes/rl-2405.section.md @@ -95,6 +95,8 @@ Use `services.pipewire.extraConfig` or `services.pipewire.configPackages` for Pi - [hebbot](https://github.com/haecker-felix/hebbot), a Matrix bot to generate "This Week in X" like blog posts. Available as [services.hebbot](#opt-services.hebbot.enable). +- [Workout-tracker](https://github.com/jovandeginste/workout-tracker), a workout tracking web application for personal use. + - [Python Matter Server](https://github.com/home-assistant-libs/python-matter-server), a Matter Controller Server exposing websocket connections for use with other services, notably Home Assistant. Available as [services.matter-server](#opt-services.matter-server.enable) diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index d89d294b0469..6f105d6a45c8 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -796,6 +796,7 @@ ./services/misc/tzupdate.nix ./services/misc/uhub.nix ./services/misc/weechat.nix + ./services/misc/workout-tracker.nix ./services/misc/xmr-stak.nix ./services/misc/xmrig.nix ./services/misc/zoneminder.nix diff --git a/nixos/modules/services/misc/workout-tracker.nix b/nixos/modules/services/misc/workout-tracker.nix new file mode 100644 index 000000000000..13555504be30 --- /dev/null +++ b/nixos/modules/services/misc/workout-tracker.nix @@ -0,0 +1,83 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + inherit (lib) types; + cfg = config.services.workout-tracker; + stateDir = "workout-tracker"; +in + +{ + options = { + services.workout-tracker = { + enable = lib.mkEnableOption "workout tracking web application for personal use (or family, friends), geared towards running and other GPX-based activities"; + + package = lib.mkPackageOption pkgs "workout-tracker" { }; + + address = lib.mkOption { + type = types.str; + default = "127.0.0.1"; + description = "Web interface address."; + }; + + port = lib.mkOption { + type = types.port; + default = 8080; + description = "Web interface port."; + }; + + environmentFile = lib.mkOption { + type = types.nullOr types.path; + default = null; + example = "/run/keys/workout-tracker.env"; + description = '' + An environment file as defined in {manpage}`systemd.exec(5)`. + + Secrets like `WT_JWT_ENCRYPTION_KEY` may be passed to the service without adding them + to the world-readable Nix store. + ''; + }; + + settings = lib.mkOption { + type = types.attrsOf types.str; + + default = { }; + description = '' + Extra config options. + ''; + example = { + WT_LOGGING = "true"; + WT_DEBUG = "false"; + WT_DATABASE_DRIVER = "sqlite"; + WT_DSN = "./database.db"; + }; + }; + }; + }; + + config = lib.mkIf cfg.enable { + systemd.services.workout-tracker = { + description = "A workout tracking web application for personal use (or family, friends), geared towards running and other GPX-based activities"; + wantedBy = [ "multi-user.target" ]; + environment = { + WT_BIND = "${cfg.address}:${toString cfg.port}"; + WT_DATABASE_DRIVER = "sqlite"; + WT_DSN = "./database.db"; + } // cfg.settings; + serviceConfig = { + ExecStart = lib.getExe cfg.package; + DynamicUser = true; + StateDirectory = stateDir; + WorkingDirectory = "%S/${stateDir}"; + Restart = "always"; + EnvironmentFile = lib.optional (cfg.environmentFile != null) cfg.environmentFile; + }; + }; + }; + + meta.maintainers = with lib.maintainers; [ bhankas ]; +} diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 9cff268ae1d1..88eaee9a9a53 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -991,6 +991,7 @@ in { wireguard = handleTest ./wireguard {}; without-nix = handleTest ./without-nix.nix {}; wmderland = handleTest ./wmderland.nix {}; + workout-tracker = handleTest ./workout-tracker.nix {}; wpa_supplicant = handleTest ./wpa_supplicant.nix {}; wordpress = handleTest ./wordpress.nix {}; wrappers = handleTest ./wrappers.nix {}; diff --git a/nixos/tests/workout-tracker.nix b/nixos/tests/workout-tracker.nix new file mode 100644 index 000000000000..1ad509edf2d4 --- /dev/null +++ b/nixos/tests/workout-tracker.nix @@ -0,0 +1,29 @@ +import ./make-test-python.nix ( + { lib, pkgs, ... }: + + { + name = "workout-tracker"; + + meta.maintainers = with lib.maintainers; [ bhankas ]; + + nodes.machine = + { config, ... }: + { + virtualisation.memorySize = 2048; + + services.workout-tracker.enable = true; + }; + + testScript = '' + start_all() + machine.wait_for_unit("workout-tracker.service") + # wait for workout-tracker to fully come up + + with subtest("workout-tracker service starts"): + machine.wait_until_succeeds( + "curl -sSfL http://localhost:8080/ > /dev/null", + timeout=30 + ) + ''; + } +)