What your world needs to stay online
Your world needs a Linux machine that never sleeps, a little graphics software, and a Steam tool that runs without a screen. Pugstorm does not publish hardware figures for the server itself. What Steam does publish is the game's own list: a Core i5-2300 (Intel) or Ryzen 3 1200 (AMD) at minimum, a Core i5-8400 / Ryzen 7 2700X ideally, 8 GB of memory on the Windows side, and Ubuntu 22.04 as the recommended Linux. That list is for a PC that also draws the game, so treat it as a guide, not a rule.
One thing surprises people: the server uses OpenGL. The Core Keeper Wiki explains that it leans on OpenGL to keep generating terrain after the world is first created, which is why its Red Hat steps install Xvfb (a pretend screen) and the Mesa graphics libraries; on Ubuntu, the matching packages we add are libgl1-mesa-dri plus libxi6. We read this as: no graphics card needed, with Mesa doing that drawing work on the processor. So our advice is simply to leave the processor some breathing room while your group explores new areas. Patch 0.7.5 did make the server's CPU load a third lighter.
The server that fits
Pick an x86 rack server or blade from our game server machines. The game ships for Windows and Linux on 64-bit processors, Valve lists SteamCMD's Linux packages for x86-64 only, and we could not find an arm64 build, so leave out both ARM machines we offer: the X-Gene cartridge (eight cores) and the Ampere Altra (64 cores). Every rack server and blade includes a remote console of its own, usable after you set up a console login in the dashboard, which helps if a firewall mistake ever shuts you out.
You get the whole computer, so nobody else's game eats into the processor your terrain depends on, and the network port is unmetered. Choose the location closest to your friends on the data center page. A ready server is yours in about 30 minutes; payment checks can add time.
Up and running in an evening
- Turn the firewall on first, letting only SSH in. Nothing else needs opening for Steam friends: when dedicated servers launched in May 2022, Pugstorm said port forwarding was no longer required.
- Create a separate account,
ckserver, that cannot log in, so the game never runs as you or as root. The wiki recommends the same. - Download SteamCMD from Valve, then the server (app 1963720) plus app 1007, Steamworks SDK Redist, which the wiki installs beside it, both with an anonymous login.
sudo sed -i 's/^IPV6=.*/IPV6=yes/' /etc/default/ufw &&
sudo ufw allow OpenSSH &&
sudo ufw --force enable &&
sudo apt update && sudo apt install -y lib32gcc-s1 curl xvfb libgl1-mesa-dri libxi6 &&
{ id -u ckserver > /dev/null 2>&1 || sudo useradd -mrU -s /usr/sbin/nologin ckserver; } &&
sudo chmod 750 /home/ckserver &&
sudo -u ckserver bash -o pipefail -c 'cd /home/ckserver && mkdir -p steamcmd && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxf - -C steamcmd' &&
sudo -u ckserver bash -c 'cd /home/ckserver && steamcmd/steamcmd.sh +force_install_dir /home/ckserver/game +login anonymous +app_update 1007 validate +app_update 1963720 validate +quit' &&
sudo test -f /home/ckserver/game/_launch.sh && echo installed
Each line only runs if the one before it worked, right down to the final check. You should see installed at the end; if not, fix the first error shown and paste the block again. The steps are the wiki's Ubuntu ones with a few changes of ours: the firewall, SteamCMD from Valve's download instead of the Ubuntu package (which stops to show a licence screen), and xvfb added up front along with the two Mesa-related packages above.
The launch script tries to install its own missing packages, but a no-login account cannot. See which ones it wants: sudo grep -n requirements /home/ckserver/game/_launch.sh and install them yourself with sudo apt install -y followed by the names. Then run it once by hand so it builds your world: sudo -u ckserver bash -c 'cd /home/ckserver/game && bash _launch.sh'. When GameID.txt appears in the game folder, hit Ctrl+C and let the prompt come back. Before you set up the service, pgrep -u ckserver should print nothing at all. If it complains about the Steam client library, the wiki suggests putting a copy of steamclient.so, found in the linux64 directory under SteamCMD, in /home/ckserver/.steam/sdk64/.
Letting your friends in
Steam players join with the Game ID. The server writes it to /home/ckserver/game/GameID.txt, next to its log, CoreKeeperServerLog.txt; read it with sudo cat. Since patch 1.1.2.4 the server labels it Steam GameID: only Steam copies of the game can use it.
Friends who bought the game on Epic, GOG or the Microsoft Store can play on your server too, since 1.1.2.3, by typing its IP address, port and password. That mode has to be switched on first, following the README.txt in the install folder. When you switch it on, also allow the port it uses through ufw. Console players are out: Pugstorm's 1.1.2.4 notes say crossplay between PC and consoles isn't supported.
Settings worth changing
Your world and its settings file live in the DedicatedServer folder inside /home/ckserver/.config/unity3d/Pugstorm/Core Keeper, following the Ubuntu path in the Server Config article on the wiki. Stop the server, then open ServerConfig.json with sudoedit so it keeps the right owner.
| Setting | What it does |
|---|---|
| gameId | The code Steam friends type in. Too short and the server picks a random one; 15 characters is the minimum since 1.1.2.3 |
| worldName / worldSeed | Your world's name and seed; plain words work as a seed since 1.0.0.6 |
| world | Which world slot loads (our reading; the wiki leaves it blank) |
| maxNumberPlayers | How many can be connected at once, 1 to 100 |
| seasonOverride | Force a seasonal event; -1 means none |
The script passes extra flags through to the server (patch 0.4.0). One is handy: -activateallcontent, added in 1.1.2.4, turns on new content bundles by itself after game updates, and the service below starts with it. The full list is in ARGUMENTS.txt in the install folder, shipped since 1.1.0.
Keeping it running after you log off
A systemd service starts the server at boot, updates it through SteamCMD before every start, and brings it back if it stops. Ours builds on the wiki's version and keeps its KillMode=process line. The block refuses to write anything unless the install is there and the hand-run server has fully exited. It also writes a small backup script, explained in the next section. Want another flag? Append it to the ExecStart line, let systemd reread the file (sudo systemctl daemon-reload), and only then restart ckserver.
if sudo test -f /home/ckserver/game/_launch.sh && ! pgrep -u ckserver > /dev/null; then
sudo tee /etc/systemd/system/ckserver.service > /dev/null <<'EOF' &&
[Unit]
Description=Core Keeper world
Wants=network-online.target
After=network-online.target
[Service]
User=ckserver
WorkingDirectory=/home/ckserver/game
ExecStartPre=-/home/ckserver/steamcmd/steamcmd.sh +force_install_dir /home/ckserver/game +login anonymous +app_update 1007 +app_update 1963720 +quit
ExecStart=/bin/bash /home/ckserver/game/_launch.sh -activateallcontent
KillMode=process
TimeoutStartSec=1800
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo install -d -m 700 /var/backups/ckserver &&
sudo tee /usr/local/sbin/ckserver-backup.sh > /dev/null <<'EOF' &&
D="/home/ckserver/.config/unity3d/Pugstorm/Core Keeper"
F="/var/backups/ckserver/world-$(date +%F-%H%M).tar.gz"
systemctl stop ckserver || exit 1
if pgrep -u ckserver > /dev/null; then echo "still running: not backing up, not restarting"; exit 1; fi
tar -czf "$F" -C "$D" DedicatedServer; rc=$?
[ "$rc" -eq 0 ] || rm -f "$F"
systemctl start ckserver
[ "$rc" -eq 0 ] && tar -tzf "$F" > /dev/null && find /var/backups/ckserver -name 'world-*.tar.gz' -mtime +14 -delete
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now ckserver
else echo "no install, or a ckserver process still runs: nothing written"; fi
Two lines are our safety margins. The dash in ExecStartPre=- means a failed update still lets the game start; an update that freezes instead is cut off after the 1,800 seconds in TimeoutStartSec, and Restart=always then has another go.
A copy of your world every night
The backup script stops the game, copies the whole world folder into a dated archive, starts the game again, and only then clears archives older than two weeks, and only if the new one opens cleanly. We could not find an official word on what the Linux build does with unsaved progress when it is stopped, so if a ckserver process survives the stop, the script copies nothing and does not restart the game either: it stays offline until you have looked at why. A failed copy deletes its half-written archive. To run it daily, create /etc/cron.d/ckserver-backup containing this one line: 15 6 * * * root bash /usr/local/sbin/ckserver-backup.sh > /var/log/ckserver-backup.log 2>&1. Choose an hour when your group is asleep, because the stop kicks everyone. Keep copies somewhere other than this server too, with plain scp or rsync -a, never rsync --delete.
To bring a world back, put the archive's name in A and paste the block. It checks the archive opens, refuses if an old set-aside folder is still there, stops the game, moves your current world aside, unpacks the backup and starts again. Patch 1.2.0.6 fixed inventories reverting when a world moved between hosts, so this works for moving to a new machine as well.
A=/var/backups/ckserver/world-YYYY-MM-DD-HHMM.tar.gz
D="/home/ckserver/.config/unity3d/Pugstorm/Core Keeper"
if ! sudo tar -tzf "$A" > /dev/null; then echo "cannot read the archive, nothing changed"
elif sudo test -e "$D/DedicatedServer.old"; then echo "a DedicatedServer.old is already there, move it first"
else sudo systemctl stop ckserver &&
{ ! pgrep -u ckserver > /dev/null || { echo still running; false; }; } &&
sudo mkdir -p "$D" &&
{ ! sudo test -e "$D/DedicatedServer" || sudo mv "$D/DedicatedServer" "$D/DedicatedServer.old"; } &&
sudo tar -xzf "$A" -C "$D" &&
sudo chown -R ckserver:ckserver /home/ckserver/.config &&
sudo systemctl start ckserver && echo restored
fi
Log in and look around before deleting anything. Changed your mind? With D still set, this puts the previous world back. It does its job whether the backup got unpacked or not, provided your world was moved aside first: `W="$D/DedicatedServer"; sudo test -d "$W.old" && sudo systemctl stop ckserver && ! pgrep -u ckserver > /dev/null && sudo rm -rf "$W" && sudo mv "$W.old" "$W" && sudo systemctl start ckserver && echo rolled back. Once you are happy, sudo rm -rf "$W.old"` tidies up. For other worlds run the same way, see our Necesse guide.
Questions people ask
- Do I have to buy Core Keeper again for the server?
- No. The server is a free Steam tool, app 1963720, and SteamCMD downloads it with an anonymous login. Each player still needs their own copy of the game to join.
- Where does the server keep my world?
- In a folder called
DedicatedServerunder~/.config/unity3d/Pugstorm/Core Keeperin the home of the account that runs it, along withServerConfig.json. Copy that whole folder, with the game stopped, and you have a full backup. - Can friends who bought the game outside Steam play with us?
- Yes, on PC. Since patch 1.1.2.3, people with the Epic, GOG or Microsoft Store version can join by IP address, port and password once you enable direct connections as the server's README.txt describes. Console players cannot.
- Why does a server with no screen need graphics software?
- According to the wiki, OpenGL does the terrain generation as the world grows, so its Red Hat steps install Xvfb as a stand-in display and the Mesa libraries. Our reading is that a graphics card is not needed.
- How many friends can join at once?
maxNumberPlayersin ServerConfig.json accepts 1 to 100, according to the wiki. Pugstorm publishes nothing on memory or CPU per player; keep an eye on the machine as more friends arrive.