ARMA REFORGER · SERVER SETUP GUIDE · NOVEMBER 2026

How to Set Up an Arma Reforger Dedicated Server

A start-to-finish setup for an Arma Reforger dedicated server: install it, write one clean config.json, open the right ports, and get the five big choices right first time: scenario, privacy, admins, crossplay and mods.

One config first

Keep the first launch simple: official scenario, no mods, BattlEye on, fastValidation on. That isolates networking and JSON mistakes before extra variables appear.

Dedicated means always on

A dedicated server runs without a game client and can stay up all day. Player-hosting is only on PC and stops when that game session ends.

Passwords do different jobs

The join password controls entry, passwordAdmin controls in-game admin login, and the RCON password controls remote tools. Mixing them up is one of the fastest ways to lock yourself out.

Start stable, add mods later

Get the base server visible and joinable first. Then add mods one at a time, preferably with pinned versions, so an overnight update does not change the server under you.

Choose the server shape before you install it

Arma Reforger has two hosting modes. A player-hosted server is a listen server started from Multiplayer > Host inside the game, and that option is only available on PC. A dedicated server is a separate server process with no game instance attached; it only handles game information and network synchronisation, so it is the right choice if you want a proper community server that stays up when nobody is playing.

That is also why renting is often simpler for a small unit that wants results tonight. You avoid port forwarding, most control panels make mod handling easier, and managed hosts commonly apply -maxFPS 60 for you. If you are weighing home hosting against renting, our guide to self-hosting a game server covers the practical trade-offs around power, networking and maintenance.

The best start is to make five decisions up front, because each one changes what goes in config.json and what the server will cost in CPU time, memory, bandwidth or admin effort.

Decision Config key Recommended starting value Why it matters
Scenario game.scenarioId Conflict – Everon Scenario choice sets the base workload. Conflict’s persistent systems and AI logistics create a more sustained CPU load than a shorter Combat Ops session.
Privacy and access game.visible, game.password true with a join password while testing You stay visible in the browser for your group, but random players cannot wander in while you are still checking the setup.
Admins and RCON game.passwordAdmin, game.admins, rcon.password Set all three immediately In-game admin and remote admin are separate paths. Having both means you are not stuck if one method is unavailable.
Crossplay game.crossPlatform true if you want all platforms; otherwise PC-only This decides who can join from day one. Settle it before you invite people, so nobody builds a squad around a server they later can’t reach.
Mods game.mods [] Leaving mods empty removes startup failures, extra downloads and version mismatch problems from the first launch. Add them only after the base server works.

Install the dedicated server files

On Steam, the stable Arma Reforger dedicated server app is 1874900. There is also an experimental app, 1890870. For a community server, stay on stable unless everyone joining is deliberately using the experimental branch as well. Stable reduces avoidable client-version mismatches and keeps your setup predictable after tonight’s first launch.

A minimal SteamCMD runscript looks like this:

@ShutdownOnFailedCommand 1
@NoPromptForPassword 1
force_install_dir ../armar_ds
login anonymous
app_update 1874900 validate
quit

Run it with steamcmd +runscript update_armar_ds.txt. On Windows the server executable is ArmaReforgerServer.exe. On Linux it is ./ArmaReforgerServer. Both platforms work; the main difference for most admins is simply where you prefer to manage files, services and firewalls.

Write one clean config.json

Keep the first config short and deliberate. Leave bindAddress and publicAddress out unless you already know you need them. This example is enough to boot a visible, passworded server with admin access, RCON, crossplay and the official Conflict – Everon scenario.

{
  "a2s": {
    "port": 17777
  },
  "rcon": {
    "port": 19999,
    "password": "ChangeThisRconPass",
    "permission": "admin"
  },
  "game": {
    "name": "My Reforger Server",
    "password": "ChangeThisJoinPass",
    "passwordAdmin": "ChangeThisAdminPass",
    "admins": [
      "YOUR_IDENTITY_ID"
    ],
    "scenarioId": "{ECC61978EDCC2B5A}Missions/23_Campaign.conf",
    "maxPlayers": 32,
    "visible": true,
    "crossPlatform": true,
    "gameProperties": {
      "fastValidation": true,
      "battlEye": true
    },
    "mods": []
  },
  "operating": {
    "lobbyPlayerSynchronise": true
  }
}

