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).
- Add an account: a label, the Steam user name and its password.
- Mark one account as the default. Services that do not name an account use it.
- 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.
- The install pauses and the service page shows SteamCMD is waiting for a Steam Guard code.
- Get the code from the account’s e-mail or its Steam Guard authenticator.
- 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:
- SteamCMD downloads each item with
workshop_download_iteminto the service’ssteamapps/workshopfolder. - Each mod is laid out under the definition’s
install_tofolder (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. .bikeyfiles from each mod’skeysfolder are copied to the definition’skeys_dir(ArmA 3:keys/), so signature checks accept the mod.- 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>/../steamcmdon first use. It is owned by the node accountngcp_steam. - Linux nodes need SteamCMD’s 32-bit libraries (
lib32gcc-s1 lib32stdc++6on Debian / Ubuntu). The install says so when they are missing. - During a SteamCMD run, the service directory is handed to
ngcp_steamand 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
updatesteps in the definition re-runs the install’s SteamCMD steps without validation.