refactor(nixos): inline SteamCMD module config

This commit is contained in:
2026-09-09 22:11:46 -04:00
parent 1b450f434f
commit 16f34f3a8d

View File

@@ -4,9 +4,6 @@
pkgs, pkgs,
... ...
}: }:
let
cfg = config.modules.services.steamcmd;
in
{ {
options.modules.services.steamcmd = { options.modules.services.steamcmd = {
enable = lib.mkEnableOption "SteamCMD-managed game server"; enable = lib.mkEnableOption "SteamCMD-managed game server";
@@ -142,107 +139,107 @@ in
registry."stable-uid".${config.networking.hostName}.steamcmd = 20003; registry."stable-uid".${config.networking.hostName}.steamcmd = 20003;
} }
(lib.mkIf cfg.enable ( (lib.mkIf config.modules.services.steamcmd.enable (
let let
prepareScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-prepare" '' prepareScript = pkgs.writeShellScript "steamcmd-${config.modules.services.steamcmd.serviceName}-prepare" ''
set -eu set -eu
${pkgs.coreutils}/bin/install -d \ ${pkgs.coreutils}/bin/install -d \
-o ${lib.escapeShellArg cfg.user} \ -o ${lib.escapeShellArg config.modules.services.steamcmd.user} \
-g ${lib.escapeShellArg cfg.group} \ -g ${lib.escapeShellArg config.modules.services.steamcmd.group} \
-m 0770 \ -m 0770 \
${lib.escapeShellArg cfg.steamDir} \ ${lib.escapeShellArg config.modules.services.steamcmd.steamDir} \
${lib.escapeShellArg cfg.installDir} \ ${lib.escapeShellArg config.modules.services.steamcmd.installDir} \
${lib.escapeShellArg cfg.stateDir} ${lib.escapeShellArg config.modules.services.steamcmd.stateDir}
''; '';
updateScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-update" '' updateScript = pkgs.writeShellScript "steamcmd-${config.modules.services.steamcmd.serviceName}-update" ''
set -eu set -eu
export HOME=${lib.escapeShellArg cfg.steamDir} export HOME=${lib.escapeShellArg config.modules.services.steamcmd.steamDir}
exec ${lib.getExe cfg.package} \ exec ${lib.getExe config.modules.services.steamcmd.package} \
+force_install_dir ${lib.escapeShellArg cfg.installDir} \ +force_install_dir ${lib.escapeShellArg config.modules.services.steamcmd.installDir} \
+login anonymous \ +login anonymous \
+app_update ${toString cfg.appId} ${lib.optionalString cfg.validateUpdate "validate"} \ +app_update ${toString config.modules.services.steamcmd.appId} ${lib.optionalString config.modules.services.steamcmd.validateUpdate "validate"} \
+quit +quit
''; '';
libraryPath = lib.concatStringsSep ":" cfg.libraryDirs; libraryPath = lib.concatStringsSep ":" config.modules.services.steamcmd.libraryDirs;
startScript = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-start" '' startScript = pkgs.writeShellScript "steamcmd-${config.modules.services.steamcmd.serviceName}-start" ''
set -eu set -eu
cd ${lib.escapeShellArg cfg.installDir} cd ${lib.escapeShellArg config.modules.services.steamcmd.installDir}
${lib.optionalString (cfg.libraryDirs != [ ]) ''export LD_LIBRARY_PATH=${lib.escapeShellArg libraryPath}:''${LD_LIBRARY_PATH-}''} ${lib.optionalString (config.modules.services.steamcmd.libraryDirs != [ ]) ''export LD_LIBRARY_PATH=${lib.escapeShellArg libraryPath}:''${LD_LIBRARY_PATH-}''}
exec ${lib.getExe pkgs.steam-run} ${lib.escapeShellArg cfg.executable} ${lib.escapeShellArgs cfg.arguments} exec ${lib.getExe pkgs.steam-run} ${lib.escapeShellArg config.modules.services.steamcmd.executable} ${lib.escapeShellArgs config.modules.services.steamcmd.arguments}
''; '';
restartCommand = restartCommand =
if cfg.restart.command != null then if config.modules.services.steamcmd.restart.command != null then
cfg.restart.command config.modules.services.steamcmd.restart.command
else else
"systemctl restart ${lib.escapeShellArg cfg.serviceName}.service"; "systemctl restart ${lib.escapeShellArg config.modules.services.steamcmd.serviceName}.service";
in in
{ {
users.groups.${cfg.group} = { }; users.groups.${config.modules.services.steamcmd.group} = { };
users.users.${cfg.user} = { users.users.${config.modules.services.steamcmd.user} = {
isSystemUser = true; isSystemUser = true;
uid = config.registry."stable-uid".${config.networking.hostName}.steamcmd; uid = config.registry."stable-uid".${config.networking.hostName}.steamcmd;
group = cfg.group; group = config.modules.services.steamcmd.group;
home = cfg.steamDir; home = config.modules.services.steamcmd.steamDir;
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" "d ${config.modules.services.steamcmd.steamDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
"z ${cfg.steamDir} 0770 ${cfg.user} ${cfg.group} - -" "z ${config.modules.services.steamcmd.steamDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
"d ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" "d ${config.modules.services.steamcmd.installDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
"z ${cfg.installDir} 0770 ${cfg.user} ${cfg.group} - -" "z ${config.modules.services.steamcmd.installDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
"d ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" "d ${config.modules.services.steamcmd.stateDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
"z ${cfg.stateDir} 0770 ${cfg.user} ${cfg.group} - -" "z ${config.modules.services.steamcmd.stateDir} 0770 ${config.modules.services.steamcmd.user} ${config.modules.services.steamcmd.group} - -"
]; ];
systemd.services = { systemd.services = {
"steamcmd-${cfg.serviceName}-update" = { "steamcmd-${config.modules.services.steamcmd.serviceName}-update" = {
description = "Update ${cfg.serviceName} with SteamCMD"; description = "Update ${config.modules.services.steamcmd.serviceName} with SteamCMD";
after = [ "network-online.target" ]; after = [ "network-online.target" ];
wants = [ "network-online.target" ]; wants = [ "network-online.target" ];
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
User = cfg.user; User = config.modules.services.steamcmd.user;
Group = cfg.group; Group = config.modules.services.steamcmd.group;
WorkingDirectory = "-${cfg.steamDir}"; WorkingDirectory = "-${config.modules.services.steamcmd.steamDir}";
ExecStartPre = "+${prepareScript}"; ExecStartPre = "+${prepareScript}";
ExecStart = updateScript; ExecStart = updateScript;
}; };
}; };
${cfg.serviceName} = { ${config.modules.services.steamcmd.serviceName} = {
description = "${cfg.serviceName} game server"; description = "${config.modules.services.steamcmd.serviceName} game server";
after = [ after = [
"network-online.target" "network-online.target"
"steamcmd-${cfg.serviceName}-update.service" "steamcmd-${config.modules.services.steamcmd.serviceName}-update.service"
]; ];
wants = [ "network-online.target" ]; wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
path = [ pkgs.steam-run ]; path = [ pkgs.steam-run ];
serviceConfig = { serviceConfig = {
Type = "simple"; Type = "simple";
User = cfg.user; User = config.modules.services.steamcmd.user;
Group = cfg.group; Group = config.modules.services.steamcmd.group;
WorkingDirectory = "-${cfg.installDir}"; WorkingDirectory = "-${config.modules.services.steamcmd.installDir}";
EnvironmentFile = cfg.environmentFiles; EnvironmentFile = config.modules.services.steamcmd.environmentFiles;
ExecStartPre = [ ExecStartPre = [
"+${prepareScript}" "+${prepareScript}"
] ++ lib.optional cfg.updateOnStart updateScript; ] ++ lib.optional config.modules.services.steamcmd.updateOnStart updateScript;
ExecStart = startScript; ExecStart = startScript;
Restart = "on-failure"; Restart = "on-failure";
}; };
}; };
"steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { "steamcmd-${config.modules.services.steamcmd.serviceName}-restart" = lib.mkIf config.modules.services.steamcmd.restart.enable {
description = "Restart ${cfg.serviceName}"; description = "Restart ${config.modules.services.steamcmd.serviceName}";
serviceConfig = { serviceConfig = {
Type = "oneshot"; Type = "oneshot";
ExecStart = pkgs.writeShellScript "steamcmd-${cfg.serviceName}-restart" '' ExecStart = pkgs.writeShellScript "steamcmd-${config.modules.services.steamcmd.serviceName}-restart" ''
set -eu set -eu
exec ${restartCommand} exec ${restartCommand}
@@ -251,18 +248,18 @@ in
}; };
}; };
systemd.timers."steamcmd-${cfg.serviceName}-restart" = lib.mkIf cfg.restart.enable { systemd.timers."steamcmd-${config.modules.services.steamcmd.serviceName}-restart" = lib.mkIf config.modules.services.steamcmd.restart.enable {
description = "Restart ${cfg.serviceName} on a schedule"; description = "Restart ${config.modules.services.steamcmd.serviceName} on a schedule";
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];
timerConfig = { timerConfig = {
OnCalendar = cfg.restart.onCalendar; OnCalendar = config.modules.services.steamcmd.restart.onCalendar;
RandomizedDelaySec = cfg.restart.randomizedDelaySec; RandomizedDelaySec = config.modules.services.steamcmd.restart.randomizedDelaySec;
Persistent = true; Persistent = true;
}; };
}; };
networking.firewall.allowedTCPPorts = cfg.tcpPorts; networking.firewall.allowedTCPPorts = config.modules.services.steamcmd.tcpPorts;
networking.firewall.allowedUDPPorts = cfg.udpPorts; networking.firewall.allowedUDPPorts = config.modules.services.steamcmd.udpPorts;
} }
)) ))
]; ];