diff --git a/configs/nixos/guests/palworld.nix b/configs/nixos/guests/palworld.nix index 212a20d..71bab38 100644 --- a/configs/nixos/guests/palworld.nix +++ b/configs/nixos/guests/palworld.nix @@ -50,6 +50,12 @@ in description = "Public IP address advertised by the Palworld server."; }; + autoStart = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Start the Palworld server after the guest reaches network readiness."; + }; + passwordSecret = lib.mkOption { type = lib.types.str; default = "services/game-servers/password"; @@ -82,7 +88,7 @@ in guests.palworld = { interior.modules.services.games.palworld = { enable = true; - inherit (cfg) serverName port publicIP; + inherit (cfg) serverName port publicIP autoStart; inherit steamDir installDir stateDir; passwordFile = "/run/secrets/${cfg.passwordSecret}"; adminPasswordFile = "/run/secrets/${cfg.adminPasswordSecret}"; diff --git a/configs/nixos/hosts/pikachu/default.nix b/configs/nixos/hosts/pikachu/default.nix index 2853ea6..6ed01b0 100644 --- a/configs/nixos/hosts/pikachu/default.nix +++ b/configs/nixos/hosts/pikachu/default.nix @@ -94,6 +94,7 @@ installPath = "/pikachu/data/servers/palworld/tracion"; statePath = "/pikachu/media/games/servers/palworld/tracion"; serverName = "Tracion"; + autoStart = false; adminPasswordSecret = "services/game-servers/admin/password"; publicIP = config.guests.palworld.address; reverseProxy = { diff --git a/configs/nixos/modules/services/games/palworld.nix b/configs/nixos/modules/services/games/palworld.nix index 7c321da..4e2fa66 100644 --- a/configs/nixos/modules/services/games/palworld.nix +++ b/configs/nixos/modules/services/games/palworld.nix @@ -56,6 +56,12 @@ description = "Advertise the server in Palworld's public lobby."; }; + autoStart = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Start the Palworld server after the guest reaches network readiness."; + }; + rcon = { enable = lib.mkEnableOption "Palworld RCON" // { default = true; @@ -126,6 +132,7 @@ inherit (service) steamDir installDir stateDir; serviceName = "palworld-${lib.toLower service.serverName}"; appId = 2394010; + inherit (service) autoStart; executable = "${startScript}"; arguments = [ diff --git a/configs/nixos/modules/services/steamcmd.nix b/configs/nixos/modules/services/steamcmd.nix index 4720fc4..e15a517 100644 --- a/configs/nixos/modules/services/steamcmd.nix +++ b/configs/nixos/modules/services/steamcmd.nix @@ -65,6 +65,12 @@ default = [ ]; description = "TCP ports opened for the game service."; }; + + autoStart = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Start the game service after the guest reaches network readiness."; + }; }; config = lib.mkMerge [ @@ -142,24 +148,33 @@ }; }; + "${service.serviceName}-autostart" = { + description = "Queue ${service.serviceName} game server startup"; + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + wantedBy = lib.mkIf service.autoStart [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.systemd}/bin/systemctl --no-block start ${service.serviceName}.service"; + }; + }; + ${service.serviceName} = { description = "${service.serviceName} game server"; after = [ - "multi-user.target" "network-online.target" "steamcmd-${service.serviceName}-update.service" ]; - wants = [ "network-online.target" ]; - wantedBy = [ "multi-user.target" ]; + wants = [ + "network-online.target" + "steamcmd-${service.serviceName}-update.service" + ]; serviceConfig = { Type = "simple"; User = user; Group = group; WorkingDirectory = "-${service.installDir}"; - ExecStartPre = [ - "+${prepareScript}" - updateScript - ]; + ExecStartPre = "+${prepareScript}"; ExecStart = startScript; Restart = "on-failure"; TimeoutStartSec = "15min";