self: { config, lib, pkgs, ... }: let cfg = config.services.stardew-tracker; in { options.services.stardew-tracker = { enable = lib.mkEnableOption "the shared Stardew Valley two-year tracker"; package = lib.mkOption { type = lib.types.package; default = self.packages.${pkgs.stdenv.hostPlatform.system}.default; defaultText = lib.literalExpression "stardew-tracker.packages.${pkgs.stdenv.hostPlatform.system}.default"; description = "The stardew-tracker package to run."; }; port = lib.mkOption { type = lib.types.port; default = 8089; description = "Loopback TCP port used by the tracker."; }; }; config = lib.mkIf cfg.enable { users.users.stardew-tracker = { isSystemUser = true; group = "stardew-tracker"; description = "Stardew tracker service user"; }; users.groups.stardew-tracker = { }; systemd.services.stardew-tracker = { description = "Shared Stardew Valley tracker"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { ExecStart = "${cfg.package}/bin/stardew-tracker --host 127.0.0.1 --port ${toString cfg.port} --database /var/lib/stardew-tracker/progress.sqlite3"; User = "stardew-tracker"; Group = "stardew-tracker"; StateDirectory = "stardew-tracker"; Restart = "on-failure"; RestartSec = 3; NoNewPrivileges = true; PrivateTmp = true; ProtectSystem = "strict"; ProtectHome = true; ProtectKernelTunables = true; ProtectKernelModules = true; ProtectControlGroups = true; RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ]; }; }; }; }