Why each block matters:

  • a2s is the server query service used for browser visibility on port 17777.
  • rcon starts the remote admin service on port 19999. Without a valid RCON password, it will not start.
  • game.name is the browser name players see.
  • game.password is the join password. This is for entry, not admin rights.
  • game.passwordAdmin is the in-game admin password used with #login.
  • game.admins is your admin allow-list. Listed users can #login without the password.
  • game.scenarioId picks the only scenario the server will run. There is no mission rotation.
  • game.maxPlayers sets your slot count. Higher values increase the amount of player state and replication work the server may need to process.
  • game.visible controls browser visibility.
  • game.crossPlatform decides whether all platforms can join.
  • gameProperties.fastValidation should stay true, especially on a public server.
  • gameProperties.battlEye keeps BattlEye enabled.
  • game.mods is empty on purpose so the first launch only tests the base game.
  • operating.lobbyPlayerSynchronise sends the list of connected players with the server’s heartbeat, so the browser shows the real player count. It is on by default; writing it out keeps it visible when you edit later.

Three JSON rules catch most first-time mistakes. Parameter names are case-sensitive, so scenarioId is not the same as scenarioID. Strings such as names, passwords, IDs and scenario paths go in quotes, while booleans and numbers do not. And every comma matters: one trailing comma is enough to stop the server before it finishes reading the file.

If you want to see the scenario paths available on your install, start the server once with -listScenarios; it will log the available .conf paths at startup. A few official examples are below.

Scenario Scenario ID path
Conflict – Everon {ECC61978EDCC2B5A}Missions/23_Campaign.conf
Game Master – Everon {59AD59368755F41A}Missions/21_GM_Eden.conf
Combat Ops – Arland {DAA03C6E6099D50F}Missions/24_CombatOps.conf
Conflict – Arland {C41618FD18E9D714}Missions/23_Campaign_Arland.conf
Combat Ops – Kolguyev {CB347F2F10065C9C}Missions/CombatOpsCain.conf

Ports, networking and why UDP matters here

Your server uses three main ports. UDP 2001 is the public game port players actually connect to. UDP 17777 is the A2S port, which answers Steam-style server queries from server lists, monitoring tools and bots. UDP 19999 is the RCON port for remote administration.

For a self-hosted server to be reachable from outside your local network, you forward UDP traffic for the ports you are using. In practice, 2001 is the port players cannot do without, 17777 is worth opening so outside server lists and status bots can see you, and 19999 only needs to be reachable if you use remote RCON tools. This is the traffic pattern to keep in mind:

Which port carries what on an Arma Reforger server
Players joining (PC, plus Xbox and PlayStation with crossplay on)
Players
UDP 2001 · game
Your server
Server lists, status bots and monitoring
Query tools
UDP 17777 · A2S
Your server
Remote admin software (optional)
RCON client
UDP 19999 · RCON
Your server
In-game admins don’t need RCON: #login in chat travels over the normal game connection on 2001. RCON only starts when rcon.password is set (3+ characters, no spaces).
Forward 2001 first; it is the only port players cannot join without. 17777 and 19999 are for tools, not for joining.

Do not rush to set bindAddress or publicAddress. The normal starting point is to leave them out, which means the server binds openly and lets the backend auto-detect the public address. Set them only when the default behaviour is wrong, most commonly in a Linux container or Docker setup where the server can register the container IP instead of the reachable host IP. In that case, clients see the server but fail to connect until publicAddress and the correct public port are set explicitly.

Two final points save time. Port forwarding here is UDP, not TCP. And IPv6 is not supported, so if your network is relying on IPv6-only assumptions, fix that before spending an hour on the JSON.

Start it with the right launch options

The three startup parameters that matter most on day one are the config path, the profile path and the frame cap. A clean Windows launch looks like this:

ArmaReforgerServer.exe -config ".\config.json" -profile ".\profile" -maxFPS 60

On Linux, the equivalent form is:

./ArmaReforgerServer -config /home/<username>/.config/ArmaReforgerServer/config.json -profile /home/<username>/.config/ArmaReforgerServer -maxFPS 60

