Arma 3 Web Server
Web-based management panel for Arma 3 dedicated servers. Start, stop, configure, and monitor your server from a browser.
Features
- Server control — Start, stop, restart, and view status
- Live console — WebSocket terminal showing server stdout/stderr and RPT log tailing
- Config management — Create, edit, duplicate, and delete
.cfgconfiguration files with a Monaco editor - Modlist management — Create modlists with reorderable entries, enable/disable per mod, import from HTML (e.g. ArmA 3 Steam Workshop collections), check download status
- SteamCMD integration — Update the server binary, download individual workshop mods, bulk download missing or outdated mods, all streamed live to the UI
- Settings UI — Edit server parameters, IP:port, platform, Steam branch/user, CBA/AI/difficulty presets, and select active config/modlist
- Log viewer — Browse and read server log files
Quick Start
Docker
docker compose up -d
The web UI is served on http://localhost:8080.
Manual
Prerequisites:
# Build for production (frontend + backend in one binary)
make build
./backend/arma3-web-server
# Or develop with hot reload (uses test stubs, no real SteamCMD needed)
make dev
The web UI is served on http://localhost:8080.
Configuration
All paths are configurable via environment variables:
| Variable | Default | Description |
|---|---|---|
DATA_DIR |
data |
Server metadata (settings, modlist JSON files) |
SERVERFILE_DIR |
serverfiles |
Arma 3 server installation |
MODS_DIR |
serverfiles/mods |
Local mod symlinks/copies |
CFG_DIR |
serverfiles/cfg |
Server configuration .cfg files |
PROFILES_DIR |
serverfiles/profiles |
Arma 3 profile and log directory |
LISTEN |
:8080 |
HTTP listen address |
SERVER_BINARY |
arma3server_x64 |
Server binary filename (overrides platform default) |
SERVER_PARAMS |
-server -world=empty ... |
Override server launch parameters |
STEAMCMD_PATH |
steamcmd |
Path to steamcmd binary |
AUTH_TOKEN |
(empty) | Bearer token for API/WS auth. When set, all requests must include Authorization: Bearer <token>. When empty, no auth required. |
GIN_MODE |
debug |
Gin framework mode. Use release for production (set automatically in Docker). |
SERVERS_DIR |
./serverfiles |
Docker Compose only: host directory mounted as /servers in the container. |
Automation
The panel can perform automatic operations at startup and on a schedule.
Startup tasks
Configured in the Automation section of the Settings UI:
| Setting | Description |
|---|---|
| Auto-update server on startup | Runs steamcmd +app_update for the Arma 3 server binary when the web service starts. |
| Auto-update mods on startup | Downloads workshop updates for every enabled mod in the active modlist when the web service starts. |
| Auto-start server on startup | Restarts the game server if it was running when the web service last stopped. Useful for recovery after host backup cycles or container restarts. |
All startup tasks run asynchronously — the web UI is available immediately. Server and mod updates run in parallel; auto-start waits for both to complete before launching the game server.
Scheduled updates
Set a cron expression in the Scheduled Update field to run game + mod updates on a recurring schedule (e.g. "0 4 * * *" for daily at 4 AM). Leave empty to disable.
The scheduled update runs even if the game server is currently running.
SteamCMD Authentication
The panel integrates with SteamCMD for server binary updates and workshop mod downloads.
Anonymous (default)
The Steam User field in the settings UI defaults to anonymous.
In this mode, no Steam account is required — SteamCMD uses +login anonymous.
- Workshop mod downloads always use this mode, regardless of the configured user.
- The Arma 3 server binary update is available via
+login anonymousonly if the server files are publicly accessible on that Steam account.
Authenticated login
To update the Arma 3 server binary (app_update 233780) with a real Steam account, set the Steam User field to your account name.
The web panel does not pass a password — SteamCMD relies on a cached session.
You must authenticate manually once so the login token is persisted:
# Docker
docker exec -it arma3-web steamcmd +login your_steam_username
Enter your password when prompted, including any Steam Guard code if enabled. The session is cached inside the container's filesystem (~/.steam/).
Note: SteamCMD sessions may expire. Re-run the login command if the "Update Server" button fails with an authentication error.
Security
- Steam credentials saved in
data/settings.jsonare stored as plain text. - It is recommended to use a dedicated Steam account with only the necessary game licenses for automated server management.
API
REST API at /api/* and WebSocket endpoints at /ws/*. Key routes:
| Method | Path | Description |
|---|---|---|
GET/PUT |
/api/server/settings |
Read/update server settings |
POST |
/api/server/start|stop|restart |
Server lifecycle |
GET |
/api/server/status |
Running state |
GET/POST/PUT/DELETE |
/api/configs |
CRUD for .cfg files |
GET/POST/PUT/DELETE |
/api/modlists |
CRUD for modlists |
POST |
/api/modlists/import |
Import HTML workshop list |
GET |
/api/modlists/:id/export |
Export to downloadable HTML preset |
GET |
/api/modlists/:id/check |
Check mod download status |
POST |
/api/modlists/:id/download-missing|update-all |
Bulk workshop operations |
POST |
/api/server/steamcmd/update-game|download-mod |
SteamCMD operations |
GET |
/api/mods |
List installed mods (workshop + local) with usage info |
DELETE |
/api/mods |
Delete a mod by path |
POST |
/api/mods/cleanup |
Bulk-delete all orphaned mods |
GET |
/api/server/logs |
List log files |
GET |
/api/server/paths |
Show server file paths |
GET |
/api/server/health |
Comprehensive health check |
WS |
/ws/server/logs|rpt|steamcmd/logs |
Live log streaming |
Project Structure
backend/
cmd/server/ Entry point
embed/ Embedded frontend assets (//go:embed)
internal/
api/ HTTP handlers and routes
models/ Data types
services/ Business logic
frontend/
src/
api/ HTTP and WebSocket client
components/ Shared UI components
pages/ Route-level views
types/ TypeScript interfaces
Development
# Start both backend + frontend with hot reload (copies stubs to dev-deploy)
make dev
# Start backend only
make run
# Run all tests
make test
# Run backend tests only
make test-backend
# Run frontend tests only
make test-frontend
# Build for production
make build
License
MIT