Guides

Arma 3 server hosting on Linux and Windows: SteamCMD, server.cfg, ports 2302 to 2306 and mods

Arma 3 server hosting on your own VPS: SteamCMD app 233780 with a Steam login, server.cfg, UDP 2302 to 2306, mods and keys, headless clients.

Published ~10 min read
On this page

To host an Arma 3 server on your own VPS, install SteamCMD, log in with a real Steam account (an anonymous login fails for app 233780 with “No subscription”), download the server, write server.cfg and basic.cfg, open UDP ports 2302 to 2306 and start arma3server_x64 with -config, -cfg and your -mod list. One fast CPU core matters more than many.

This guide covers Linux (Debian 12 or 13, Ubuntu 24.04) and Windows Server, mods and their keys, headless clients, restarts and backups, and which plan size fits. It follows Bohemia Interactive’s server documentation and current SteamCMD behaviour as of October 2026. Searching for an Arma Reforger server? That is a different game with its own server software and a JSON config; none of the steps below apply to it.

ItemValue
SteamCMD app ID233780, Steam account login (anonymous fails)
Creator DLC contentBranch creatordlc: -beta creatordlc
Game portUDP 2302, set with -port=
Other portsUDP 2303 Steam query, 2304 Steam, 2305 reserved, 2306 BattlEye
Binaryarma3server_x64 on Linux, arma3server_x64.exe on Windows
Config filesserver.cfg via -config=, basic.cfg via -cfg=
Missions.pbo files in the mpmissions folder
Mods-mod= for everyone, -serverMod= for the server only

How much CPU and RAM does an Arma 3 server need?

CPU first. The server simulates the mission, the AI included, largely on one main thread, so a high clock on one core decides how many AI groups and players it carries. Its frame rate is capped at 50 by default, per Bohemia’s startup parameter docs (-limitFPS changes the cap); when the server FPS falls into the low teens or below, AI turns sluggish and players see desync, however much RAM is free. Log in as admin in game with #login PASSWORD and type #monitor 5 to see server FPS and memory every five seconds. Moving AI to headless clients, covered below, is the standard way past that ceiling.

Memory depends on the mod set. We found no official figure from Bohemia, so these are our starting points:

ServerRAM for the servervCores
Vanilla or light mods, small group3 to 4 GB2 to 3
Unit operations with a large mod set (CBA, ACE and asset packs)6 to 8 GB4 to 6
Each headless client on the same machineadd 2 to 4 GBadd 1 to 2

On Windows, add about 2 GB for the operating system. On Linux, use the 64-bit arma3server_x64; a 32-bit process runs out of address space with big mod sets.

How do I install an Arma 3 server on Linux?

App 233780 needs a logged-in Steam account. Use a separate account for the server: Steam allows one active login per account, so the server’s logins can sign your own game client out, and SteamCMD caches the login on the machine. If SteamCMD still answers “No subscription” with that account, use one that owns Arma 3; downloading Workshop mods with SteamCMD needs such an account anyway, per the LinuxGSM documentation.

  1. 1Install dependencies and create the user
    Debian · Ubuntu
    sudo apt update
    sudo apt install -y curl ca-certificates lib32gcc-s1 nano
    sudo useradd --system --create-home --home-dir /opt/arma3 --shell /usr/sbin/nologin arma3
  2. 2Install SteamCMD
    Debian · Ubuntu
    sudo -u arma3 -H mkdir -p /opt/arma3/steamcmd
    sudo -u arma3 -H sh -c 'curl -fsSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xz -C /opt/arma3/steamcmd'
  3. 3Log in once and download the server

    The first login asks for the password and, with Steam Guard on, a code from email or the app. Later runs reuse the cached login, which the update in the systemd unit below relies on:

    Debian · Ubuntu
    sudo -u arma3 -H /opt/arma3/steamcmd/steamcmd.sh \
      +force_install_dir /opt/arma3/server \
      +login YOUR_STEAM_USER +app_update 233780 validate +quit
    # Creator DLC servers: +app_update 233780 -beta creatordlc validate
  4. 4Create the folders the server uses
    Debian · Ubuntu
    sudo -u arma3 mkdir -p /opt/arma3/profiles /opt/arma3/server/mpmissions /opt/arma3/server/keys

