RE:NODE

Guides12 min read

Holdfast: Nations At War server config

Set up a Holdfast: Nations At War server: install, the serverconfig file, ports, map rotation blocks, game modes, map voting, mods, auto-restarts and rc admin.

0 readers

A Holdfast: Nations At War dedicated server is a free SteamCMD download (app id 1424230) that runs on Windows and Linux, and everything about it lives in one plain-text configuration file: a block of server-wide settings at the top, then one !map_rotation start ... !map_rotation end block per round in the rotation, each naming a map, a game mode and that round's rules. It needs three ports - server_port (default 20100), steam_communications_port (8700) and steam_query_port (27000) - and administration happens in game through the F1 console with rc login and the admin password from the file. Copy the shipped serverconfig_default.txt to a file of your own before you edit it, because game updates overwrite the default.

This guide covers the file from top to bottom: installation and launch, the global settings, rotation blocks and the per-round rules that matter, map voting, mods, the built-in restart scheduler and the admin console.

How a Holdfast server works#

Holdfast is a Unity game, and the server is the game running headless. It loads the configuration file at start-up, plays the rotation blocks in order (or lets players vote between them), and loops. Each rotation block is a complete round definition: the map, the mode, which factions attack and defend, round length, tickets, spawn rules, friendly fire, class limits. The same map can appear several times with different rules.

That design has two consequences worth knowing before you start:

  • There is one file, and it is long. Server-wide settings and every round's settings live together. A typo in one block breaks that round, and you find out when the rotation reaches it.
  • Rules are per round, not per server. Friendly fire, spawn timers and class limits are set inside each rotation block. If you want the same rule everywhere, it has to be in every block. Copy a known-good block as the template for each new one.

Holdfast has no external RCON protocol in the sense Source games do. Administration is the in-game console, which means an admin has to be connected to the server to administer it.

Requirements and resource usage#

Holdfast servers carry large player counts - line battles with well over a hundred players are the point of the game - and the server's load rises with players, cavalry, artillery and, on naval maps, ships.

SetupRAMCPUNotes
Small community, 30-50 players3-4 GB2 coresArmy Battlefield, modest artillery
Line battle, 100-150 players4-6 GB3 coresThe common public size
Naval battles, large ships4-6 GB3 coresShip physics and many cannons
Event servers above 1506-8 GB3-4 fast coresMeasure before promising the count

These are working ranges rather than official figures, and the honest advice is to load-test with your own community before advertising a slot count. Clock speed matters for a busy server; see CPU vs RAM for game servers for telling which resource is actually short. Disk is modest - the install is a few gigabytes and grows with mods.

Installing and launching#

bash
$ steamcmd +force_install_dir /home/holdfast/server +login anonymous \    +app_update 1424230 validate +quit

The install ships two launch scripts, LaunchServer.sh for Linux and LaunchServer.ps1 for Windows, and an example serverconfig_default.txt. The scripts start the server headless with arguments along the lines of -startserver -batchmode -nographics -serverheadless, and point it at a config file with -serverConfigFilePath.

Two things to do before the first real start:

  1. Copy the config. cp serverconfig_default.txt serverconfig_myserver.txt, and edit your copy. The default file is replaced by every game update.
  2. Copy the launch script too, and change its -serverConfigFilePath to your file. The shipped script is also overwritten on update.

A Docker image maintained by the community (cm2network/holdfastnaw) exists for Linux hosts, configured through environment variables for the ports. On a hosting panel you do not touch the scripts; the config path and ports are startup variables and the config file is edited in the file manager. SteamCMD explained covers validate and update scripts in general.

Global settings: identity, ports and population#

The top of the file holds settings that apply to the whole server. Lines are <setting> <value>, comments start with #, and blank lines are ignored.

serverconfig_myserver.txt
# Identityserver_name [EU] 33rd Line Battles | Sundays 19:00server_welcome_message Follow your officer. Rules on Discord.server_region europeserver_passwordserver_admin_password a-long-random-admin-password# Ports - unique per instance on one machineserver_port 20100steam_communications_port 8700steam_query_port 27000# Players and population bracketsmaximum_players 150population_low_min_players 30population_medium_min_players 60population_high_min_players 100# Behaviourmap_rotation_start_randomise falseinclude_officer_only_chat trueinclude_sergeants_in_officer_chat true
SettingWhat it does
server_nameName in the browser
server_welcome_messageMessage shown to players on join
server_regionRegion tag for browser filtering, e.g. europe, usa, usaeast, usawest, australia
server_passwordJoin password. Empty for public
server_admin_passwordPassword for rc login
server_portGame port
steam_communications_portSteam communication port
steam_query_portSteam query - what the browser reads for name and player count
maximum_playersPlayer cap
population_*_min_playersThresholds that define low, medium and high population
map_rotation_start_randomiseStart the rotation at a random block
server_intro_title, server_intro_bodyA pop-up shown on join, good for rules
network_broadcast_modeStandard or Competitive network profile

