diff options
Diffstat (limited to 'modules/nixos/services')
| -rw-r--r-- | modules/nixos/services/satisfactory/default.nix | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/modules/nixos/services/satisfactory/default.nix b/modules/nixos/services/satisfactory/default.nix new file mode 100644 index 0000000..32e25d5 --- /dev/null +++ b/modules/nixos/services/satisfactory/default.nix @@ -0,0 +1,101 @@ +# based on https://github.com/matejc/helper_scripts/blob/master/nixes/satisfactory.nix +#TODO: separate servers into modules +{ options, config, lib, pkgs, namespace, ... }: + +with lib; with lib.${namespace}; let + cfg = config.${namespace}.services.satisfactory; +in { + options.${namespace}.services.satisfactory = { + enable = lib.mkEnableOption "Enable Satisfactory Dedicated Server"; + + port = mkOption { + type = types.port; + default = 7777; + description = "server port"; + }; + + dir = lib.mkOption { + type = lib.types.path; + default = "/srv/satisfactory"; #TODO: create subdirs for invidividual servers + description = "server dir"; + }; + + channel = lib.mkOption { + type = lib.types.enum [ "public" "experimental" ]; + default = "public"; + description = "release channel"; + }; + + start = mkOption { + type = types.bool; + default = true; + description = "autostart"; + }; + + extraSteamCmdArgs = lib.mkOption { + type = lib.types.str; + default = ""; + }; + }; + + config = lib.mkIf cfg.enable { + users.users.satisfactory = { + group = "satisfactory"; + home = cfg.dir; + createHome = true; + isSystemUser = true; + }; + users.groups.satisfactory = {}; + + #TODO: why tf does steam work but this doesnt?? + # nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + # "steamcmd" + # "steam-unwrapped" + # ]; + + networking = { + firewall = { + allowedTCPPorts = [ cfg.port 8888 ]; + allowedUDPPorts = [ cfg.port ]; + }; + }; + + systemd.services.satisfactory = { + wantedBy = mkIf cfg.start [ "multi-user.target" ]; + + preStart = '' + ${pkgs.steamcmd}/bin/steamcmd \ + +force_install_dir ${cfg.dir}/SatisfactoryDedicatedServer \ + +login anonymous \ + +app_update 1690800 \ + -beta ${cfg.channel} \ + ${cfg.extraSteamCmdArgs} \ + validate \ + +quit + + ${pkgs.patchelf}/bin/patchelf --set-interpreter ${pkgs.glibc}/lib/ld-linux-x86-64.so.2 ${cfg.dir}/SatisfactoryDedicatedServer/Engine/Binaries/Linux/FactoryServer-Linux-Shipping + ln -sfv ${cfg.dir}/.steam/steam/linux64 ${cfg.dir}/.steam/sdk64 + + mkdir -p ${cfg.dir}/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer + ''; + # ${pkgs.crudini}/bin/crudini --set ${cfg.dir}/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/Game.ini '/Script/Engine.GameSession' MaxPlayers ${toString cfg.maxPlayers} + # ${pkgs.crudini}/bin/crudini --set ${cfg.dir}/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/ServerSettings.ini '/Script/FactoryGame.FGServerSubsystem' mAutoPause ${if cfg.autoPause then "True" else "False"} + # ${pkgs.crudini}/bin/crudini --set ${cfg.dir}/SatisfactoryDedicatedServer/FactoryGame/Saved/Config/LinuxServer/ServerSettings.ini '/Script/FactoryGame.FGServerSubsystem' mAutoSaveOnDisconnect ${if cfg.autoSaveOnDisconnect then "True" else "False"} + + script = '' + exec ${cfg.dir}/SatisfactoryDedicatedServer/FactoryServer.sh -Port ${toString cfg.port} + ''; + + serviceConfig = { + Restart = "always"; + User = "satisfactory"; + Group = "satisfactory"; + WorkingDirectory = cfg.dir; + }; + + environment = { + LD_LIBRARY_PATH="SatisfactoryDedicatedServer/linux64:SatisfactoryDedicatedServer/Engine/Binaries/Linux:SatisfactoryDedicatedServer/Engine/Binaries/ThirdParty/PhysX3/Linux/x86_64-unknown-linux-gnu"; + }; + }; + }; +} |