Level 0: Local Sandbox Server
Pre-Packaged server builds should not be used for custom content
- (Windows Only) Download and install the Latest Microsoft Visual C++ Redistributable version. (Resolves “Unable to load DLL libsodium” and similar errors)
- Download and install the .NET 10 Runtime located at the bottom left colum. Make sure you get the
x64version if you are on Intel/AMD (Or downloading an Intel server to use on an Apple Silicon Mac) or thearm64on Snapdragon/Apple Silicon chips (M1,M2,M3 etc) for your operating system. Make sure you are NOT accidentally installing the “ASP.NET core Runtime”, make sure you are installing the ”.NET Runtime”. On Linux it is suggested you use your distro’s package manager (apt, dnf, pacman etc) to search and install dotnet. - Download the latest stable version of the server from our builds page or if you are looking for latest testing/vulture builds download from this page for your operating system. If you are looking for another fork, ask that fork if they have a server builds page. Otherwise refer to the Custom Code section below.
- Extract the downloaded zip to a directory somewhere, you may use any Archive program such as 7Zip, Winrar or even the one built into your operating system.
- (Mac and Linux only) Run
chmod +x Robust.Serverwithin a terminal inside the folder you extracted the server in. This only needs to be run once and again each time you download a new server update. - Run
run_server.bat(Windows) or./Robust.Servervia terminal on macOS/Linux) and wait until the console windows says “Ready”. Do NOT close the console window until you are done playing on your server. - Open your Space Station 14 Launcher and click on
Direct Connect To Serverand type inlocalhostas an IP address and click connect. You can also add it as a favorite if you click theAdd Favoritebutton using the same IP address. - (Optional) When there is a new update. Go back to the 2nd step, and copy over the
datafolder andserver_config.toml(if you modified it) from your old server files to the new server files if you like to move over the saved data such as characters and playtime from the old server.
Level 1: Invite Your Friends
You will need to do some extra steps if you want other people to be able to connect and play.Port Forwarding
The server needs network ports to be forwarded so that people can connect. By default, the game server uses two ports:- UDP
1212is used for main game netcode. This is necessary for the client to be able to connect to the server. This can be configured with thenet.portconfiguration variable. - TCP
1212is a HTTP status API. This is also necessary for the launcher to be able to connect to the server. You do not need this to connect with a bare client. This can be configured with thestatus.bindconfiguration variable (which takes in a string like*:1212or127.0.0.1:3000).
If have an IPV6 address (looks kinda like this
fd11:5ee:bad:c0de::ab3:3d03) make sure to include square brackets ([fd11:5ee:bad:c0de::ab3:3d03]) when in the direct connect menu.Configure Your Server
You can configure settings in the server by editing the config file,server_config.toml. The config file is TOML which is basically INI game.lobbyenabled it goes under the [game] header like so:
Admin Privileges
By default, no admin privileges are set. A privileged administrator can give out permissions to other admins with thepermissions console command in-game, but that has a chicken-and-egg problem. To get initial +HOST administrator permissions to your server, you can use one of the following three methods:
+HOST privileges are extremely dangerous to give and should only be given to people who already have access to your computer or server.Giving somebody +HOST allows them to completely take over your server and/or computer.- If you connect to the game server over localhost (IP
127.0.0.1or::1), the game will automatically give you full host privileges. This can be disabled with theconsole.loginlocalCVar. - If you set the
console.login_host_userCVar to your user name, you will be given host when you connect. - You can use
promotehostcommand from the server console (e.g.promotehost PJB) to temporarily give a connected client host.
Level 2: Server With Custom Code
You will first need to set up a development environment in order to produce a server build using custom code. After you are done with that you can continue. Next you will need to build the packaging tool itself:dotnet build Content.Packaging --configuration Release
Then you can use the Packager to do the hard work. The command below will package the server using hybrid-acz (so that the launcher can download your custom content) for 64 bit linux systems. If you wanna do for Windows instead replace linux-x64 to win-x64. If you have an ARM64 processor, replace the x64 to arm64. Available compilation targets are listed here in this article. (Note: Not all of these targets are supported. 64 bits AT LEAST are needed.)
dotnet run --project Content.Packaging server --hybrid-acz --platform linux-x64
Note that if you are running an older server before Content packaging was a thing, or need to use the legacy script (not supported anymore) then use this instead
python Tools/package_server_build.py --hybrid-aczrelease/ folder for a packaged server for your custom codebase. You can from now on follow the steps in level 0, skipping step 3 as you already have the server zip. (You may ignore the client file)
Level 3: A “Production” Server
This will not, of course, handle automatic restarts (in case of a crash) or updates like the watchdog would. This also won’t list your server publicly on the hub as advertising defaults to off. If you wish to have your server listed on the hub please readBare Server Configuration below.
For other services such as SS14.Watchdog you ALSO need the ASP .NET Core 10 Runtime (included in .NET 10 SDK).
Setting Rules
By default, the server ships with no rules. To set custom rules for your own server:- Fork the project if you have not already (which means also setting up development environment)
- Add a guidebook file with your rules in the
Resources/ServerInfo/Guidebook/ServerRulesdirectory. Follow the format ofDefaultRules.xml - Add a guidebook prototype entry in
Resources/Prototypes/Guidebook/rules.yml. Pointing to the newly created guidebook text file file you made. - Set the
server.rules_fileCCVar to the ID you set in the guidebook prototype you made in the previous step.
Public Hub Server - Getting your server on the launcher’s list
- Read the hub server rules before putting your server on the hub. Advertising to the hub constitutes acceptance of the hub rules.
- Pick tags for your server based on the standard tags.
-
Add the following lines to your server configuration:
Bare Server Build Configuration
If you do want to set up a more permanent server, you will have to re-host the client downloads somewhere. Anywhere accessible via a plain URL is fine. You will want to edit the server config file (server_config.toml) to add the following to it:
Performance Tweaks
Here are some settings you probably want to enable on your server to improve performance: Environment variable to enable full dynamic PGO, which drastically improves performance at the cost of marginally higher startup time:Level 4: Production Watchdog Server
This is for people running their own codebase and server and/or those who want a more robust hosting solution.SS14.Watchdog (codename Ian) is our server-hosting wrapper thing, similar to TGS for BYOND (but much simpler for the time being). It handles auto updates, monitoring, automatic restarts, and administration. We recommend you use this for proper deployments.
Installation
Refer to this for instructions on building and configuring Watchdog.
Server Build Configuration
The launcher needs to download the client binary to be able to run the game. It gets information about this client binary from the game server via an info API. The information returned from this API is configured in two ways:build.json and build.* configuration variables.
build.json is a file that gets put next to the server executable automatically by the build system. This is how the server knows what the build info is when just downloading a bare server zip. (note that this is NOT done by package_release_build.py, since it relies on extra build information. gen_build_info.py does it in a separate step)
The second option is by specifying configuration variables (from command line or config file, both work):
SS14.Watchdog specifies most of it for you if you have configured it with auto updates (depending on update provider). It notably cannot provide engine_version or fork_id version, so you’re best off specifying the former in build.json (your build system should be non garbage for this) and the latter in a config file.
Level 5: Big Production Server
Things that aren’t necessary for small/private servers, but strongly recommended for forks or larger production servers.Advanced Port Forwarding
You can slap the HTTP status API behind a reverse proxy if you want. This is recommended for production servers since then you can do HTTPS (slap it behind nginx and turn on HTTPS). Note that if you do this you have to set thestatus.connectaddress config variable to specify the UDP address the main netcode should connect to. This has to look like this: udp://server.spacestation14.io:1212 (for our server, obviously substitute with your params).
PostgreSQL Setup
SS14 uses an SQL database to store server data like player slots. By default, an SQLite database is automatically used which is sufficient for local testing and small servers. If you want the ability to share the database between multiple servers or such however, the server also supports connecting to PostgreSQL. Support for MySQL/MariaDB isn’t currently planned, but we will accept contributions. Relevant configuration properties, along with default values:Prometheus Metrics
SS14 supports hosting a metrics server that Prometheus can scrape, with which you can then make fancy graphs in Grafana or such. You can find our Grafana dashboards here, in case they happen to be useful. To configure this, you can use the following config variables:Loki Logging
SS14 also supports pushing structured log data to Loki. Because this is modern DevOps crap the website doesn’t say what it actually does but when combined with Grafana you can go and look at and filter logs in a debatably more sane way than bare text files. No, you do not need Promtail set up for this to work. SS14 pushes directly to Loki. To configure this, you can use the following config variables:Privacy Policy
The launcher has the capability of presenting a privacy policy prompt when a player tries to connect to your server, if configured. This is likely desirable for all major servers. How it works: the game server provides three parameters that the launcher will check as early as possible in the connection handshake:- Link: a link to a HTTP(S) URL where your privacy policy is hosted.
- Identifier: a unique value that identifies a specific server group’s privacy policy, to unambiguously distinguish it.
- Version: a unique value that identifies a version of your privacy policy, to allow recognizing changes.
Details
This section is provided to help you best understand how the launcher interacts with your game server while this feature is enabled.
- If they click the link, the privacy policy linked will open in their browser.
- If they click accept, the launcher will continue with normal connection procedures (downloading resources, starting client, connecting to game server, etc…)
- If they click decline, the connection is aborted immediately. In this scenario, no further contact with your server will have happened than a single
HTTP GETof the/infoserver API endpoint.
Troubleshooting
Unable to advertise to hub / people cannot connect
People aren’t able to connect to your server OR you get the following error in your server console:Auth/hub country internet blocking
Some countries (e.g. Russia) currently have internet blocks active that may interfere with your server’s ability to connect to hub services. If this is a problem for you, you can attempt to set the following config properties to use fallback services:SS14.Watchdog
Server keeps restarting every 30 seconds
This means the server isn’t communicating with the watchdog correctly and the watchdog is forced to assume that the server is locked up or similar. This happens ifBaseUrl in the watchdog configuration is set incorrectly or otherwise inaccessible by the game server.
System.IO.FileNotFoundException: Could not load file or assembly 'Mono.Posix.NETStandard, Version=1.0.0.0, Culture=neutral (…)
Current working theory is that this is caused by improper dotnet publish settings.
The below set of test results should help explain.
Mono.Posix.NETStandard.dll to mark executables as executable on Linux and Mac OS X, it’s important to have it around on those OSes.
Running the server on MacOS or Linux
Open a terminal in the unzipped build directory (it should have the Robust.Server file in it.) Type./Robust.Server then hit enter. If you see a bunch of stuff being printed to the screen and it doesn’t say error, then the server is running.
Additional Troubleshooting
TroubleshootingUseful Links
All of the important links on this page in one convenient place.- Config Reference
- .NET 10 Runtime (Also included in full .NET 10 SDK)
- ASP.NET Core 10 Runtime (Also included in full .NET 10 SDK)
- SS14.Watchdog
- Official Builds
- Wizard’s Den Infrastructure Reference (server specs)
- Public Hub Server Rules
- Port Forwarding