-maxFPS matters because, without it, the server can try to consume all available resources. In practical terms that means unnecessary main-thread CPU use, extra heat and less headroom for other processes on the box. A starting value of 60 is sensible because it limits waste without forcing an unusually low cap; if you later tune upward, do it for a reason rather than as a reflex.

The trade-off is simple: a lower cap conserves CPU time, but if it is set too low it can become its own ceiling under load. The way to tell if your setting helped is to watch the logs rather than guess from one player’s feel. Console logs are written to the profile folder, and -logStats can log server FPS at an interval so you can compare busy sessions against quiet ones.

The profile folder matters for more than logs. By default, Workshop add-ons also download there, so keep it on storage you can monitor and back up.

Privacy, browser visibility, admins and RCON

There are three sensible access patterns for a new server. Public and open means visible: true with no join password, which is only wise when the rules and admin cover are already in place. Public but passworded means the server still appears in the browser yet only players with the join password can enter, which is the safest starting point for a small group. Hidden means visible: false, which removes it from the server browser and is useful for testing changes without advertising the server.

Keep the three passwords separate. game.password is the join password for players. game.passwordAdmin is the in-game admin password; open chat with C in the lobby or Enter in-game, then type #login <password>. The rcon.password is for remote admin software, and it is not the same system. Admin and RCON passwords should contain no spaces, and the RCON password must be at least 3 characters.

The matrix below is the quick reference worth checking before you invite anyone:

Four access setups and what they mean for players
SetupListedLockedOpen to all#login
Public and open (visible true, no password)YesNoYesYes
Public with password (visible true)YesYesNoYes
Hidden with password (visible false)NoYesNoYes
Hidden test server, no passwordNoNoPartlyYes
Locked means players need the join password (game.password). Hidden servers are joined by direct connection with the server’s IP and port. ‘Partly’ means anyone who learns the IP and port can still get in.
For a new community server, start in the second row: listed so your group can find it, passworded until your rules and admins are in place.

game.admins accepts IdentityIds and SteamIds, but there are two details that matter. First, the list is limited to 20 unique IDs. Second, only IdentityIds receive the priority join queue benefit, so if reserved access during busy periods matters, collect IdentityIds rather than relying on SteamIds alone.

If you expect the server to fill, use joinQueue.maxSize and slotReservationTimeout deliberately. A join queue (up to 50 places; 0, the default, turns it off) lets players wait in line for a slot on a full server instead of being turned away. slotReservationTimeout (5 to 300 seconds, default 60) decides how long a slot is held for a player who was kicked by a replication error, so they can reconnect without losing their place. The cost is social rather than technical: a long reservation on a busy server means a free slot sits empty while others wait.

For RCON itself, choose the permission level with care. admin can run state-changing commands, while monitor is safer for tools or staff who only need visibility. Command whitelist and blacklist options are there for a reason: they reduce the blast radius if one remote tool or user is misconfigured.

Crossplay and mods: keep the rules clear

Crossplay

There are two clean ways to configure platform access. If you want all platforms, set game.crossPlatform to true and leave supportedPlatforms undefined. If you want a PC-only server, leave crossPlatform false or omitted and let supportedPlatforms stay at its default PC-only setting.

The reason to keep it this simple is that platform rules affect who can see the server as eligible to join. If you are trying to build a mixed-platform community, set crossplay once and make that policy clear. If you want tight control for a PC modding group, keep it PC-only from the start instead of changing course after players settle in.

Mods

The mods array is a list of objects with a modId, a name and, optionally, a version. If you pin a version, the server keeps loading that specific release until you change the JSON. If you omit the version, the server uses the latest version, which is convenient but means a mod author’s update can alter your server overnight.

Clients automatically download and activate required mods when they join, so the server’s mod list is also the gatekeeper for client content. That is why pinned versions are safer for organised groups: you control when the change lands. If a mod is marked with required: false and it fails to download, the server removes that mod with a warning instead of stopping outright; useful for optional extras, not for anything the scenario depends on.

To build the list, activate the mods in-game, open Mod manager, use the JSON tab and copy the block. Then add mods one at a time and read the log after each change. That approach costs a bit more time tonight, but it saves hours of guessing later because each startup failure has one obvious suspect. Keep this flow in mind when deciding whether to pin or update:

