How to Install Mods on an Arma 3 Server
Adding mods to an Arma 3 server comes down to four checks per mod: the files, the line that loads them, the key that lets players in and a matching copy on every client. Here is the simple routine, where each kind of mod goes, and how to fix the key and version errors that stop players joining.
For each mod, line up the files, the load parameter and the accepted key. Then make sure players have the same version.
CBA_A3, ACE, terrains and most mission frameworks belong in -mod. True server-only tools belong in -serverMod.
verifySignatures = 2; stops unsigned, altered or unapproved client addons. Do not “fix” kicks by turning it off on a public server.
Players often update from Workshop before the server does. That is the usual cause of version mismatch kicks after a mod update.
Start with the model: four checks, one failure point per mod
If you want the simplest reliable way to manage Arma 3 server mods, stop thinking of “the mod pack” as one thing. Arma 3 treats each mod as a separate set of files, a separate startup entry and, for client-required addons, a separate trust decision. When players get kicked, one of those checks has usually failed.
- Files on the server: the mod must exist as an
@ModNamefolder, with anaddonsfolder inside containing the.pbofiles and their.bisignsignatures. If the files are missing, the server cannot load the addon at startup or when a mission asks for it. - The load line: the server must be told to load that folder with
-modor-serverMod. If the folder exists but is not on the right line, it may as well not be there. - The accepted key: for client-required mods, the server needs the mod author’s
.bikeyin itskeysfolder so it can accept the client’s signed.pbofiles. Missing or stale keys cause join kicks, not startup failures. - The player copy: clients must run the same
-moditems at the same version. If their copy differs from the server’s,onDifferentDatais the classic result.
The diagram below is the mental model to keep in mind while you work through any mod issue.
A vanilla install starts with only bi.bikey in keys. Every extra key you add tells the server which mod authors you trust for client addons. That is why careless key management is almost as risky as turning signature checks off.
arma3server/
├── @CBA_A3/
│ ├── addons/
│ │ ├── *.pbo
│ │ └── *.bisign
│ └── keys/
│ └── cba_a3.bikey
└── keys/
├── bi.bikey
└── cba_a3.bikey The five-step routine that works for most Workshop mods
This is the shortest routine that still catches the usual mistakes. It works for a typical stack such as @CBA_A3, @ace, a terrain and a mission framework.
- Fetch the mod onto the server. On a rented server, the cleanest route is usually the panel’s Workshop installer or collection importer, then the panel’s startup fields. If you are managing the files yourself, SteamCMD downloads Arma 3 Workshop items from the game app
107410, even though the dedicated server itself is the free app233780.
workshop_download_item 107410 1234567890
Replace that example item ID with the real Workshop ID. SteamCMD places Workshop content under steamapps/workshop/content/107410/<WorkshopID>/. The point of this step is simple: get the exact Workshop build the players are likely to have, rather than a random repack.
- Make sure the mod is an
@folderin the server root. Some panels do this for you. If not, copy or link the downloaded mod into the Arma 3 server directory so the startup line can reference it directly. If the folder does not start with@, or it sits somewhere the server is not being told to read, it will not load. - Copy the mod author’s
.bikeyinto the server’skeysfolder. Look inside the mod’skeys,keyorKeysfolder. This is what letsverifySignatures = 2;trust the client’s signed addon files. For a true server-only addon in-serverMod, that key is not what admits players, because clients do not load that content. - Add the folder name to the correct startup parameter. Put CBA_A3 first, then the mods that depend on it. If players need the addon to join or the mission uses its content, it belongs in
-mod. If the addon is genuinely server-side only, put it in-serverMod. - Start the server and read the
.rpt. Do not stop at “the process started”. The.rptis where missing addons, bad signatures, broken dependencies and version mismatches actually appear. If load order is unclear,-cfgDependenciesDebugPrintwill print addon dependency order into the.rpt.
The routine follows the same order the server works in: it needs the files before it can load them, and it needs the keys before it can let players in. Adding mods one at a time also makes the break point obvious. For this stack, the sensible order is CBA_A3 first, then ACE, then the terrain, then the framework.
Choose between -mod and -serverMod before you touch anything else
This is where most avoidable mistakes happen. -mod loads addons that are part of the game state players need to share. -serverMod loads server-side addons that are not broadcast to clients. If you put a terrain or ACE in -serverMod, the server may load it, but players will not be told to load it and the mission will not line up properly.
Here is the path each kind of mod takes, followed by where the common ones belong.
| Mod type | Parameter | Key in server keys? | Players need it? | Why |
|---|---|---|---|---|
| CBA_A3 | -mod | Yes | Yes | It is a dependency layer used during addon initialisation, so both server and clients need the same base functions loaded. |
| ACE | -mod | Yes | Yes | It changes gameplay systems on both sides. Putting it anywhere else causes missing classes, function errors or mismatches. |
| Mod terrain | -mod | Yes | Yes | The world data has to exist on both server and client for missions on that terrain to load. |
| Mission framework used by players | -mod | Yes | Yes | If the mission references its classes or functions, all parties must load it. |
| True server-side admin, logging or automation addon | -serverMod | Not for client join checks | No | It runs only on the server, so clients do not need the files and should not be forced to load them. |
Load order follows the -mod list from left to right. Dependencies go first, which is why Bohemia’s own example puts @CBA_A3 before @ace. Getting the order right does not save CPU or RAM directly; it stops broken initialisation, where one addon looks for classes or functions another addon has not exposed yet.
If you run a headless client, treat it like another client for gameplay addons: it needs the same -mod line as the server. Only true server-only tools can differ.
arma3server_x64.exe -config=server.cfg "-mod=@CBA_A3;@ace;@TerrainMod;@FrameworkMod" "-serverMod=@ServerTool"
./arma3server_x64 -config=server.cfg "-mod=@CBA_A3\;@ace\;@TerrainMod\;@FrameworkMod" "-serverMod=@ServerTool"
On Linux, the semicolon in each mod list must be escaped with a backslash, and mod paths must be relative paths within or below the Arma 3 directory. Many rented panels expose separate fields such as -Mods and -servermods; use those if they exist, but keep exactly the same logic.
If you are also trying to understand why a bigger mod stack changes server behaviour, it helps to know what CPU, RAM and storage do in a game server. Bohemia recommends a 3.5 GHz quad-core CPU and 4GB of RAM for a dedicated server, and most of the server’s work runs on one or two threads, so core speed matters more than core count once a heavy mod stack and mission are running.
If your current setup makes Workshop installs or startup editing awkward, see our Arma 3 server hosting comparison.
Look for straightforward Workshop installs, separate mod fields and easy access to the startup line and the .rpt. Those are the tools that make Arma 3 mod admin simpler day to day.
Keep signature checks on: keys, .bisign files and verifySignatures = 2
Arma 3’s signature system is there to solve a real server problem: you want players using the approved addon files, not edited or unknown ones. Each signed .pbo has a .bisign next to it. The server loads public keys from its keys folder, then checks incoming client addons against those accepted keys when verifySignatures is enabled.
The recommended public-server baseline is below. Remember that server.cfg is only read if you start the server with -config=; there is no default config name that Arma 3 silently picks up.
battlEye = 1; verifySignatures = 2; allowedFilePatching = 0; onUnsignedData = "kick (_this select 0)"; onHackedData = "kick (_this select 0)"; onDifferentData = "kick (_this select 0)";
verifySignatures = 2; accepts only v2 signatures. 0 disables the check, and 1 falls back to 2, so there is little reason to use anything but 2. The player trade-off is simply that people with the wrong files will be kicked quickly instead of joining with a broken or altered setup.
Do not fix “not signed” kicks on a public server by setting verifySignatures = 0;. That does not solve the real problem; it removes the trust check and allows unsigned or altered client addons in. The right fix is to add the correct author key, remove stale keys, or get the client and server back onto the same mod version.
For trusted testers, filePatchingExceptions[] is the controlled tool. It lets whitelisted Steam IDs ignore verifySignatures and allowedFilePatching rules while still logging signature issues. That is very different from opening the door for everybody. For public servers, allowedFilePatching = 0; remains the sensible default.
If you want cleaner key management, -keysFolder= can load extra folders of .bikey files, while the base keys folder is included by default. For most groups, though, the simplest reliable path is still one tidy keys folder containing only trusted author keys. Also ignore equalModRequired; it is outdated and not the modern way to enforce mod consistency.
Make it easy for players to load exactly the same mods
The server side can be perfect and players will still fail to join if they launch the wrong set locally. Arma 3 Launcher helps here, but only if you feed it recognisable Workshop mods. When a player clicks JOIN in the Launcher server browser, the join dialog can list required and optional mods, and SETUP MODS AND JOIN can subscribe the player to missing Workshop items it recognises.
This is why the Workshop route is so much smoother than random manual uploads. If your server is running manually packed or renamed addons without clear Workshop identifiers, the Launcher may struggle to map what the server is asking for to the mod the player should install. The server may still run, but the client experience becomes guesswork.
- Keep client-required addons as Workshop mods where possible. That gives the Launcher the best chance of identifying them.
- Tell players to join from Launcher and save a preset. Presets give your group one named mod set instead of a memory test every session.
- Use the green certificate icon as a quick sanity check. In the Launcher, it shows that all of a mod’s PBOs have at least one
.bisign. It is a quick check before anyone clicks join. - Keep branch alignment in mind. Stable clients cannot join a DEV server, and DEV clients cannot join stable. That is separate from Workshop mod versioning.
This part is less about CPU and more about admin time. The benefit is fewer support messages and fewer “works on my launcher” arguments. You know it helped when players can use one preset, the Launcher recognises the server’s mod list cleanly and join failures move from “what am I missing?” to a specific, fixable error in the .rpt.
Why updates break servers, and the update routine that prevents mismatch kicks
Workshop updates are the most common reason a server that worked yesterday suddenly starts kicking regulars today. The Steam client updates players’ Workshop mods automatically. The server’s copy does not update itself unless your panel refreshes it or you re-download it with SteamCMD. That leaves clients on the new build and the server on the old one, which is exactly the setup that produces onDifferentData.
- Pick a restart window. Updating live creates a mix of versions and confuses troubleshooting.
- Refresh the server’s Workshop items. Use the panel’s Workshop update tool or run the relevant SteamCMD downloads again.
- Check the actual
@folderin the server root. If your workflow copies or links from the Workshop cache, make sure the live server folder now points at the updated files. - Refresh keys if the mod author changed signing keys. A new key plus updated clients will otherwise look like a “not signed by an accepted key” problem.
- Restart the server and read the
.rpt. Confirm the addons loaded, then watch for signature or missing-addon messages. - Restart headless clients and have players relaunch their preset if needed. The mod line has to match across the whole setup.
This routine works because it removes the stale copy that often sits between Workshop storage and the live server folder. You can tell it worked when version mismatch kicks stop and the .rpt no longer reports onDifferentData.
Linux specifics: escaped semicolons, relative paths and lowercase file names
Linux Arma 3 servers are perfectly workable, but they are less forgiving about path handling. The most common mistake is copying a Windows-style mod line straight across. On Linux, the semicolon separator in -mod and -serverMod must be escaped with a backslash, or the shell may split the command incorrectly before Arma 3 even sees it.
- Use escaped semicolons:
"-mod=@CBA_A3\;@ace", not the plain Windows form. - Use relative paths within or below the Arma 3 directory: Arma 3 on Linux expects mod paths relative to the directory the server executable started from. Symlinks work, which is useful if you keep Workshop content organised separately.
- Watch case sensitivity: some mods, such as CUP Terrains and ALiVE, fail on Linux if any file names contain capital letters. Linux treats
Addonsandaddonsas different names, so a reference in one case will not find a file stored in another. Bohemia’s fix is to lowercase every file name, run from inside your mods directory: - Expect lowercasing to be temporary if your updater redownloads files: tools that refresh Workshop content may restore the original casing, so a one-off rename is not always permanent.
find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; These fixes work because they address file discovery, not gameplay. The trade-off is admin effort: a Linux mod stack often needs stricter housekeeping than the same stack on Windows. You know you fixed the issue when the server starts cleanly, the mod appears in the startup log and missing-file style errors disappear from the .rpt.
Troubleshooting: read the symptom, then trace it back to files, load line or key
Most Arma 3 mod problems are repetitive once you know what the error is really telling you. Use the flow below as the quick route, then match the message to the likely cause in the table.
| Symptom or message | Likely cause | Fix, why it works, and how to tell |
|---|---|---|
| Player kicked for files not signed by a key the server accepts | The server is missing the current mod author’s .bikey, has an old key, or the player is loading a client mod the server does not trust. | Copy the current .bikey from the mod’s keys/key/Keys folder into the server keys folder, and remove stale keys if the mod changed signer. This works because the server can now validate the client’s .bisign against an accepted public key. You know it helped when the join attempt no longer logs a key or signature failure in the .rpt. |
onDifferentData or a clear version mismatch kick | The client and server are using different builds of the same signed mod, usually after a Workshop update. | Update the server’s Workshop copy, make sure the live @folder actually changed, restart the server, and have clients relaunch with the updated preset. This works because both sides are then comparing the same signed data, not merely the same mod name. You know it helped when mismatch kicks stop. |
Mission will not load and the .rpt lists missing addons | The mission needs a mod the server is not running, or a dependency such as CBA_A3 is missing or loaded too late. | Add the missing mod to -mod, put dependencies first, and use -cfgDependenciesDebugPrint if the order is unclear. This works because the server can then resolve the classes and functions the mission references. You know it helped when the mission starts instead of failing at load. |
| Server will not start after adding a mod | Broken command-line syntax, wrong folder name, Linux path issues, unescaped semicolons, or a config not being loaded because -config= is missing. | Check the quoted startup line, confirm the @folder is in the server root, use relative paths on Linux, escape semicolons there, and make sure -config=server.cfg is present. This works because Arma 3 can only load what the process command line parses correctly. You know it helped when the process stays up and the .rpt continues past addon initialisation. |
| Mod list in the Launcher is cut off | The Steam query response hits the default packet limit. | The default steamProtocolMaxDataSize = 1024 can be too small for long mod lists. Raising it can expose more of the list in the Launcher, but Bohemia warns this is dangerous because it can cause UDP fragmentation on some older routers. If you change it, test carefully and prefer presets so players are not relying only on the browser list. |
| Headless client is kicked or fails after mod changes | The headless client is not using the same -mod line as the server. | Start the headless client with the same gameplay mod line as the server; only true server-only tools may differ. This works because the headless client must load the same addon classes and functions the server expects it to handle. You know it helped when the headless client connects and stays connected. |
| Launcher does not recognise what players need | The server is using manually uploaded or renamed mods without clear Workshop identifiers. | Use Workshop versions where possible and keep the server’s client-required mods aligned with what the Launcher can recognise. This works because SETUP MODS AND JOIN depends on matching the server request to known Workshop items. You know it helped when the join dialog shows the right required mods instead of leaving players to guess. |
| Clients on stable cannot join, but the mod list looks right | Branch mismatch between DEV and stable. | Make sure the server and clients are on the same branch. This works because DEV and stable are incompatible before normal mod compatibility even comes into play. You know it helped when the join attempt gets past the branch block and into normal mod validation. |
Arma 3 server FAQ
Do players need the same mods as the server?
Players need the same mods that the server loads with -mod, and they need the same versions. They do not need true server-only addons loaded with -serverMod. If the mission uses a terrain, ACE or a framework the server runs in -mod, clients need those too.
What is the difference between -mod and -serverMod?
-mod loads addons that are part of the shared game state and are required by clients. -serverMod loads server-side addons that are not broadcast to clients, so players do not need them. Put client-required content in the wrong place and you get join, mission load or dependency errors.
Where do I put the .bikey files?
Copy each trusted mod author’s .bikey into the server’s keys folder. That is the folder Arma 3 uses to decide which signed client addons it will accept when verifySignatures = 2; is on. You can also add extra key folders with -keysFolder=, but the central keys folder is the simplest starting point.
Why does my server kick players after a mod update?
Because players’ Steam clients usually update Workshop mods before the server copy is refreshed. The server is then running the old files while players bring the new ones, which causes version mismatch kicks such as onDifferentData. Update the server’s Workshop copy, refresh any copied @folders, restart and recheck the .rpt.
Can I install a Steam Workshop collection on an Arma 3 server?
Yes, if your host panel supports collection installs or if you fetch the items yourself and arrange the resulting @folders properly. A collection is only a delivery method, though; the server still needs the right folder names in the right startup parameter, the correct keys for client-required mods and matching client versions. Treat the collection as convenience, not as automatic correctness.
More Arma 3 server help
The host comparison and our explainer on what server hardware actually does.
Whatever tool installs your mods, a host panel, SteamCMD or a manual upload, the same four checks apply to every mod: the right @folder, the right load line, the current key and a matching client version.