How do I set it up on Windows Server?

The same server runs on a Windows VPS, which suits admins who prefer a desktop and Windows-only mod tooling. Connect over RDP, open PowerShell as Administrator and run:

PowerShell (Administrator)
New-Item -ItemType Directory -Force -Path C:\steamcmd | Out-Null
Invoke-WebRequest https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip -OutFile C:\steamcmd\steamcmd.zip
Expand-Archive C:\steamcmd\steamcmd.zip -DestinationPath C:\steamcmd -Force
C:\steamcmd\steamcmd.exe +force_install_dir C:\arma3 +login YOUR_STEAM_USER +app_update 233780 validate +quit
New-NetFirewallRule -DisplayName 'Arma 3 2302-2306/UDP' -Direction Inbound -Protocol UDP -LocalPort 2302-2306 -Action Allow
start line (PowerShell)
C:\arma3\arma3server_x64.exe -port=2302 -config=C:\arma3\server.cfg -cfg=C:\arma3\basic.cfg -profiles=C:\arma3\profiles -name=server "-mod=@cba_a3;@ace"

The config files below are the same on both systems. A Task Scheduler task that runs the start line at boot, plus the firewall rule above, is the Windows equivalent of the systemd unit further down.

server.cfg: name, passwords, signatures and missions

/opt/arma3/server.cfg
hostname = "My Arma 3 server";
password = "";                    // empty for a public server
passwordAdmin = "a-long-random-admin-password";
serverCommandPassword = "another-long-random-string";
maxPlayers = 32;
persistent = 1;                   // keep the mission running when everyone leaves
kickDuplicate = 1;
verifySignatures = 2;             // only accept mods signed with a key in keys/
BattlEye = 1;
disableVoN = 0;
motd[] = { "Welcome", "Rules: no team killing" };
motdInterval = 5;

class Missions
{
  class Mission1
  {
    template = "MyMission.Altis";   // mpmissions/MyMission.Altis.pbo, without .pbo
    difficulty = "Regular";
  };
};

Drop the mission .pbo into mpmissions and name it in template without the extension. Leave the Missions class out and the server waits for an admin to pick a mission from the list. verifySignatures = 2 is what keeps players from joining with mods you do not run: their files must be signed with a key you placed in keys.

basic.cfg: network settings

basic.cfg tunes how much data the server sends per frame. Bohemia’s wiki documents the defaults; start from them and change one value at a time, only when #monitor shows the server held back by bandwidth rather than CPU:

/opt/arma3/basic.cfg
MaxMsgSend = 128;              // packets per frame (wiki default 128)
MaxSizeGuaranteed = 512;       // bytes (default 512)
MaxSizeNonguaranteed = 256;    // bytes (default 256)
MinBandwidth = 131072;         // bits per second the server can count on (default)
MaxBandwidth = 100000000;      // set to roughly your real uplink, here 100 Mbit/s
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;

Which ports does an Arma 3 server use?

PortProtocolUsed for
2302UDPGame traffic and voice (the -port value)
2303UDPSteam query, port + 1
2304UDPSteam port, port + 2
2305UDPReserved for VON, port + 3
2306UDPBattlEye, port + 4

All five move together with -port. For a second server on the same machine, leave a gap of 100 (2402 to 2406) as community setups do. Allow SSH first:

ufw · Debian · Ubuntu
sudo apt install -y ufw              # preinstalled on Ubuntu
sudo ufw allow 22/tcp                # your SSH port, first
sudo ufw allow 2302:2306/udp comment 'Arma 3'
sudo ufw enable

The UFW guide covers default-deny rules in more depth.

How do I add mods: -mod, -serverMod and keys

  • -mod= lists mods every player must also run, separated by semicolons, for example -mod=@cba_a3;@ace. On Linux, quote the whole argument so the shell does not read the semicolon as the end of a command.
  • -serverMod= lists mods only the server loads (admin tools, server-side scripts), which clients neither need nor see.
  • Copy each client mod’s .bikey file into the server’s keys folder. Without it, verifySignatures kicks everyone who runs that mod.

