From 03f71af7562445b2ba6538f167375a96f0c6fe6c Mon Sep 17 00:00:00 2001 From: Caroline Larimore Date: Tue, 18 Nov 2025 17:40:18 -0800 Subject: satisfactory: basic satisfactory server --- flake.nix | 2 + modules/nixos/services/satisfactory/default.nix | 101 ++++++++++++++++++++++++ systems/x86_64-linux/copenhagen/default.nix | 4 + 3 files changed, 107 insertions(+) create mode 100644 modules/nixos/services/satisfactory/default.nix diff --git a/flake.nix b/flake.nix index 062d047..54033ab 100644 --- a/flake.nix +++ b/flake.nix @@ -54,6 +54,8 @@ "discord" "obsidian" "minecraft-server" + "steamcmd" + "steam-unwrapped" ]; channels-config.permittedInsecurePackages = [ 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"; + }; + }; + }; +} diff --git a/systems/x86_64-linux/copenhagen/default.nix b/systems/x86_64-linux/copenhagen/default.nix index 7b342a1..fffc729 100644 --- a/systems/x86_64-linux/copenhagen/default.nix +++ b/systems/x86_64-linux/copenhagen/default.nix @@ -48,6 +48,10 @@ with lib; with lib.${namespace}; { port = 25569; }; }; + + satisfactory = { + enable = true; + }; }; }; -- cgit v1.2.3