Engineering Field guide

Game server update maintenance: backups and rollback plan

Game server maintenance window procedures: player alerts, cold snapshot verification, SteamCMD updates, and immediate rollback criteria.

Game server update maintenance: backups and rollback plan

A new patch or major content release for a multiplayer game represents a critical moment for any server administrator. Applying automatic updates to a live server without a verified recovery snapshot frequently overwrites custom configuration files, breaks binary plugin hooks (Metamod, Oxide, Carbon), and causes permanent save corruption from outdated mods.

Professional administration demands a strict procedure: a scheduled maintenance window, an immutable pre-update cold snapshot, isolated smoke testing, and a rehearsed rollback sequence.

Scheduling the maintenance window and notifying players#

Never disconnect a live server abruptly. Terminating a session mid-game during combat, building, or autosaving leads to player inventory desynchronization and corrupted SQLite databases.

Use server console tools or RCON to broadcast scheduled warning messages:

bash
for MIN in 30 15 5 1; do
  echo "Say: Server maintenance in $MIN minutes. Please log out safely."
  sleep 1
done

Once the countdown finishes, trigger a clean save flush and shut down the service unit:

bash
sudo systemctl stop gameserver
sudo systemctl is-active gameserver || echo "Server is offline"

Creating a cold snapshot and isolating configuration files#

A true cold snapshot can only be taken when the server daemon is completely halted. At this juncture, memory buffers are fully committed to disk and save files are not locked by active descriptors.

Create a compressed archive of your world save directory and configuration paths using tar and zstd:

bash
mkdir -p /opt/backups/snapshots
tar -I 'zstd -3' -cf /opt/backups/snapshots/pre-update-$(date +%Y%m%d_%H%M%S).tar.zst \
  /opt/gameserver/saved \
  /opt/gameserver/cfg

Verify archive integrity before invoking the updater:

bash
zstd -t /opt/backups/snapshots/pre-update-*.tar.zst && echo "Archive verified"

Updating binary files via SteamCMD#

Execute SteamCMD under the unprivileged service account using the validate argument to pull updated game assets and verify binary checksums:

bash
/usr/games/steamcmd \
  +force_install_dir /opt/gameserver \
  +login anonymous \
  +app_update 730 validate \
  +quit

If the server relies on framework loaders or third-party plugins, check their upstream release status before admitting public traffic. Deploy updated hook binaries prior to service launch.

Smoke testing and immediate rollback criteria#

Start the server in an isolated state without immediately opening public player queues. Inspect initialization logs and service health:

bash
sudo systemctl start gameserver
sleep 10
sudo journalctl -u gameserver -n 50 --no-pager

Confirm that the startup meets release criteria:

  1. The daemon is actively listening on its designated port: ss -ulnp | grep 27015.
  2. Logs are free from fatal exceptions (SIGSEGV, NullReferenceException, or Failed to load plugin).
  3. The world loaded properly without resetting to an unconfigured default seed.

If the engine crashes due to unpatched third-party plugins, immediately execute your pre-arranged rollback sequence:

bash
sudo systemctl stop gameserver
tar -I 'zstd' -xf /opt/backups/snapshots/pre-update-*.tar.zst -C /
echo "Rollback completed. Awaiting plugin developer patches."

To schedule recurring maintenance windows and manage versioned server environments effortlessly, server operators leverage a specialized server management platform, ensuring atomic snapshots and configuration rollback at scale.

Sources#