RE:NODE

Guides13 min read

Arma 3 dedicated server: setup, server.cfg and mods

How to install an Arma 3 server, what every server.cfg key does, how mods and signature keys work, and how a headless client buys back server FPS.

Updated

1 reader

Arma 3 is a single-threaded simulation with a very long list of things to simulate, so the number that decides how it feels is clock speed, not core count. A sixteen-core machine at a modest frequency will lose to four fast cores every time, and no amount of memory changes that. The rest of the job is three files - server.cfg, basic.cfg and a profile - a mod list that every client must match exactly, and five UDP ports. This guide covers all of it: installing the server, every setting worth changing, how signature verification decides who can join, and the headless client, which is the single largest performance improvement available and the one most guides wave at.

What an Arma 3 server is, and what decides how it feels#

The dedicated server is a free, separate application: Arma 3 Dedicated Server, Steam app id 233780, downloadable with an anonymous SteamCMD login. It runs without graphics or sound, loads a mission, and simulates everything in it - terrain objects, physics, ballistics, and above all AI.

Server performance is measured in server FPS, which you read with #monitor 1 in chat as a logged-in admin. Above 30 is healthy, 20 is the point where AI starts making bad decisions, and below 15 a firefight becomes a slideshow of units teleporting into cover. What drives that number, in order:

  1. AI count. Every AI unit costs pathfinding, targeting and knowledge updates every frame. Two hundred AI on a large terrain will halve your server FPS before a single player connects.
  2. Scripting. A mission running heavy loops in unscheduled code blocks the same thread the simulation uses. The mission, not the host, is usually the reason a server degrades at hour three.
  3. Objects and physics. Destroyed vehicles, dropped weapon holders and ragdolls accumulate. A mission that never cleans up is a mission that gets slower.
  4. Players. Surprisingly far down the list. Players are cheap next to AI.

Memory is rarely the constraint on vanilla and always the constraint on heavily modded servers, because mods load their content into the process whether the mission uses it or not.

Requirements and resource usage#

SetupRAMCPUDisk
Vanilla, 20-30 players, light AI3-4 GB2 fast cores40 GB
CBA plus ACE, one mission, 40 players6 GB2-3 fast cores55 GB
Full pack: CBA, ACE, RHS, CUP Terrains8-12 GB3+ fast cores80-100 GB
Headless client alongside the serveradd 2-4 GBadd 1-2 coresnone
  • Disk is the surprise. The base server is around 20 GB. CUP Terrains complete and RHS together are larger than the game. A group that adds a couple of map packs mid-campaign can run a plan out of disk in an afternoon, and Arma does not fail gracefully when it cannot write.
  • CPU share matters more than core count. If your host throttles you to a fraction of a core, Arma will feel exactly as bad as that sounds. See CPU vs RAM for game servers for reading which one you are actually short of.
  • Bandwidth runs roughly 100-300 KB/s per player on a busy mission, higher with many AI in view. That is not much, but Arma is sensitive to jitter in a way most games are not - latency, jitter and packet loss covers telling the three apart.

Installing the server with SteamCMD#

The server itself needs no account:

bash
$ steamcmd +force_install_dir /home/arma/server +login anonymous \    +app_update 233780 validate +quit

Workshop mods are a different matter. They belong to the game, app id 107410, and downloading them requires a Steam account that owns Arma 3:

bash
$ steamcmd +force_install_dir /home/arma/server +login your_account \    +workshop_download_item 107410 <item-id> +quit

Downloaded items land in steamapps/workshop/content/107410/<item-id>/. Copy or symlink each one to a folder named @ModName in the server root. On RE:NODE the Arma 3 install asks for a Steam login on the Setup tab for this reason, and the credentials are stored as you type them - use a spare account that owns the game, not your main one.

A working Linux start line looks like this:

bash
$ ./arma3server_x64 -port=2302 -config=server.cfg -cfg=basic.cfg \    -profiles=./profiles -name=server -world=empty -autoInit \    -bandwidthAlg=2 \    -mod="@CBA_A3;@ace;@RHSAFRF" -serverMod="@ServerTools"
ArgumentWhat it does
-port=2302Game port. The query port is always this plus one
-config=The server.cfg described below
-cfg=The basic.cfg network file
-profiles=Where the difficulty profile and logs are written
-name=Which profile inside that directory to use
-world=emptySkip loading a terrain at startup. Faster, lighter
-autoInitStart the first mission without waiting for a player
-mod=Mods every client must also load
-serverMod=Mods only the server loads
-bandwidthAlg=2The newer bandwidth estimator. Worth having on
-filePatchingAllow loading unpacked files. Off unless you need it

Always use arma3server_x64, never the 32-bit arma3server. The 32-bit binary still exists, still starts, and will run out of address space the moment you add a mod list.

server.cfg: the settings that matter#

server.cfg is a plain text file in the server root, in Arma's own config syntax - semicolons after every statement, arrays declared with [].

