Setup guide
From an empty Windows box to players connecting
Tower runs your unit's game servers (Arma 3, and now Arma Reforger) from a web page. This guide walks the Arma 3 path end to end; Reforger differs mainly in being easier to install (no Steam account needed) and is called out where it matters. You install one small agent on a Windows box you already control, and after that the things you use remote desktop for today (installing a server, updating mods, pushing a mission, restarting on a schedule, kicking someone) happen in the browser.
This is the whole path, in order, written for the person who runs the servers. Expect the first server to take an afternoon, most of it spent waiting on downloads. Nothing on this page needs an account to read, so it is safe to send to whoever is doing the install.
Before you start
A Windows box you control, with administrator access.
The agent is Windows only, and registering it as a service needs an elevated prompt once. Budget about 5 GB of disk for each server's own copy of the dedicated server, plus whatever your mod pack weighs (that part is downloaded once per box and shared between servers). The box can already be running another panel: Tower never touches a process it did not start or deletes a file it did not place.
A Steam account that owns Arma 3 (for Arma 3 servers).
Not optional, and not a mistake in your setup: Steam's anonymous login cannot download the Arma 3 dedicated server at all. A spare account is tidier but needs its own copy of Arma 3, so most units use an admin's account and accept that its Steam session ends up cached on the game box. Arma Reforger is the exception: its dedicated server installs anonymously, so a Reforger-only box needs no Steam sign-in.
A Billet account, in the unit that will own the servers.
Tower has no accounts of its own. You sign in with Billet, which signs in with Discord. A unit owner on Billet can do everything in Tower straight away. Everyone else gets explicit capabilities (view, operate, missions, mods, configure, admin) from the Permissions page, per unit or per server. Rank and billets grant nothing here on their own, on purpose.
Somewhere for game traffic to arrive.
The agent dials out to Tower, so management needs no inbound ports at all. The game itself does: a block of UDP ports has to reach the box, both through Windows Firewall and through whatever your hosting provider does upstream. Step 7 covers checking it.
Enroll the box and install the service
Sign in to Tower, open your unit, follow Boxes in the unit nav, and use Enroll a box. Tower shows you three things: a download button for tower-remote.exe with the version it is serving, a one-time enrollment token that is valid for 15 minutes and shown exactly once, and the command to paste on the box.
The download lives inside the panel, so get the file while signed in, then copy it to the box (or sign in on the box and download it there). Windows will warn about it the first time. That is expected and covered further down.
Then, on the box, in the folder you saved the file into:
.\tower-remote.exe enroll --url https://tower.billet.gg --token YOUR-TOKENCopy the exact line from the panel rather than typing this one, since it already carries your URL and token. The leading .\ matters: PowerShell will not run a program from the current folder without it. Add --name if you want the box to show up under something other than its hostname.
Then open a new PowerShell window with Run as administrator, cd back to the folder tower-remote.exe is in (an elevated window starts in C:\Windows\System32, not where you were), and run:
.\tower-remote.exe installThat registers a Windows service called Tower Remote, which starts at boot, survives you logging off, restarts itself if it crashes, and updates itself from then on. You will not need to download the file again. Administrator is not optional here: Windows only lets an elevated process register a service, and the command says so and stops if you skip it.
Within a few seconds the remote should appear online in the panel. If it does not, the box needs to be able to reach Tower over HTTPS outbound.
Sign SteamCMD in, once
On the box, in a normal (not elevated) prompt, in the folder tower-remote.exe is in:
.\tower-remote.exe steam-loginIt asks for your Steam account name, sets SteamCMD up if this is a fresh box, and then hands the window over to SteamCMD itself, which asks for the password and, if you have Steam Guard, a code. Its own words for what is happening: Type directly into this window - Tower does not see, store, or log what you type.
That is the whole reason this step is a command on your box instead of a form in the browser. Tower never holds a Steam password in any form, not encrypted, not temporarily. SteamCMD keeps its own login cache in its own folder on the box, and Tower saves only the account name. Nothing about this step reaches our servers.
After the login, it checks that the same session works unattended, because the installs are actually run by the Windows service rather than by you. If that check fails it tells you and does not save the account, since installs would fail the same way.
To see where you stand at any time, without being prompted for anything, from the same folder:
.\tower-remote.exe steam-statusIt names the configured account and says whether the cached session is still good. Steam invalidates sessions from time to time, and a password change ends them immediately. The fix is always the same command you started with, and the failure messages say so rather than leaving you to guess.
Create the server
From the unit page, create a server. Tower asks for four things: a name, which remote it runs on, an install folder (it suggests one under C:\TowerServers\ based on the name), and a game port, which it allocates clear of every other instance it knows about on that box. Then press Create and install.
Install is not a separate button. The job starts immediately, and the server page shows its progress and log while SteamCMD fetches roughly 5 GB. First time on a fresh box, it installs SteamCMD first.
Give every server its own install folder, which is what the suggestion does. Server-side mods keep their extension files and their configuration inside the install folder, so two servers sharing one folder cannot run different ones, and neither can be updated while the other is running. Mods themselves are downloaded once per box and shared, so a second server costs far less disk than it sounds.
One honest limit on the port suggestion: Tower knows about ports used by its own servers, plus anything the last box diagnostics run reported. A port held by another panel or another application is only caught when the server actually tries to start, and then you get a refusal naming the process rather than a fight over the port.
Set what matters on day one
The settings page is generated from the full Arma 3 parameter set, grouped and searchable, with an Advanced toggle for the long tail and a Save and apply button that writes the config files on the box. You never hand-edit server.cfg again. New servers start from a safe baseline already: BattlEye on, signature verification at the current version, file patching off, UPnP off, and the server set to come up already running its mission instead of ending it the moment it is empty.
Four things are worth setting before anyone tries to join.
- Server name. What players see in the browser. Tower seeds it from the name you gave the server, so it is never left as the machine name.
- Passwords. The join password (leave it blank for an open server) and the admin password, which is what grants in-game admin.
- RCON password. Set one. BattlEye will not enable RCON without a password, and without RCON there is no web console, no kick or ban from the browser, and no restart warnings in chat. The RCON port has to sit outside the game port block (the game port through game port plus four); the convention is game port minus one.
- Restart schedule. Optional, but this is where a lot of the value is. You add times in your own local time and Tower stores them in UTC so every admin sees the same instant. A due restart warns in chat and then restarts even with players connected, on purpose: a busy server is exactly the one that needs restarting, and predictable beats polite. A window missed because the box was offline is skipped rather than fired late.
Build the mod list from a launcher preset
You do not retype your mod list. Open the Mods page, choose Import from Arma 3 Launcher, and give it the preset file your unit already passes around: in the launcher's Mods tab, use Export to file or Export to clipboard, then upload or paste it here. Tower parses it, shows what it found, and you save it as a named preset.
Anything in the export that is not on the Steam Workshop is listed as skipped, because Tower has nothing to download. Those are your private and hand-built mods. Drop each mod folder into the remote's local mods folder (C:\ProgramData\Tower\local-mods) by whatever means you use today, press Rescan local mods, and they join the library like any other mod.
Each mod in the preset says who loads it. Most load on the server and the players both. Anti-cheat tools and extensions are Server only. Mods only your players need, sound and visual packs being the usual ones, are Players only: your servers do not run them and do not keep a copy of them, but they still collect each one's signature key, which is what lets a player who has the mod loaded join at all.
Assign the preset to a server from the Game servers card on the same page. The row tells you where it stands: no preset, never synced, stale, or in sync. Headless clients inherit their parent server's list, so there is nothing to keep in step by hand.
Updates are detected continuously and applied only when you say so. Tower shows which mods have a newer version and you press update, per preset or for everything. If a server affected by the update is running, it says which one and offers to restart it with the update, because Arma reads mods when the process starts and files that change underneath a running server produce signature mismatches for joining players. Nothing ever updates itself while you sleep.
Creator DLC, meaning S.O.G. Prairie Fire, is a per-server switch rather than a mod you download: on the Mods page, with the server stopped, switch that server's install to the Creator DLC branch. Adding it to a preset only tells the preset to reference it, so both steps are needed. SteamCMD cannot update files a running server holds open, which is why the button is disabled until you stop it.
Signature keys are handled for you: Tower collects each mod's key and copies it where the engine actually looks. Mods that publish no key at all are named in the job log rather than skipped quietly, which matters more than it sounds. See the next section for what to do about them.
Upload a mission and put it in the rotation
Missions are uploaded to Tower, not to the box. On the Missions page, upload a .pbo named the way Arma expects, MissionName.WorldName.pbo. Uploading the same name and world again creates a new version and never overwrites the old one, which is what makes rolling back a real option rather than a hope. Your unit has a storage quota and the page shows how much of it you are using.
Then open that server's Missions page, assign the mission (and the version you want), and sync it to the box. The Rotation editor is where you say what the server comes up running: an empty rotation means the server starts and sits there waiting, and Tower tells you so instead of leaving you to work it out. Every older version has a roll back button next to it, which re-points the assignment and re-syncs.
Be aware of what the check on upload does and does not do. It checks the file is named in the right shape. It does not confirm the world exists in your mod set, so a mission built against a different mod pack, or one whose terrain comes from a Creator DLC, is only caught when the server tries to load it and refuses. If a mission will not load, that mismatch is the first thing to suspect.
Someone switching mission in game is normal use, not drift. Tower does not fight it or put the old one back.
Start it, and get someone to join
Press Start on the server page. The status tile fills in with players, mission and map once the server answers, and the RPT log tail underneath is Arma's own log, live. A heavily modded server can take several minutes to get there on first start.
Before you ask anyone to try connecting, use Check firewall. It reports one of Allowed, Not allowed or Unknown for this server's UDP port block, and shows the exact rule to add. If you want Tower to add it, the Allow this port button does it behind a confirmation. That is the only thing Tower ever writes to your Windows Firewall, and it never happens as a side effect of starting a server.
Then have someone load the same preset in their launcher and connect. If the server is running, the port is open, and they still cannot get in, read the signature keys note below first: a missing key produces exactly that symptom.
Arma Reforger differences
The install needs no Steam account.
Reforger's dedicated server installs with Steam's anonymous login, so step 2 does not apply to a Reforger-only box. Everything else about creating a server is the same: pick the game in the create form and the install starts on its own.
Mods are pinned to a version on purpose.
Reforger mods come from Bohemia's own workshop, and the server downloads them itself at startup; Tower manages the list, not the files. Left to itself the game always takes the latest version of every mod at the next restart, which is exactly how a Friday workshop publish changes what Saturday's op runs. So Tower pins each mod to the version you added, shows you when a newer one exists, and only moves the pin when you say so. The cost is honest too: a pinned version can disappear from the workshop, and after a game update mod authors can lag behind for days. Tower shows both rather than hiding them.
Scenarios instead of missions.
There are no .pbo uploads. Content is scenarios that live inside the base game or inside workshop mods, chosen by id on the server's Scenario tab: pick from the official list, discover what your mods add, or paste an id by hand.
Three UDP ports, not a block.
Each Reforger server uses three separate UDP ports: game, query and RCON. Tower allocates them as a trio when you create the server, and the firewall check covers all three. If your provider filters upstream, all three need to be open there too.
Crossplay has consequences before it has benefits.
Servers are PC-only by default. Turning Xbox on silently hides the server from console browsers if any mod in the list is not console-certified, and PlayStation disables mods entirely. The toggles sit next to the mod list and say so; read the copy there before promising crossplay to anyone.
Update day is mandatory and same-day.
When Bohemia ships a game update, Steam pushes it to every player's machine within hours, and a server must match the client build exactly, so every Reforger server is unjoinable for updated players until it is updated. Tower checks for new builds a few times a day, flags each server that is behind on the dashboard and in Discord, and gives you a one-click Update server that stops, updates and restarts it. Nothing updates itself: the click is yours, and until it happens the server stays on the old build.
Sharp edges
Windows will warn about the download.
The agent is not code-signed yet, so SmartScreen shows its blue Windows protected your PC box on first run and you have to choose More info, then Run anyway. We would rather tell you that than have you meet it cold. A signing certificate is on the list before Tower is open to anyone beyond pilot units.
What a careful admin can check instead is the fingerprint. Tower publishes the sha256 of the exact build it is serving, and you can compute the same value for the file you downloaded:
Get-FileHash .\tower-remote.exe -Algorithm SHA256If those match, the file is the one we built. It is not proof of origin the way a signature is, and we are not pretending otherwise.
The Steam account has to own the game, and Creator DLC is unsettled.
The account you sign SteamCMD in with must own Arma 3. Anonymous login fails with a subscription error, whatever older guides say.
Creator DLC is less settled. Prairie Fire installs per server as a branch of the dedicated server itself, and it works when the account has a license for it (a guest pass counts). Whether an account with no license at all can install it purely to host is something we have not verified, and Tower's own error message says unverified rather than claiming either answer. If your unit runs a Vietnam server, plan on the hosting account having access to the DLC.
The check says Unknown when it means Unknown.
The check reads the real Windows Firewall on your box: which network profiles are active, what each does with inbound traffic by default, and every enabled inbound rule. When any of that is ambiguous, and on an ordinary non-domain machine the default inbound policy usually reads as not configured, it reports Unknown rather than a confident Allowed. A wrong Allowed would send you looking in all the wrong places.
Two known gaps, listed because you may be relying on one: a rule limited to a specific remote address range still counts as a general allow, and a rule that allows a particular program rather than a port is invisible to the check.
Your hosting provider's own firewall, upstream of the box, is outside Tower's reach entirely. We do not check it and cannot change it. If everything on the box looks right and traffic still does not arrive, that is who to ask.
A missing key looks exactly like a broken server.
With signature verification on, which is the default and the right setting, a mod whose key is missing does not stop the server starting. The server comes up perfectly and then refuses every player who tries to join. It is the most confusing failure in this whole product, so it is worth knowing the shape of it in advance.
Tower searches each mod for its key rather than guessing a folder name, since mods genuinely disagree about where it lives, and copies what it finds everywhere the engine looks. What it cannot conjure is a key that was never published, which is normal for a unit's own private mods: those are signed with a key handed out separately. Put those .bikey files in C:\ProgramData\Tower\keys and every server on the box picks them up on the next sync. Any mod with no key found anywhere is named in the job log, so start there.
SteamCMD and Steam have their own bad days.
SteamCMD replaces itself the first time it runs, and that run fails by design. Tower expects it and retries, but it means a box that has worked for months can hit a fresh failure the day Valve ships a new version, with nothing changed on your side. Workshop downloads also get rate limited when you pull a large mod pack. Those retry with backoff and are reported plainly rather than hidden. We cannot fix Valve.
Tower is hosted, so we sit in your path.
If Tower is unreachable, your servers keep running. Scheduled restarts, warning broadcasts and crash recovery all execute on your box and do not ask us anything. What you lose for the duration is the browser: you cannot start, stop, or reconfigure anything from Tower until it is back. Being honest about it, that moves a dependency rather than removing it, and today there is no local fallback control panel on the box. It is on the list.
Your own hostname is nearly self-serve.
You can serve Tower on something like tower.yourunit.net. Setting the hostname is self-serve in your unit's settings, and you point an A record straight at the origin, not proxied through Cloudflare, so the certificate can be issued. Turning routing on for a brand new domain is a change we make by hand, usually the same day. Sign-in works the same on either address.
When something goes wrong
Read the job log first.
Everything Tower does on your box is a job: installing, applying config, updating mods, syncing missions, checking the firewall. The server page shows the most recent one with its progress, its outcome, and its log. A failed job says what failed and what to do, and the log is where a mod with no key, a busy port, or an expired Steam session gets named.
Then read the RPT log.
That is Arma's own log, tailed live on the same page. If a server is running but has never reported players, a mission or a map, Tower promotes that to a visible warning after a few minutes rather than leaving a green tile lying to you. The usual cause is a server-side mod stuck at startup, often one that cannot reach a database, and the RPT is where it says so.
Some of it fixes itself.
A server that crashes is restarted automatically, up to three times in ten minutes. After that Tower stops trying and says so, because something is wrong that another restart will not fix. Pressing Start yourself clears the count. A server that answered once and then goes silent for ten minutes is treated as hung and recovered the same way. First loads are never counted as hangs, however long they take.
If the panel says the remote is offline.
Controls stay disabled until it reconnects, on purpose. Check the box is powered on and the Tower Remote service is running (services.msc, or sc.exe query TowerRemote). The service keeps its own log files under C:\ProgramData\Tower\service\TowerRemote\logs. For Steam trouble specifically, .\tower-remote.exe steam-status (run from the folder tower-remote.exe is in) answers without prompting for anything.
If none of that gets you there.
Tower is in closed beta and support is direct and human: the people who build it are the people who answer. Bring the job log and the RPT tail, they usually settle it in one message. If you found something in this guide that did not match what you saw, that is worth reporting too.
This copy of Tower has no support contact configured, which is a gap on our side rather than yours. Use whichever channel your unit was given when it was invited, and say that this page had nothing to point you at.