Workshop mods on a Linux server

Download them with the same SteamCMD account (it must own Arma 3); 107410 is the game’s app ID and the second number is the item ID from the mod’s Workshop URL, here CBA_A3:

Debian · Ubuntu
sudo -u arma3 -H /opt/arma3/steamcmd/steamcmd.sh +force_install_dir /opt/arma3/server \
  +login YOUR_STEAM_USER +workshop_download_item 107410 450814997 validate +quit
sudo -u arma3 ln -s /opt/arma3/server/steamapps/workshop/content/107410/450814997 /opt/arma3/server/@cba_a3

Check where SteamCMD put the files: it prints the path when the download succeeds, and the link has to point there if it differs. The Linux server also expects mod file and folder names in lower case, which many Workshop uploads are not. This renames everything inside a mod folder, copies its keys and hands the keys to the server user; the two find lines were run on Debian 12 with GNU findutils 4.9.0 against a mock mod folder:

lower-case a mod and copy its keys
sudo find /opt/arma3/server/@cba_a3/ -depth -name '*[A-Z]*' -execdir sh -c 'mv -n -- "$1" "$(printf %s "$1" | tr "[:upper:]" "[:lower:]")"' _ {} \;
sudo find /opt/arma3/server/@cba_a3/ -iname '*.bikey' -exec cp {} /opt/arma3/server/keys/ \;
sudo chown -R arma3:arma3 /opt/arma3/server/keys

Run it again after every mod update, because SteamCMD restores the original names. Mods that ship native extensions need a Linux build of them (.so files); a mod with only Windows .dll extensions works on a Windows server only.

Headless clients: moving AI off the server

A headless client is a second Arma 3 process without graphics that joins the server like a player and takes over AI that the mission hands to it, so the AI runs on another core. It is the same arma3server_x64 binary started as a client. Three things have to line up:

  • server.cfg allows it: headlessClients[] = { "127.0.0.1" }; and localClient[] = { "127.0.0.1" }; for a headless client on the same machine.
  • The mission has a Headless Client slot (placed in the editor as a virtual entity) and a script or mod that moves AI groups to it. Without that, the headless client joins and does nothing.
  • The start line loads exactly the same -mod list as the server:
headless client start line
cd /opt/arma3/server
./arma3server_x64 -client -connect=127.0.0.1 -port=2302 -password=SERVER_PASSWORD \
  -profiles=/opt/arma3/profiles -name=hc1 '-mod=@cba_a3;@ace'

Give each headless client its own systemd unit modelled on the one below. Two or three are common on a busy server; each costs a core and a few gigabytes.

How do I run it as a service, with updates and restarts?

A start script keeps the mod list readable and out of the unit file’s quoting rules:

/opt/arma3/start.sh
sudo tee /opt/arma3/start.sh >/dev/null <<'EOF'
#!/bin/sh
cd /opt/arma3/server || exit 1
exec ./arma3server_x64 -name=server -port=2302 \
  -config=/opt/arma3/server.cfg -cfg=/opt/arma3/basic.cfg \
  -profiles=/opt/arma3/profiles \
  '-mod=@cba_a3;@ace'
EOF
sudo chown arma3:arma3 /opt/arma3/start.sh
sudo chmod 750 /opt/arma3/start.sh
/etc/systemd/system/arma3.service
[Unit]
Description=Arma 3 dedicated server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=arma3
Group=arma3
# update with the cached login before every start; "-" lets a failed update fall through
ExecStartPre=-/opt/arma3/steamcmd/steamcmd.sh +force_install_dir /opt/arma3/server +login YOUR_STEAM_USER +app_update 233780 +quit
ExecStart=/opt/arma3/start.sh
TimeoutStartSec=900
Restart=on-failure
RestartSec=15

[Install]
WantedBy=multi-user.target
enable, watch, restart nightly
sudo systemctl daemon-reload
sudo systemctl enable --now arma3
sudo journalctl -u arma3 -f
# many communities restart daily; this one at 05:00
(sudo crontab -l 2>/dev/null; echo "0 5 * * * /usr/bin/systemctl restart arma3") | sudo crontab -

