How to Host an Arma Reforger Dedicated Server on Linux
Arma Reforger has an official native Linux dedicated server. You do not need Wine, a game client, or a personal Steam login on the host. The parts worth getting right are the two public UDP services, the split between replaceable runtime files and persistent profile data, and a valid JSON config that gives the public browser the same port your firewall exposes.
Skip the Linux setup with managed Arma Reforger hosting, crossplay and Bohemia Workshop modsWhat the server needs
Use an x86-64 Ubuntu host with a public address and enough CPU for the scenario you intend to run. Reforger load comes from players, AI, vehicles, active areas and addons together, so player count is not a complete sizing rule. Start with 8 GB RAM and four useful CPU threads for a smaller unit. A 32-player modded server benefits from 12 GB and more CPU, while a community approaching 64 players should plan around 16 GB and eight threads.
The dedicated server is Steam app 1874900 and supports anonymous SteamCMD login. Create an unprivileged service account and separate runtime and data directories:
sudo dpkg --add-architecture i386
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install -y steamcmd
sudo adduser --disabled-password --gecos "" reforger
sudo install -d -o reforger -g reforger /srv/reforger/runtime /srv/reforger/data/profile /srv/reforger/data/addons /srv/reforger/data/tmp
1. Download the native Linux server
Force SteamCMD to select the 64-bit Linux depot, then install into the runtime directory:
sudo -u reforger /usr/games/steamcmd +@sSteamCmdForcePlatformType linux +@sSteamCmdForcePlatformBitness 64 +force_install_dir /srv/reforger/runtime +login anonymous +app_update 1874900 validate +quit
Keep everything SteamCMD owns under runtime. Reforger's profile, downloaded Workshop addons and configuration belong under data. That boundary lets a future app_update 1874900 validate replace official binaries without treating customer data as part of the package.
2. Write a minimal valid config.json
The server configuration is JSON. This example exposes gameplay on UDP 2001, Steam A2S queries on UDP 2002, enables supported cross-platform play and starts Conflict on Everon:
{
"bindAddress": "0.0.0.0",
"bindPort": 2001,
"publicPort": 2001,
"a2s": {
"address": "0.0.0.0",
"port": 2002
},
"rcon": {
"address": "0.0.0.0",
"port": 2003,
"password": "choose-an-rcon-secret",
"permission": "admin",
"blacklist": [],
"whitelist": []
},
"game": {
"name": "Everon Operations",
"password": "",
"passwordAdmin": "choose-a-separate-secret",
"admins": [],
"scenarioId": "{ECC61978EDCC2B5A}Missions/23_Campaign.conf",
"maxPlayers": 16,
"visible": true,
"crossPlatform": true,
"gameProperties": {
"fastValidation": true,
"battlEye": true,
"disableThirdPerson": false,
"serverMaxViewDistance": 1600,
"networkViewDistance": 1500,
"serverMinGrassDistance": 50
},
"mods": []
},
"operating": {
"lobbyPlayerSynchronise": true,
"aiLimit": 120,
"joinQueue": { "maxSize": 10 }
}
}
JSON does not allow comments or trailing commas. Generate it with a real JSON serializer when building a control panel, especially for names and passwords. Hand-building JSON through shell interpolation eventually breaks on a quote or backslash.
3. Open gameplay and A2S ports
Allow both public services over UDP:
sudo ufw allow 2001/udp comment 'Arma Reforger gameplay'
sudo ufw allow 2002/udp comment 'Arma Reforger A2S'
sudo ufw allow 2003/udp comment 'Arma Reforger RCON'
sudo ufw status
bindPort is where the game listens locally. publicPort is the externally advertised gameplay port. They can differ behind deliberate address translation, but using the same number is simpler. The a2s.port value is a separate Steam query listener used by browser and status tools.
RCON is optional and uses Bohemia's UDP-based protocol. Omit the complete rcon object and leave UDP 2003 closed when you do not use it. If you enable it, choose a unique password and limit source addresses at the provider firewall where possible. Do not expose a blank or shared admin credential.
If the machine is behind a home router, forward all enabled UDP numbers to the host's private address. Opening TCP on the gameplay, A2S or RCON numbers does not repair a closed UDP path. A local ss listener proves only that the process bound the socket, not that an outside client can cross the firewall and router.
4. Test one foreground start
cd /srv/reforger/runtime
sudo -u reforger ./ArmaReforgerServer -config /srv/reforger/data/config.json -profile /srv/reforger/data/profile -addonDownloadDir /srv/reforger/data/addons -addonTempDir /srv/reforger/data/tmp -maxFPS 60
Watch for JSON errors, an unknown scenario ID, failed addon downloads and bind failures. In another terminal, confirm both UDP sockets:
ss -Hlun 'sport = :2001'
ss -Hlun 'sport = :2002'
ss -Hltn 'sport = :2003'
Then make one real join from outside the server's network and check the public browser. That is the only conclusive end-to-end test.
5. Run Reforger under systemd
[Unit]
Description=Arma Reforger dedicated server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=reforger
Group=reforger
WorkingDirectory=/srv/reforger/runtime
Environment=HOME=/srv/reforger/data/home
ExecStart=/srv/reforger/runtime/ArmaReforgerServer -config /srv/reforger/data/config.json -profile /srv/reforger/data/profile -addonDownloadDir /srv/reforger/data/addons -addonTempDir /srv/reforger/data/tmp -maxFPS 60
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=90
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
Save that as /etc/systemd/system/reforger.service, then enable it:
sudo systemctl daemon-reload
sudo systemctl enable --now reforger.service
sudo journalctl -u reforger.service -f
Run the service as the dedicated user and give SIGINT enough time to close. A restart policy is useful for a crash, but it should not hide a permanently invalid config in an endless rapid loop.
6. Add Workshop mods
Reforger uses Bohemia's Workshop, not Steam Workshop numeric published-file IDs. Each addon has a 16-character hexadecimal modId. Add entries without a version to follow the current Workshop release:
"mods": [
{ "modId": "5614E482BF83E310" },
{ "modId": "696214A3D7FAD490" }
]
Stop the server before making a large list change, keep the addon directory persistent, and read the full first-start log because downloads can make readiness much slower than a vanilla restart. Our separate Arma Reforger mod guide covers IDs, dependencies, version behavior and the GHosting panel flow.
7. Update without replacing the profile
sudo systemctl stop reforger.service
sudo -u reforger /usr/games/steamcmd +force_install_dir /srv/reforger/runtime +login anonymous +app_update 1874900 validate +quit
sudo systemctl start reforger.service
Back up /srv/reforger/data before a server update or major mod-set change. Steam can restore runtime files. It cannot recreate your profile, configuration or a Workshop release that an author removed.
Managed Arma Reforger hosting
GHosting's Arma Reforger hosting installs app 1874900 on native Linux, reserves gameplay, A2S and optional RCON as one port span, keeps runtime and data separate, enables crossplay and exposes scenarios, security and performance settings in the panel. RCON stays closed until an encrypted password is set. Bohemia Workshop links are verified before one Save and restart action applies the mod list. Plans are prepaid and never renew automatically.
Bohemia Interactive's official server hosting guide documents the Linux package and startup parameters, and its server configuration reference is the authority for current JSON fields and scenario IDs.
GHosting is an independent hosting provider and is not affiliated with or endorsed by Bohemia Interactive.