{ config, lib, pkgs, ... }: let cfg = config.orbekk.valheim-server; statePath = "/var/lib/${cfg.stateDir}"; in { options = { orbekk.valheim-server = { enable = lib.mkEnableOption "Enable valheim server"; programDir = lib.mkOption { type = lib.types.str; default = null; }; stateDir = lib.mkOption { type = lib.types.str; default = "valheim"; }; statusPort = lib.mkOption { type = lib.types.int; default = 12817; }; }; }; config = lib.mkIf cfg.enable { systemd.services.valheim-server = { description = "Valheim server"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; path = with pkgs; [ steam.run ]; serviceConfig = { DynamicUser = true; StateDirectory = cfg.stateDir; KillSignal = "SIGINT"; }; environment = { HOME = statePath; }; script = '' cd ${cfg.programDir} export templdpath=$LD_LIBRARY_PATH export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH export SteamAppId=892970 steam-run ./valheim_server.x86_64 -name "doomsday" -port 3400 -world "doomsday" -password "$(cat ${statePath}/password.txt)" -savedir ${statePath} -nographics -batchmode ''; }; systemd.services.valheim-server-prober = { description = "Collect metrics for valheim-server"; startAt = "*:0/5"; path = with pkgs; [ moreutils systemd gnugrep coreutils ]; script = '' systemctl show valheim-server | \ grep -E 'IPIngress|IPEgress|CPUUsage' | \ tr '=' ' ' | { while read k v; do echo "# TYPE $k counter" echo "systemd_$k{unit=\"valheim-server.service\"} $v"; done } | \ sponge ${config.orbekk.monitoring-server.textFileDir}/valheim_server.prom ''; }; }; }