Core Keeper Headless Server Setup via SteamCMD
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
sudo dpkg --add-architecture i386sudo apt updatesudo apt install -y steamcmd xvfbsudo adduser --disabled-password --gecos "" ckusermkdir C:\steamcmdcd C:\steamcmdInvoke-WebRequest -Uri https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip -OutFile steamcmd.zipExpand-Archive .\steamcmd.zip -DestinationPath ..\steamcmd.exe +quitStep 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.
sudo machinectl shell ckuser@mkdir -p ~/corekeeper-serversteamcmd +force_install_dir /home/ckuser/corekeeper-server \ +login anonymous \ +app_update 1963720 validate \ +quitC:\steamcmd\steamcmd.exe +force_install_dir C:\CoreKeeperServer ^ +login anonymous ^ +app_update 1963720 validate ^ +quitStep 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
discoverableis 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
directIpto0.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.
{ "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"}discoverablecontrols Game ID matchmaking. Set to true if you want the relay path.directIpis the bind address on the host.0.0.0.0listens on all interfaces.gameIdis read only at runtime, the server prints the assigned ID into the log on boot.worldSeedis the integer seed for new worlds. Leave it set to keep regenerations deterministic.
Set a real RCON or admin password before going public
127.0.0.1 unless you absolutely need remote access. The default value in many community templates is admin, which is the first credential pair every scanner tries.Step 5: Firewall Rules (Direct IP Only)
sudo ufw allow 27015/udpsudo ufw allow 27016/udpsudo ufw reloadNew-NetFirewallRule -DisplayName "CoreKeeper Game" -Direction Inbound -Protocol UDP -LocalPort 27015 -Action AllowNew-NetFirewallRule -DisplayName "CoreKeeper Query" -Direction Inbound -Protocol UDP -LocalPort 27016 -Action AllowStep 6: Launch the Server
cd ~/corekeeper-serverxvfb-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-mnopcd C:\CoreKeeperServer.\CoreKeeperServer.exe -batchmode -nographics -logfile server.logOn 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>
mkdir -p /opt/corekeeper/backupstar -czf /opt/corekeeper/backups/primary-$(date +%F).tgz \ ~/.config/unity3d/Pugstorm/Core\ Keeper/DedicatedServer/primaryPerformance and Tuning
- Cap
maxPlayersat 8 unless you have specifically tested higher counts. The chunk streamer is the bottleneck, not the CPU. - Leave
discoverableat 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.