server.cfg
hostname = "Longship Crew - ACE";password = "";passwordAdmin = "change-me";serverCommandPassword = "also-change-me";maxPlayers = 40;motd[] = {"Rules in the Discord.", "TFAR on channel 1."};motdInterval = 20;admins[] = {"76561198012345678"};logFile = "server_console.log";verifySignatures = 2;BattlEye = 1;kickDuplicate = 1;allowedFilePatching = 0;persistent = 1;timeStampFormat = "short";disconnectTimeout = 90;steamProtocolMaxDataSize = 1024;voteMissionPlayers = 3;voteThreshold = 0.33;onUnsignedData = "kick (_this select 0)";onHackedData = "kick (_this select 0)";headlessClients[] = {"127.0.0.1"};localClient[] = {"127.0.0.1"};class Missions{    class Liberation    {        template = "Liberation.Altis";        difficulty = "custom";    };};

The ones that decide whether the server works at all:

  • `passwordAdmin` is what #login takes. `serverCommandPassword` is separate and grants only the # commands, which is what you give a trusted moderator who should not be able to shut the server down. `password` is the join password and is usually empty.
  • `admins[]` lists SteamID64s that get admin without typing a password. Safer than sharing passwordAdmin with six people.
  • `verifySignatures = 2` refuses any addon that is not signed with a key the server holds. This is what keeps modified PBOs off your server, and it is also the number one cause of "I cannot join" - covered below.
  • `persistent = 1` keeps the mission running when the last player leaves. With -autoInit it also starts the mission at boot. Without it, your campaign resets every time the server empties.
  • `steamProtocolMaxDataSize = 1024` raises the size of the server's Steam response so the Arma launcher can actually show a long mod list. Leave it at the default with thirty mods and players get an incomplete list and a failed join.
  • `class Missions` is the rotation. template is the mission folder or .pbo name including the terrain suffix, exactly as it appears in mpmissions. A typo here means the server sits in the lobby with nothing selected.

difficulty = "custom" points at the difficulty settings in your profile file, which lives under the -profiles directory in a folder named after -name. That file is where third person, crosshairs, the map marker and AI skill live. Edit it with the server stopped; the server writes it back on exit.

Ports and connecting#

PortProtocolPurpose
2302UDPGame traffic
2303UDPSteam query. The browser and launcher talk to this
2304UDPSteam master, server reporting
2305UDPReserved by the port block
2306UDPBattlEye

The rule is that Arma claims -port through -port + 4, all UDP, and shifting the game port shifts the whole block. That is why the RE:NODE Arma 3 plans come with five allocations rather than one - anything less and either the browser or BattlEye silently fails. If you need more, the Network tab adds and removes ports. Game server ports explained goes into why a query port exists separately at all.

Players join through the in-game server browser, through the Arma 3 Launcher's direct connect, or by adding the address to their Steam favourites. The launcher is the one to point people at, because it can load the server's mod list in one click - provided steamProtocolMaxDataSize is set.

Mods, keys and signature verification#

A mod is a folder starting with @ containing an addons directory of .pbo files and usually a keys directory holding one .bikey. Two rules cover almost every join failure:

  1. Every `.bikey` from every mod in `-mod=` must be copied into the server's root `keys/` folder. With verifySignatures = 2 and a missing key, the client is rejected with a message about an unsigned addon that names a file rather than the mod.
  2. The client's mod list must match the server's `-mod=` list, same mods, same versions. -serverMod= mods are the exception - they load only on the server and clients neither need nor see them. Server-side admin tools, logging and performance mods belong there.

Load order is yours and it matters. CBA_A3 loads before anything that depends on it; ACE after CBA; map mods before mods that patch those maps. Arma resolves most dependencies by itself, but a mod that patches another and loads first simply does not apply.

On Linux there is one more trap that costs people an evening: case sensitivity. Workshop content ships with mixed-case folder and file names, and the Linux server will not find Addons/ACE_Main.pbo when the config asks for addons/ace_main.pbo. Lowercase everything after every download:

bash
$ find ./@ace -depth -name '*[A-Z]*' -execdir bash -c 'mv "$0" "${0,,}"' {} \;

Three habits keep a mod list stable. Pin versions: a mod that auto-updates mid-campaign ends the campaign, and Arma's workshop has no version pinning of its own, so pinning means not re-downloading. Publish the list somewhere players can copy from, ideally a launcher preset file, rather than describing it in a message. And when something does break, what to do when a mod update breaks is a shorter path than rebuilding the list from scratch.

Creator DLC is worth a note: a server can run a CDLC terrain, and players who do not own it can still join, with the owned content restricted for them. Whether that works for your mission depends on what the mission uses.

basic.cfg and the settings people copy without measuring#

basic.cfg holds network tuning. These are the documented defaults:

basic.cfg
MaxMsgSend = 128;MaxSizeGuaranteed = 512;MaxSizeNonguaranteed = 256;MinBandwidth = 131072;MaxBandwidth = 2147483647;MinErrorToSend = 0.001;MinErrorToSendNear = 0.01;MaxCustomFileSize = 0;class sockets { maxPacketSize = 1400; };

MaxMsgSend is the number of messages the server sends per simulation cycle and is the one with a real effect: raising it to 256 on a populated server with good CPU headroom reduces desync, and raising it on a server that is already CPU-starved makes things worse, because the messages have to be built on the same thread that is already late. MinErrorToSend and MinErrorToSendNear control how much an object must have changed before an update is sent - lowering them smooths distant movement at the cost of bandwidth and CPU.