On Linux the server writes what Windows puts in its .rpt log file to the console instead, so under systemd journalctl -u arma3 is the server log; read it first when a mission does not load. On Windows the .rpt lands in the profiles folder. The systemd service guide explains each line of the unit.

What should I back up?

The server install comes back with SteamCMD. What you cannot download again is your configuration and mission state: server.cfg, basic.cfg, start.sh, the profiles folder (missions that save progress with profileNamespace keep it in the server profile there), mpmissions and keys:

nightly archive, as root
mkdir -p /opt/arma3/backups
tar -czf /opt/arma3/backups/arma3-$(date +%F).tar.gz -C /opt/arma3 \
  server.cfg basic.cfg start.sh profiles server/mpmissions server/keys
ls -1t /opt/arma3/backups/arma3-*.tar.gz | tail -n +15 | xargs -r rm --

Persistence mods that write to a database need a database dump as well. Copy the archives to another machine; a backup on the same disk does not survive the disk.

Why can’t players join, or why is the server slow?

SymptomConfirm withFix
No subscriptionSteamCMD outputLog in with a Steam account instead of anonymous; one that owns Arma 3 if it persists
Not in the server browsersudo ss -ulpn | grep arma3Open UDP 2302 to 2306; the browser uses the query port 2303
Players kicked for signaturesThe server log (journal or .rpt) names the fileCopy that mod's .bikey into keys, or remove the mod from the client
Mod not loaded on LinuxThe server log shows a missing addonLower-case the mod folder and its files; quote the -mod argument
AI slow, rubber-banding#monitor 5Server FPS low: fewer AI, a headless client, or a faster core

Which VPS plan fits an Arma 3 server?

Pick by single-core speed first. Our Hi-CPU KVM line runs on AMD EPYC with ECC memory and is aimed at software whose main loop leans on one or two threads, as Arma’s does. Our Standard KVM line (Intel, DDR4 ECC) carries more vCores and RAM per price step, which helps once you add headless clients:

ServerHi-CPU KVMStandard KVM
Small group, vanilla or light modsHI-CPU 3: 3 vCores, 6 GBSTANDARD KVM 2: 4 vCores, 8 GB
Unit operations, large mod setHI-CPU 5: 6 vCores, 12 GBSTANDARD KVM 4: 8 vCores, 16 GB
Server plus two headless clientsHI-CPU 6: 8 vCores, 16 GBSTANDARD KVM 5: 12 vCores, 24 GB

vCores are shared virtual cores, not reserved physical ones. Every plan sits behind always-on DDoS filtering, and Windows Server 2022 or 2019 can be picked at order time on a time-limited evaluation licence until you activate your own key. You can pay by card, PayPal or crypto. Stock differs between Amsterdam and Frankfurt, so check the product page for your location; our gaming VPS page sizes other popular games on both lines.

Frequently asked

Can you download the Arma 3 server with an anonymous SteamCMD login?

No. As of October 2026 an anonymous login for app 233780 fails with No subscription. Log in with a Steam account, ideally a separate one for the server, because Steam allows one active login per account. Downloading Workshop mods through SteamCMD needs an account that owns Arma 3.

Which ports does an Arma 3 server need?

UDP 2302 to 2306 by default: 2302 for game traffic and voice, 2303 for the Steam query, 2304 for Steam, 2305 reserved for VON and 2306 for BattlEye. All five shift together with -port. For a second server on the same machine, leave a gap of 100, for example 2402 to 2406.

Why is my Arma 3 server laggy when most CPU cores are idle?

The mission and its AI run largely on one main thread, so one busy core limits the server while the others wait. Log in as admin and type #monitor 5 to see the server FPS, which is capped at 50 by default. Fewer AI, a headless client or a faster core helps; more RAM does not.

What is the difference between -mod and -serverMod in Arma 3?

-mod lists mods every player must run as well, and with verifySignatures = 2 the server checks their files against the keys in its keys folder. -serverMod lists mods only the server loads, such as admin tools or server-side scripts, which clients neither need nor see.

Related articles

All guides