aboutsummaryrefslogtreecommitdiff
path: root/modules/nixos/services/satisfactory/default.nix
blob: 32e25d512d5741147fcd4477141c3fab7d8638f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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";
      };
    };
  };
}