The population brackets are worth setting deliberately. Several per-round and map-voting settings have low, medium and high variants, so the server can, for example, offer only small maps when it is nearly empty and large ones when full. That is one of the better features of the file, and it only works if the thresholds match your real population.

The region tag is a browser label only. Set it to where the server actually is: a server in Germany is europe. Players use it to filter for ping, so a wrong region produces a stream of complaints about lag.

Ports and connecting#

PortDefaultPurpose
server_port20100Game traffic
steam_communications_port8700Steam communication
steam_query_port27000Steam query - browser info and player count

All three must be reachable over UDP, and all three must be unique per instance if you run more than one server on a machine. The query port is what lets the browser show your player count; a server with a blocked query port may run fine and appear empty or not at all. Game server ports explained covers why games split traffic this way.

Map rotation blocks#

Each round in the rotation is a block between !map_rotation start and !map_rotation end. The examples shipped with the server (and the example_map_rotations folder in recent builds) show complete blocks for each mode; start from those rather than from memory, because map names are internal identifiers and must match exactly.

serverconfig_myserver.txt
!map_rotation startmap_name PalisadeArenagame_mode ArmyBattlefieldround_time_minutes 30faction_balancing trueallow_faction_switching falseallow_midround_spawning truefriendly_fire truespawn_immunity_timer 3!map_rotation end!map_rotation startmap_name Azuregame_mode NavalBattlefieldround_time_minutes 25max_tickets 2000max_player_respawns -1faction_balancing true!map_rotation end

The game modes you will use most:

ModeWhat it is
ArmyBattlefieldOpen land battle, the line battle staple
ArmyConquestLand battle over capture points with tickets
ArmySiegeAttackers assault a fortified position
CoastalSiegeShips and land forces attack a coastal fort
NavalBattlefieldShip-to-ship battle
NavalConquestNaval battle over capture points
FrontlinesOffensiveThe Frontlines mode, with frontlines_mode enabled

The set of modes and maps depends on your game version and DLC, and the example rotations in the install are the reliable list. The per-round settings worth knowing:

  • `faction_attacking` and `faction_defending` set the sides for asymmetric modes such as sieges. Leave them out where the mode does not need them.
  • `round_time_minutes` - round length. -1 means no time limit, which suits arenas and training maps.
  • `max_tickets`, `reinforcements_per_faction`, `max_player_respawns` - how long each side can keep fighting. -1 on max_player_respawns is unlimited.
  • `faction_balancing` and `allow_faction_switching` - for organised line battles, balancing on and switching off stops regiments stacking one side.
  • `friendly_fire` - on for most line battle communities, where it is part of the discipline. damage_split reflects a share of team damage back to the attacker.
  • `spawn_immunity_timer` - spawn protection in seconds, capped at five.
  • `allow_midround_spawning` - whether latecomers can join a running round.
  • `class_system_orders` - the officer order system.
  • `admin_console_allowed` - whether the admin console works in that round.

Per-round overrides go further: class limits per spawn point with spawn_override, starting weapons, artillery placement, ship spawns and ship health for naval rounds. These are powerful and verbose. Add them one block at a time and test each round before the event, not during it.

Map voting#

Instead of a fixed rotation, the server can let players vote between candidates at the end of each round. The main switches:

code
map_voting_enabled truemap_voting_duration 20map_voting_max_choices 3map_voting_allow_same_map falsemap_voting_history_count 4map_voting_include_random_choice true

map_voting_history_count stops a map that was just played being offered again for that many rounds, and has per-population variants (_verylow, _low, _medium, _high) so a nearly empty server can recycle its small maps faster. The population_*_playable keys inside rotation blocks mark which rounds are suitable at which population, which is how voting avoids offering a 150-player siege to twelve people.

Voting suits public servers. Organised communities running scheduled events usually want a fixed rotation and turn it off.

Mods, scheduled restarts and Discord logging#

Mods come from the Steam Workshop. The config names them by Workshop id:

code
mods_installed 1234567890mods_installed_server_only 2345678901

mods_installed is for mods that both server and clients need; mods_installed_server_only for server-side ones. Keys such as load_mod, load_mod_client_only and load_mod_server_only control loading, and mod_variable passes settings to a mod. The ids above are placeholders, and the mod's Workshop page states which keys it needs. As with any game, every client mod has to match between server and players, and a game update can break a mod until its author updates it - see Steam Workshop mods on dedicated servers and what to do when a mod update breaks.