Server won’t start or misbehaves after adding mods
Server stops or warns after a mod change
Does it start with the mods list empty?
No
Not a mod problemCheck JSON syntax, key case and the scenarioId first.
Yes
Does the log name a mod that failed to download?
Yes
Check that entryRe-copy the modId from the Workshop page or the Mod manager JSON tab.
No
Did it break overnight with no change from you?
Yes
Unpinned updateThe latest version loaded. Pin the last working version in that mod entry.
No
Is the failing mod optional for your scenario?
Yes
Let it fail softlySet “required”: false so a failed download is dropped with a warning.
No
Remove the last mod you added, restart, then add mods back one at a time.
Each step removes one suspect. Adding mods one at a time means there is only ever one new suspect to check.

Mods increase startup work in three ways: download time, disk activity and content loading. On containers, large mod downloads can also hit temporary write-path issues; if you see Docker-related curl write errors, use -addonTempDir so temporary add-on files land somewhere suitable.

Persistence, AI and the settings that really affect performance

Once the server works, these are the settings worth learning before you blame the machine. Persistence settings control how often state is written to disk and how much of it you keep. autoSaveInterval decides how often session saves happen, while saveRetention decides how many are kept. Shorter intervals reduce lost progress after a crash, but they also mean more frequent disk writes.

playerSaveTime does the same job for player data. Lower values protect recent progress more aggressively, but they cost extra storage activity. loadSessionSave and keepSessionSave matter when you want the server to resume an existing state instead of booting as if fresh every time.

AI settings mostly hit CPU first and memory second. aiLimit lets you put a ceiling on AI count if a scenario’s combat density is overwhelming the simulation thread. disableNavmeshStreaming loads the full navmesh into memory, which can give slightly better AI performance, but the trade-off is a bigger memory footprint, up to hundreds of MB depending on the terrain.

View distance settings affect both gameplay feel and server load. serverMaxViewDistance sets the upper limit for the world view distance, while networkViewDistance caps how far replicated entities are streamed. Lowering networkViewDistance reduces replication work and bandwidth use first; lowering serverMaxViewDistance is the bigger gameplay compromise because it cuts long-range awareness more directly. Keep fastValidation set to true; that is not a performance toggle to play with on a public server.

Situation Tune first What it saves Player trade-off Upgrade instead when…
Conflict slows down as the session grows Reduce networkViewDistance, review aiLimit Main-thread CPU and bandwidth Less long-range entity visibility or fewer active AI A fresh restart with the same settings still struggles early
AI pathing feels heavy Try disableNavmeshStreaming only if memory headroom exists Some AI pathing overhead Higher memory use Memory pressure appears or AI still behaves poorly after the change
Too much progress is lost after a crash Lower autoSaveInterval or playerSaveTime Lost progress after a crash More frequent save activity Storage is already the bottleneck and saves are becoming disruptive
Server uses too many resources while idle or lightly loaded Keep -maxFPS 60 Main-thread CPU None if the server is not close to that cap in real play Server FPS drops because the cap itself is too restrictive under your actual load

If you are trying to judge the machine rather than the config, read how game server hardware requirements work before spending money in the wrong place. Arma Reforger load is shaped more by scenario design, AI, replication range and session persistence than by a single headline spec. Bohemia’s own Docker example assigns 4 CPU cores and 6 GB of memory, but that is an example allocation, not a universal requirement.

Keep it running after updates, and troubleshoot by symptom

After game updates, run SteamCMD again with app_update 1874900 validate. The validate step is worth keeping because it catches damaged or partial files instead of leaving you to guess whether the update or the install is at fault. Before major changes, back up both config.json and the whole profile folder so you keep logs, saves and downloaded add-ons together.

If you edit the BattlEye RCon settings in BattlEye\BEServer_x64.cfg, append the RCon port and password instead of editing existing lines. Changing the wrong lines there can produce the player-facing error about missing GameID or MasterPort settings, which looks like a networking problem but is really a BattlEye config mistake.

First-fix troubleshooting table

