Okay, so this post is ever-so-slightly off-topic from what I usually write about here - but I'm allowed to have fun sometimes, right?
With the holidays coming up, I'm getting ready to take some time off & relax with my favorite video games.
And just in time, Satisfactory just released their new Update 5 content - which finally adds support for dedicated servers. So I'll be able to more easily play with friends & family who are in different time zones.
This will be a quick guide, mostly derived from the Satisfactory Wiki with some additional steps/context.
Disclaimer: The dedicated server software is pretty new & still a work in progress, so I imagine there is a good chance some of these steps may change. I'll do my best to keep it updated!
A Quick Note
Before getting started, just a quick note about what is used for this setup & what assumptions are made.
This guide will walk through building a new dedicated server on Debian 11. There is additional information regarding other Linux distributions & Windows in the Satisfactory Wiki page linked above.
This guide assumes that you have some fairly basic level of Linux knowledge. You should be comfortable with connecting to a Linux server via SSH and editing files. If you need additional guidance, please consider checking out the video above where I walk through the whole process!
This guide will not look at installing Linux, or setting up port forwarding, etc. We will only be focusing on getting the dedicated server software installed & running.
Setting up Static Networking
By default my Debian 11 install was configured with a dynamic / DHCP address. While this might work for other use cases, we'll want to set a static IP address for our game server.
So first we'll open up our network config file, using the following command:
sudo nano /etc/network/interfaces
Then, we'll update our network config to look like the one below:
auto ens192 iface ens192 inet static address 192.168.1.20 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 18.104.22.168
Please note, the values listed above are for example only. You'll need to assign the correct addressing from your own local network. If you're unsure about the interface name (mine is
ens192), you can use the command
ip address to list current network interfaces & find yours.
Once we've edited our network configuration, we'll need to restart the network process for the changes to take effect:
sudo systemctl restart networking
Note: Assuming the static IP you configure is different than the current dynamically-assigned IP, you will lose connection with your server & need to reconnect using the new IP address.
Next, we'll need to install the Steam commandline utility so we can download & manage our server.
On Debian, the default repositories don't include this package. So we'll need to add a third-party package repository.
We'll edit our active/configured repositories with the following command:
sudo nano /etc/apt/sources.list
Then add the following at the end of the file:
deb http://mirrors.linode.com/debian bullseye main non-free deb-src http://mirrors.linode.com/debian bullseye main non-free
We'll also need to enable multiarchitecture support:
sudo dpkg --add-architecture i386
Once that's done, we'll update our local cache to include the newly available list of packages:
sudo apt-get update
Then we can install steamcmd:
sudo apt-get install steamcmd
We will likely want to create a dedicated user to run our game server. We'll create a user called
steam using the following command:
sudo useradd -m steam
Then we can switch to our
steam user account:
Optionally, we can create a shortcut to the steamcmd executable within the steam user's home directory:
ln -s /usr/games/steamcmd steamcmd
Download / Install Satisfactory Dedicated Server
Now we can pull down a copy of the server software.
Assuming you've created the steamcmd shortcut as shown above, we can use the following command to pull down the server software:
./steamcmd +force_install_dir ~/satisfactory +login anonymous +app_update 1690800 validate +quit
This command does a few things:
- +force_install_dir - Tells steamcmd which directory to place the game files in, in this case ~/satisfactory
- +login anonymous - Skip logging in with a steam user account, since we just need to download an update
- +app_update 1690800 - This is the Satisfactory server application ID, so steamcmd knows which software to install
- validate - Runs a validation to ensure that the current files match what's hosted on Steam
- +quit - Asks steamcmd to log off of Steam when everything is finished.
If we wanted to use the experimental branch, we would also add the flag:
Once that command finishes running, the Satisfactory software should be downloaded!
We can try to test this out by running the software manually first. Using the following command to move into the game server folder, and execute the software:
cd ~/satisfactory && ./FactoryServer.sh
Assuming it runs, we can press
Ctrl-C at any point to stop the game server.
Registering a Background Service
Okay, so we were able to run the server software manually for a quick test - but we'll want to configure it to run as a background service that will start & stop with our Linux system. We'll use the info located on the Satisfactory Wiki.
So we'll create a new service definition using the following command:
sudo nano /etc/systemd/system/satisfactory.service
Then paste the following into that file:
[Unit] Description=Satisfactory dedicated server Wants=network-online.target After=syslog.target network.target nss-lookup.target network-online.target [Service] Environment="LD_LIBRARY_PATH=./linux64" ExecStartPre=/usr/games/steamcmd +force_install_dir "/home/steam/SatisfactoryDedicatedServer" +login anonymous +app_update 1690800 validate +quit ExecStart=/home/steam/SatisfactoryDedicatedServer/FactoryServer.sh User=steam Group=steam StandardOutput=journal Restart=on-failure WorkingDirectory=/home/steam/SatisfactoryDedicatedServer [Install] WantedBy=multi-user.target
Please note, if you used a different user account name (instead of
steam), or downloaded the game in a different directory - you will need to modify those values in the above text.
Once that's done, we can enable our new service to start & stop with the machine:
sudo systemctl enable satisfactory.service
Then we can start the game server:
sudo systemctl start satisfactory.service
After a few seconds, we can check the service status here:
sudo systemctl status satisfactory.service
If everything looks good, you should see output similar to below:
● satisfactory.service - Satisfactory dedicated server Loaded: loaded (/etc/systemd/system/satisfactory.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-12-01 11:45:31 EST; 18s ago Process: 3679 ExecStartPre=/usr/games/steamcmd +force_install_dir /home/steam/SatisfactoryDedicatedServer +login anonymous +app_update 1690800 validate +quit (code=exited, status=0/SUCCESS) Main PID: 3749 (FactoryServer.s) Tasks: 21 (limit: 7087) Memory: 1.0G CPU: 18.526s CGroup: /system.slice/satisfactory.service ├─3749 /bin/sh /home/steam/SatisfactoryDedicatedServer/FactoryServer.sh └─3756 /home/steam/SatisfactoryDedicatedServer/Engine/Binaries/Linux/UE4Server-Linux-Shipping FactoryGame Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:178][ 0]LogAIModule: Creating AISystem for world DedicatedserverEntry Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:178][ 0]LogLoad: Game class is 'BP_GameModeMenu_C' Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:179][ 0]LogReplicationGraph: Display: SetActorDiscoveryBudget set to 20 kBps (5333 bits per network tick). Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]LogNetCore: DDoS detection status: detection enabled: 0 analytics enabled: 0 Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]LogInit: BSD IPv4/6: Socket queue. Rx: 262144 (config 131072) Tx: 262144 (config 131072) Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]LogNet: Created socket for bind address: :: on port 7777 Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]PacketHandlerLog: Loaded PacketHandler component: DTLSHandlerComponent () Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]PacketHandlerLog: Loaded PacketHandler component: Engine.EngineHandlerComponentFactory (StatelessConnectHandlerComponent) Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]LogNet: GameNetDriver EOSNetDriver_2147482561 IpNetDriver listening on port 7777 Dec 01 11:45:33 Satisfactory FactoryServer.sh: [2021.12.01-16.45.33:205][ 0]LogWorld: Bringing World /Game/FactoryGame/Map/DedicatedserverEntry.DedicatedserverEntry up for play (max tick rate 30) at 2021.12.01-11.45.33
Joining the Server
We're almost there!
After the game server has been set up & running, we'll need to perform the initial setup within the game itself.
So it's time to launch Satisfactory & setup our game server!
In the screenshot above, the title screen now has an option for Server Manager. We'll click that. You should then see an option to add server, which will display the following dialog:
Here's where we put in the IP or hostname of our local dedicated server.
As a reminder: If you have someone outside of your local network, they'll need a different address to connect. Again, this post won't dive into port forwarding or allowing access through your home router - there are plenty of good tutorials out there already!
After we successfully connect to our server, we'll be prompted to claim it. Since it's newly created, this is where we can set our admin login & the server name.
First we'll be asked to provide a name to claim the server:
Then an administrator password - don't forget to save this somewhere safe!
Okay. So now we'll have a few options. First we'll check out the settings page:
Here we can modify our server name or update our admin password if we need to.
We can also set a Player password - This will keep people from joining your server unless they know the password.
Interestingly enough, we can opt to have the game pause when no players are connected - or uncheck the box to let your factory continue building even when no one is playing.
And lastly an option to autosave whenever someone disconnects from the server.
If we're good with those settings - we can start a new game session!
We'll head over to the Create Game tab:
This should look pretty similar to the normal game. Select the starting area & give the session a name.
We'll also have a checkbox to automatically enter the game after it's done being created. If you don't check this box, you can enter the server from the Server Status page:
Here we can get a quick view of the current server status - which tier we're on, the current milestone, and whether or not anyone is currently connected.
Down in the bottom left, we'll have our Join Game button.
Time to play!
Okay - and that about wraps it up. I hope this post was helpful for anyone else looking to build a dedicated server. The process was surprisingly easy, and I greatly appreciate the effort that the Coffee Stain devs have put into this!!