Hosting Guides

Core Keeper Headless Server Setup via SteamCMD

6 min readLinux & WindowsSteamCMDStandalone
Once your server is online, jump to the Core Keeper command and config reference.

Core Keeper has one of the friendliest dedicated server footprints in the survival genre. The binary is small, the configuration lives in a flat server.json, and Pugstorm provides two completely different connection paths: a Game ID relay that hides the host IP entirely, and a traditional direct port forward for groups that prefer the lower latency of a direct connection. This guide installs the server via anonymous SteamCMD on Ubuntu or Windows, walks through both connection modes, and documents the config file end to end.

Prerequisites

  • Ubuntu 22.04 LTS or Windows Server 2019 and newer.
  • 4 GB RAM and 2 CPU cores. Core Keeper is small.
  • For direct connections, UDP 27015 and UDP 27016 open at the firewall.
  • For Game ID relay connections, no inbound port forwarding required.

Step 1: Install SteamCMD

user@ubuntu
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y steamcmd xvfb
sudo adduser --disabled-password --gecos "" ckuser
PowerShell (Windows Server)
mkdir C:\steamcmd
cd C:\steamcmd
Invoke-WebRequest -Uri https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip -OutFile steamcmd.zip
Expand-Archive .\steamcmd.zip -DestinationPath .
.\steamcmd.exe +quit

Step 2: Anonymous Download (AppID 1963720)

The Core Keeper dedicated server is anonymous-login eligible. No Steam account is needed to fetch or update the binaries.

user@ubuntu
sudo machinectl shell ckuser@
mkdir -p ~/corekeeper-server
steamcmd +force_install_dir /home/ckuser/corekeeper-server \
+login anonymous \
+app_update 1963720 validate \
+quit
PowerShell (Windows Server)
C:\steamcmd\steamcmd.exe +force_install_dir C:\CoreKeeperServer ^
+login anonymous ^
+app_update 1963720 validate ^
+quit

Step 3: Game ID Routing vs Direct IP

Core Keeper supports two connection modes simultaneously. Choose based on your group, but understand the tradeoff before editing the config.

  • Game ID relay. When discoverable is true, the server registers with Pugstorm's matchmaking and prints a 16 character Game ID at boot. Friends paste that code into the client and connect through the relay. No port forwarding, no exposed IP, but expect slightly higher latency.
  • Direct IP. Set directIp to 0.0.0.0, forward UDP 27015 and 27016, and clients connect by entering the public host IP. Lower latency, but the host IP is visible to every connecting client.

Step 4: Edit server.json

After the first boot, the server writes a default server.json into the data directory. Stop the server, edit the file, and restart. The template below configures a private 8 player world with both connection paths available.

CoreKeeperServer_Data/server.json
{
"serverName": "Vardoran Caverns",
"worldName": "primary",
"worldSeed": 1881204332,
"worldMode": "Normal",
"gameId": "",
"maxPlayers": 8,
"discoverable": false,
"directIp": "0.0.0.0",
"gamePort": 27015,
"queryPort": 27016,
"season": "None"
}
  • discoverable controls Game ID matchmaking. Set to true if you want the relay path.
  • directIp is the bind address on the host. 0.0.0.0 listens on all interfaces.
  • gameId is read only at runtime, the server prints the assigned ID into the log on boot.
  • worldSeed is the integer seed for new worlds. Leave it set to keep regenerations deterministic.

Step 5: Firewall Rules (Direct IP Only)

user@ubuntu
sudo ufw allow 27015/udp
sudo ufw allow 27016/udp
sudo ufw reload
PowerShell (Windows Server)
New-NetFirewallRule -DisplayName "CoreKeeper Game" -Direction Inbound -Protocol UDP -LocalPort 27015 -Action Allow
New-NetFirewallRule -DisplayName "CoreKeeper Query" -Direction Inbound -Protocol UDP -LocalPort 27016 -Action Allow

Step 6: Launch the Server

user@ubuntu
cd ~/corekeeper-server
xvfb-run -a ./CoreKeeperServer -batchmode -nographics -logfile server.log
# On boot the log prints:
# Server listening on 0.0.0.0:27015
# Game ID = abcd-efgh-ijkl-mnop
PowerShell (Windows Server)
cd C:\CoreKeeperServer
.\CoreKeeperServer.exe -batchmode -nographics -logfile server.log

On Linux the Unity headless build still spins up a tiny GL context, which is why we wrap the launch in xvfb-run. Without it, the server exits immediately with a display init error.

Step 7: Save Locations and Backups

The world data lives outside the install directory, so SteamCMD updates never touch your save.

  • Linux: ~/.config/unity3d/Pugstorm/Core Keeper/DedicatedServer/<world>
  • Windows: %USERPROFILE%\AppData\LocalLow\Pugstorm\Core Keeper\DedicatedServer\<world>
user@ubuntu
mkdir -p /opt/corekeeper/backups
tar -czf /opt/corekeeper/backups/primary-$(date +%F).tgz \
~/.config/unity3d/Pugstorm/Core\ Keeper/DedicatedServer/primary

Performance and Tuning

  • Cap maxPlayers at 8 unless you have specifically tested higher counts. The chunk streamer is the bottleneck, not the CPU.
  • Leave discoverable at false for any non public server. The public browser is constantly scraped by griefers.
  • Mirror the save directory off-host nightly. Core Keeper saves are tiny, an offsite copy costs nothing.

Conclusion

Core Keeper rewards a minimalist deployment. Pull the binaries with anonymous SteamCMD, decide between the Game ID relay or a direct port forward, and tune the eleven keys inside server.json. The whole stack fits in one terminal session and runs unattended for as long as the host stays up.