Symptom Likely cause First fix
Server does not appear in the in-game browser game.visible is false, the server stopped during start-up, or it registered an address players can’t reach Check game.visible is true, read the end of the console log in the profile folder, and confirm UDP 2001 is forwarded
Players can join on the local network but not from outside UDP 2001 is not forwarded correctly, or the public address is wrong in a container setup Forward UDP 2001 and 17777, then only set publicAddress/publicPort if Docker or container networking is registering the wrong IP
Server shuts down when backend connectivity drops Default shutdown behaviour after backend loss Set operating.disableServerShutdown if you want the process to stay up; this avoids the automatic stop, but it does not solve the backend outage itself
JSON parse error or settings seem ignored Wrong key case, bad quotes, or a missing or extra comma Validate the JSON structure, then re-check case-sensitive keys such as scenarioId and passwordAdmin
Mod fails to download or startup stops on a mod Bad mod entry, changed latest version, or temporary download path issue Remove the last-added mod first, pin the version for critical mods, and on Docker use -addonTempDir if temporary write errors appear
Admin login is refused Using the join password instead of passwordAdmin, or the admin password contains spaces Use chat and #login with the exact admin password, and remove spaces from passwordAdmin
Players get “Missing GameID/MasterPort server config settings” Incorrect BattlEye RCon config editing Re-check BattlEye\BEServer_x64.cfg and append the RCon lines instead of editing existing ones

Should you self-host or rent?

Both can work. The better choice depends less on budget slogans and more on how much networking, patching and fault-finding you want to handle yourself.

If this sounds like you Better fit Why
You want the server online tonight with the least networking work Rent No port forwarding, simpler file access through a panel, and mod management is usually easier for small communities
You want full OS control, your own backup routine and direct access to every file Self-host You control the whole environment, including services, firewalls and storage layout
You need it to stay up when your gaming PC is off Dedicated server, rented or always-on home machine Player-hosting is tied to a live PC game session; a dedicated server is not
You are only testing with a few trusted players and do not mind router work Self-host The base setup is straightforward once ports and JSON are correct
You expect frequent updates, staff handovers and mod changes Rent Less local maintenance and fewer chances for one machine problem to take the whole server offline

If you are comparing managed options, use our Arma Reforger server hosting comparison to check how providers handle access, file management and general admin convenience rather than chasing one headline feature.

Still deciding where to host it?

If you want to skip router work and get straight to the control panel side of setup, compare managed options first, then apply the same config choices from this guide on the server you rent.

Compare the best Arma Reforger server hosts

Arma Reforger server FAQ

Is the Arma Reforger dedicated server free?

Yes. The dedicated server is Steam app 1874900 and downloads through SteamCMD with an anonymous login, so you don’t need to buy a second copy of the game for the server. What you pay for is the machine, or a rented plan, plus the time to manage updates, ports, saves and mods.

Which ports does an Arma Reforger server need?

The default game port is UDP 2001, the A2S query port is UDP 17777, and the RCON port is UDP 19999. For outside players to find and join a self-hosted server, 2001 and 17777 are the important pair; 19999 is only needed remotely if you want RCON from outside the local machine or network.

How do I make my Arma Reforger server private?

The simplest method is to keep visible set to true but set a game.password, so only invited players can join. For testing, you can also set visible to false so it does not appear in the server browser at all.

Can Xbox and PlayStation players join my Arma Reforger server?

Yes, if you set game.crossPlatform to true and leave supportedPlatforms undefined. If you want a PC-only server, leave crossplay off or omitted and keep the default PC-only platform behaviour.

How do I add mods to an Arma Reforger dedicated server?

Add entries to the mods array with each mod’s GUID, name and, if you want stability, a pinned version. Required mods are automatically downloaded and activated by clients when they join, so add mods one at a time, watch the profile logs after each startup, and pin versions for anything important to avoid surprise changes after a mod update.

More Arma Reforger server help

Compare hosts, or read how game server hardware and self-hosting work in general.

Bohemia adds and renames config keys between game versions (several of the keys above were renamed in 0.9.8 and extended in 1.0 to 1.9), so if a key is rejected after an update, compare your file with the current server config template before changing anything else. Arma Reforger publishes no official server RAM or CPU figure; plan size depends on scenario, AI count and player count.