The honest position on this file is that it is the most copied and least measured configuration in Arma. Change one value, play a session with #monitor 1 running, and write down the numbers. If you cannot see a difference in server FPS or reported desync, put it back.

The headless client#

AI is what eats the frame time on a long mission, and the headless client is how you move that work off the server process. It is a second copy of the same binary that connects to the server as a player with no screen, and the mission hands it ownership of AI groups. On a machine with cores to spare it is the difference between an hour-three firefight that plays and one that crawls.

bash
$ ./arma3server_x64 -client -connect=127.0.0.1 -port=2302 \    -profiles=./hc -name=hc -nosound \    -mod="@CBA_A3;@ace;@RHSAFRF"
UDP 2302joins as a clienthands over groupsPlayersup to 40 clientsHeadless clientsame machineOffloaded AIgroups it ownsArma 3 serverUDP 2302
Where the AI runs with a headless client

Three conditions, all of which have to hold:

  • headlessClients[] = {"127.0.0.1"}; and localClient[] = {"127.0.0.1"}; in server.cfg, so the server grants it headless status and unrestricted bandwidth.
  • The same mod list as the server, loaded with -mod=.
  • A mission written for it. This is the part most guides skip. Unless the mission explicitly transfers AI groups to the headless client, connecting one changes nothing at all except your player count. Liberation, Antistasi and most large persistent missions support it; a mission you wrote last week does not until you add the handover.

It also costs a slot and its own memory, so on a small plan a headless client can make things worse by pushing the whole thing towards its memory limit. Give it its own 2-4 GB before you count it as a win.

Admin commands and mission control#

Log in from chat with #login <passwordAdmin>, then:

CommandWhat it does
#login <password>Become admin
#logoutGive up admin
#missionsReturn to the mission selection screen
#mission <name>Load a specific mission
#restartRestart the current mission
#reassignRestart and send everyone back to slot selection
#monitor 1Print server FPS and CPS in chat every second
#userlistList connected players
#kick <name>Disconnect a player
#lock / #unlockStop and allow new connections
#shutdownStop the server
#exec ban <name>Ban a player

#monitor 1 is the diagnostic that matters. It prints server FPS and CPS (condition evaluations per second); watch it across a session and you will see exactly when a mission starts losing. #monitor 0 turns it off again. For anything you want to keep, the server log named by logFile is the record - logs worth keeping covers which lines are worth retaining and for how long.

Troubleshooting#

"You cannot play/edit this mission; it is dependent on downloadable content." The client is missing a mod the mission needs, or has it at a different version. The error names the addon, not the mod, so search the addon name.

Kicked immediately with a signature error. A .bikey is missing from the server's keys/ folder, or the client has a modified PBO. Add the key; if it persists for one player only, they have a broken download and should verify their mod.

The launcher shows only part of the mod list. steamProtocolMaxDataSize is too small. Set it to 1024.

The server is in the browser but nobody can connect. Check that the whole UDP block from -port to -port + 4 is open, not just the game port.

Server FPS collapses an hour into every mission. Almost always the mission, not the host: uncleaned wrecks, bodies and dropped items, or a script loop. Turn on #monitor 1 and watch when it drops. If it correlates with an event in the mission, it is the mission.

The mission resets whenever the last player leaves. persistent = 1 is missing.

Mods load on Windows and not on Linux. Case. Lowercase the mod folders and their contents.

The server stops without a crash log. Memory. On RE:NODE a container that reaches its limit is stopped and restarted clean rather than left to swap, which looks exactly like this from inside the game; check the memory graph across the session before you look for an engine bug.

FAQ#

How much RAM does an Arma 3 server need?

Three to four gigabytes for vanilla with thirty players, six with CBA and ACE, and eight to twelve for a full RHS and CUP pack. Mods are loaded whether or not the mission uses them, so the mod list sets the floor and the mission sets how far above it you go.

Does a faster CPU really matter more than more cores?

Yes. The simulation runs on one thread and cannot be split, so a higher clock directly raises server FPS while extra cores mostly sit idle. The exception is a headless client, which is a genuine second process and does use another core.

Why can some players join and others cannot?

Their mod list does not match. Same mods is not enough - the versions have to match too, which is why a mod that auto-updated for half your group breaks the other half. Distribute a launcher preset rather than a list of names.

Do clients need the mods loaded with -serverMod?

No, and that is the point of the argument. Server-side logging, admin and performance mods go in -serverMod= so they never appear in the list a player has to match.

Can I run two Arma 3 servers on one machine?

Yes, if each gets its own five-port block and its own -profiles directory. Use -port=2302 and -port=2312 rather than adjacent numbers, so the blocks cannot overlap, and remember each server holds its own copy of the mod list in memory.

Is a headless client worth setting up for a small group?

Only if your mission supports it and you are already short of server FPS. On a twelve-player co-op with sixty AI, the server handles it. On a persistent mission with hundreds of AI, it is the largest single improvement available and nothing else comes close.


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