Scheduled restarts and shutdowns are built into the config, which is unusual:

code
server_autorestart_interval_minutes 1440server_autorestart_overtime_minutes 15server_autorestart_broadcasted_message Server restarts at the end of this round.server_autorestart_broadcasted_message_interval_minutes 5

The overtime value lets a round in progress finish before the restart. Use either this or a panel schedule, not both; two restart systems on different clocks make for confusing evenings. A panel schedule has the advantage of being able to take a backup first. Restart schedules that help covers how often.

Discord logging for admin events is configured with the discord_webhook_warning_* and discord_webhook_banmute_* keys, which post warnings, bans and mutes to webhooks you create in Discord. It is worth turning on: it gives your staff a record of moderation actions without anyone copying logs by hand. Discord webhooks for server status explains creating a webhook; treat the token as a secret.

Running a line battle event#

Most Holdfast communities exist to run organised line battles: regiments sign up, officers command, and the evening follows a schedule. The config file is where that discipline is either supported or undermined.

  1. Use a fixed rotation for the event. Turn map voting off and list the event's rounds in order. Players should know before they join which map and mode comes next.
  2. Lock the sides. faction_balancing true and allow_faction_switching false keep regiments where the organisers put them. On asymmetric modes, set faction_attacking and faction_defending explicitly.
  3. Control classes. spawn_override limits how many of a class can spawn at a point. Line battles live or die on keeping skirmishers, cavalry and artillery in proportion to the line infantry; set the limits in each block rather than relying on goodwill.
  4. Decide on late joiners. allow_midround_spawning false is common for events, so the battle is fought by those present at the start. Public servers want it on.
  5. Give officers their channel. include_officer_only_chat true gives officers a channel of their own, and include_sergeants_in_officer_chat decides whether NCOs are in it.
  6. Put the rules where people see them. server_intro_title and server_intro_body show a pop-up on join. Use it for the three rules that get people kicked, not the whole rulebook.

Keep a separate config file for event nights and one for the public server between events, and switch by pointing the launch at the other file and restarting. That is far safer than editing one file back and forth every week, and it means a mistake made while preparing Sunday's event cannot break Tuesday's public server. Back up both files before each change.

Admin commands#

Admins open the console with F1 in game and log in:

code
rc login a-long-random-admin-passwordrc helprc mapRotation 2

Every admin command is prefixed with rc. rc help lists the commands available in your version, which is the authoritative list - the set has grown over updates. Kicking, banning, muting and broadcasting are all rc commands, and rc mapRotation <n> jumps to a numbered block in your rotation, which is how admins move an event on when a round has run its course.

Because the admin password grants everything, treat it with the care you would give an RCON password (RCON safely has the reasoning): long, unique, shared with as few people as possible, and changed when a staff member leaves. There is no per-admin account in the config, so a shared password is the whole security model.

Troubleshooting#

The server came back with default settings after an update. You were running serverconfig_default.txt or the stock launch script. Use your own copies.

The server runs but is not in the browser, or shows no players. The query port is closed or clashes with another instance.

One round in the rotation fails or loads the wrong thing. A misspelled map_name or game_mode in that block. Compare with the example rotations.

Two servers on one machine fight. All three ports must differ between instances.

Players see a round with the wrong sides. faction_attacking and faction_defending are missing or swapped for an asymmetric mode.

`rc login` fails. The password does not match server_admin_password, or the line is commented out with #.

Mods do not load for players. A client mod is listed as server-only, or players have a different version.

FAQ#

Where is the Holdfast server config file?

In the server's install folder, as serverconfig_default.txt. Copy it to a file of your own, point the launch script or startup variable at the copy, and edit that - updates overwrite the default.

Which ports does a Holdfast server need?

server_port (default 20100), steam_communications_port (8700) and steam_query_port (27000), all UDP and all unique per instance on the same machine.

How do I become admin on my Holdfast server?

Set server_admin_password in the config, restart, join, press F1 and type rc login followed by the password. rc help then lists the admin commands.

Can I change friendly fire for the whole server?

Only by setting friendly_fire in every rotation block. Rules are per round, so copy the setting into each block you use.

Does Holdfast have RCON?

Not an external RCON protocol. Administration is the in-game console with rc commands, so an admin has to be connected to the server.

How many players can a Holdfast server hold?

As many as maximum_players allows and your hardware can carry. Line battle servers of 100 to 150 are common; test larger counts with your community before advertising them.


Comments

Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.

0/2000