NGCP Game server control panel
Documentation
Contents

Running game servers

Steam and the Workshop

Games distributed through Steam are installed and updated with SteamCMD, which the agent downloads and runs on each node. This page covers Steam logins, Steam Guard and Workshop mods.

Anonymous and account logins

A game definition says how SteamCMD logs in for each install step:

  • login: anonymous: no account needed (Valheim, Counter-Strike 2).
  • login: account: SteamCMD logs in with an account from the panel’s Steam account vault (ArmA 3 server and ArmA 3 Workshop).

Bohemia Interactive recommends a separate Steam account for servers. Downloading ArmA 3 Workshop mods needs an account that owns ArmA 3.

The Steam account vault

Open Settings -> Manage Steam accounts (needs nodes:write, which SuperAdmins and Admins have).

  1. Add an account: a label, the Steam user name and its password.
  2. Mark one account as the default. Services that do not name an account use it.
  3. To use a different account for one service, an administrator picks it in that service’s Settings tab (or when creating the service).

How the vault protects logins:

  • Passwords are sealed with the panel’s master key and are write-only: the API never returns them.
  • A login travels to a node only together with an install or update command, over the encrypted AgentLink.
  • On the node, SteamCMD runs as the separate account ngcp_steam, never as the game server’s account. The login is written to a temporary script file readable only by that account (never on a command line, where other users could see it), masked in console output and deleted after the run.
  • SteamCMD keeps its own login token in the node’s SteamCMD folder, which game servers cannot read.

Removing an account switches its services to the default account.

Steam Guard

The first time SteamCMD logs in with an account on a node, Steam may ask for a Steam Guard code.

  1. The install pauses and the service page shows SteamCMD is waiting for a Steam Guard code.
  2. Get the code from the account’s e-mail or its Steam Guard authenticator.
  3. Type the code into the service’s Console and press Enter.

The code goes straight to SteamCMD and is never stored. After one confirmed login SteamCMD remembers the node, so later installs on that node do not ask again. If nobody enters a code in time, the install fails with “no Steam Guard code was entered in time”; start it again.

If Steam rejects the password the install fails with “Steam rejected the login (check the account’s password in Settings > Steam accounts)”.

Workshop mods

Games with a workshop section in their definition take Steam Workshop mods: ArmA 3, and any game run with the generic Steam dedicated server definition once its game app id is set. Mods are stored per service in modlist variables. ArmA 3 has two: Mods (-mod) and Server mods (-serverMod).

Adding mods

Use the mod manager (or the Workshop fields in the service’s Settings tab) to add mods by Workshop id or link. A Workshop collection expands into its items. The order of the list is the load order.

What happens on the node

When you change the mods, the service is marked “mods changed”. Run Update to download them:

  1. SteamCMD downloads each item with workshop_download_item into the service’s steamapps/workshop folder.
  2. Each mod is laid out under the definition’s install_to folder (ArmA 3: mods/) with hard links, so the files are not stored twice. The folder name comes from the mod’s title on the Workshop: @ plus a slug of the title, for example @cba_a3. On Linux, ArmA mod files are lower-cased, as the Linux server expects.
  3. .bikey files from each mod’s keys folder are copied to the definition’s keys_dir (ArmA 3: keys/), so signature checks accept the mod.
  4. The game’s command line gets the list in load order, for example -mod=mods/@cba_a3;mods/@ace.

Titles are looked up from the Steam Web API by the controller and cached. Item ids must be numbers; folder names only ever contain a-z, 0-9 and _.

Updating mods

Update downloads newer versions of the game and of every mod and rebuilds the mod folders. To keep mods current, add a scheduled update task (see Scheduled tasks), for example nightly with only when empty.

SteamCMD on the node

  • The agent downloads SteamCMD into <services dir>/../steamcmd on first use. It is owned by the node account ngcp_steam.
  • Linux nodes need SteamCMD’s 32-bit libraries (lib32gcc-s1 lib32stdc++6 on Debian / Ubuntu). The install says so when they are missing.
  • During a SteamCMD run, the service directory is handed to ngcp_steam and handed back to the service account afterwards. Avoid changing files through the file manager or SFTP while a service is installing or updating.
  • An update without its own update steps in the definition re-runs the install’s SteamCMD steps without validation.