What accServer.exe is
Steam lists the server as a tool, Assetto Corsa Competizione Dedicated Server, app 1430110, with the game (app 805550) as its parent. The only operating system on the record is Windows, the launch entry is server\accServer.exe, and the server depot is about 3.7 MB. The public build is dated 3 May 2024, as read on 31 October 2026.
Kunos documents it in the ACC Server Admin Handbook. The copy this page follows is version 1.1.2, written for the 2019 version of the game and hosted by the community; the server has been updated since, so read every key and rule here as that version states it, and let the files your build writes and its log be the authority. It describes the files, the ports, the admin commands and the result files. It gives no CPU or RAM figures and no Linux procedure. This is not the server of the original game: that one is acServer with ini files, covered on our Assetto Corsa dedicated server page.
Sizing the machine
The handbook names two limits instead of hardware figures. maxConnections in configuration.json caps connections of every kind; on hardware you control it says you can set any high number. maxCarSlots in settings.json caps cars, and the server lowers it to the track's pit count, or to 30 on a public server. Spectators count against maxConnections but not against the 30-car limit, and they take no pit slot.
Its warning about home hosting is about the network: forwarded ports expose a private system, and residential upload bandwidth is often the bottleneck. Kunos's handbook gives no CPU figure, so watch the process in Task Manager during a full race before adding a second server. Several servers on one machine each need a separate copy of the server folder, their own tcpPort and udpPort, and firewall rules for those ports; the handbook's centralEntryListPath lets them share one entry list, written with forward slashes.
- The game server line lists only processors rated 2,000 or more on PassMark's single-thread test, the bar the Satisfactory dedicated server documentation sets.
- Windows Server up to 2025 installs from the order page on the widest lines; its licence is charged per core every month and takes no prepay discount. ARM lines do not run Windows.
- Every port is unmetered, on our own network, AS19624, in five cities. The data center page has a test IP per city for your drivers to ping.
- Rack servers and blades carry an out-of-band console (HPE iLO, Dell iDRAC or a Supermicro BMC), and so do the m510 and m710x cartridges; other cartridges have power control only.
- A ready server is live in about 30 minutes, counted from payment approval. Hourly billing, handy for a single race weekend, applies only to a ready unit ordered as it stands; ask on chat whether a Windows licence can go on an hourly order. A build to order is monthly and takes 4 to 24 hours.
Installing with SteamCMD
Run this in an elevated PowerShell. It installs SteamCMD from Valve's download, sets the install directory first and logs in second, the order Valve's SteamCMD page recommends, and fetches app 1430110 into C:\ACC. If a configured cfg folder already exists, it is copied to a dated folder under C:\ACC-backups first and checked, and copied back after the download, because validate can reset files the tool ships. Stop the server first and the same block is the update step. It stops at the first error; pasting it again is how you recover from a half-finished run.
& {
$ErrorActionPreference = 'Stop'
$login = 'anonymous' # or your Steam account name, see below
$acc = 'C:\ACC'
$cfg = "$acc\server\cfg"
$keep = $null
if (Test-Path "$cfg\configuration.json") {
$keep = "C:\ACC-backups\cfg-$(Get-Date -Format 'yyyy-MM-dd-HHmmss')"
New-Item -ItemType Directory -Force -Path $keep | Out-Null
Copy-Item -Recurse "$cfg\*" $keep
if (-not (Test-Path "$keep\settings.json")) { throw "STOP - copy in $keep is incomplete" }
"cfg saved to $keep"
}
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
if (-not (Test-Path C:\steamcmd\steamcmd.exe)) {
New-Item -ItemType Directory -Force -Path C:\steamcmd | Out-Null
Invoke-WebRequest -UseBasicParsing https://client-update.steamstatic.com/installer/steamcmd.zip -OutFile C:\steamcmd\steamcmd.zip
Expand-Archive -Force C:\steamcmd\steamcmd.zip -DestinationPath C:\steamcmd
}
C:\steamcmd\steamcmd.exe +force_install_dir $acc +login $login +app_update 1430110 validate +quit
if ($LASTEXITCODE -ne 0) { throw "STOP - SteamCMD exit code $LASTEXITCODE. On a first run this is often just SteamCMD updating itself: paste the block again once; if it stops again, read the lines above." }
if (-not (Test-Path "$acc\server\accServer.exe")) { throw 'STOP - accServer.exe not found' }
if ($keep) { Copy-Item -Recurse -Force "$keep\*" $cfg; "cfg restored from $keep" }
'install ok'
}
Steam's record lists the game (app 805550) as this tool's parent but does not say whether it downloads anonymously, so you may need a Steam account that owns Assetto Corsa Competizione. If the anonymous login is refused, set $login to that account's name and paste the block again; SteamCMD prompts for the password and, on a first login, a Steam Guard code, so keep updates out of unattended scripts. The handbook's own route also works: copy the server folder from your own ACC installation.
The files in cfg
The handbook states that the server is configured only through a few small JSON files encoded as UTF-16 LE. Delete them and start the server once, and it writes fresh files with current defaults. Lowering the configVersion in a file makes the server add properties that a newer build knows about.
| File | What it holds | Notes from the handbook |
|---|---|---|
| configuration.json | tcpPort, udpPort, maxConnections, lanDiscovery, registerToLobby | Ports must be unique on the machine and open to the internet |
| settings.json | Server name, passwords, rating requirements, car slots, result dumps | Spectator password must differ from the join password |
| event.json | Track, weather, session list | At least one session that is not a race |
| eventRules.json | Pit windows, stint times, mandatory stops, refuelling | Ignored by public servers |
| entrylist.json | Drivers by Steam ID, race numbers, admin flag | You create it; entries bypass rating requirements |
Newer builds may write files that version 1.1.2 does not describe; read what yours creates. Edit the generated files in Notepad and check that Save As still shows UTF-16 LE before you save; Notepad on Windows Server 2019 and earlier calls that encoding Unicode. When the server detects an implausible configuration, the handbook says it writes a reasonably precise error to its log folder and exits at once, so read the newest log whenever it closes on start.
Ports, passwords and the weekend
Clients connect over tcpPort and then stream car positions over udpPort, which also answers the ping test. The handbook's sign that UDP is blocked is a server that never shows a ping value in the list. The defaults are 9201 for both; keep them unless a second server shares the machine. These are the settings.json keys to change in the generated file, with example values:
{
"serverName": "Thursday GT3 League",
"adminPassword": "a-long-admin-secret",
"password": "league-entry-secret",
"spectatorPassword": "a-different-spectator-secret",
"maxCarSlots": 30,
"dumpLeaderboards": 1,
"isRaceLocked": 1
}
adminPassword is what you type after /admin in chat; it sits in the file in plain text, so treat the cfg folder and its backups as secret. dumpLeaderboards set to 1 writes each finished session to the results folder, which you must create. In event.json, track takes a key such as spa, and a wrong key makes the log print the valid ones; preRaceWaitingTimeSeconds cannot go below 30, and Kunos suggests a sessionOverTimeSeconds of about 107% of the expected lap time, since the 2-minute default does not cover Spa or Silverstone.
Firewall and first start
A rented machine has no home router in front of it, so the Windows firewall is the only rule set to change. The block adds an inbound rule for each protocol only when it is missing, so it is safe to paste twice, and it creates the results folder.
& {
$ErrorActionPreference = 'Stop'
foreach ($proto in 'TCP', 'UDP') {
$name = "ACC server $proto 9201"
if (-not (Get-NetFirewallRule -DisplayName $name -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $name -Direction Inbound -Protocol $proto -LocalPort 9201 -Action Allow | Out-Null
}
}
New-Item -ItemType Directory -Force -Path C:\ACC\server\results | Out-Null
Get-NetFirewallRule -DisplayName 'ACC server *' | Format-Table DisplayName, Enabled, Direction
}
Start C:\ACC\server\accServer.exe from Remote Desktop. When you leave, disconnect the session rather than signing out, so the console window keeps running. Nothing starts the server again after a reboot in this setup, Windows update reboots included; plan them around race nights.
Public or private multiplayer
| Setting | Public multiplayer | Private multiplayer |
|---|---|---|
| How it is declared | No password, registerToLobby 1 | A password set, or registerToLobby 0 |
| Found through | Quickjoin and the server list | The server list with its password; with registerToLobby 0, only LAN discovery, when lanDiscovery is 1 |
| Car slots | Capped at 30 | maxCarSlots, up to the track's pit count |
| eventRules.json | Ignored, defaults apply | Applied |
| forceEntryList | Not allowed | Rejects drivers missing from the entry list |
Leagues usually want the private column. An entry list also works on a public server, for example to hold a slot for yourself: entries bypass the rating requirements and can join a full server while pit slots remain.
Running a race
Type /admin and the admin password in chat, as a driver or as a spectator, to gain admin rights. An entry with isServerAdmin set to 1 does that automatically on join; the entry's playerID is the Steam64 ID with an S in front.
/nextskips the session and/restartrestarts it; the handbook says not to restart during the preparation phase./kickwith a race number removes a driver until the weekend restarts;/banholds until the server restarts./tp5,/tp15,/dtand/dqhand out penalties;/clearremoves pending ones./manual entrylistwrites an entry list from the drivers connected now, a quick start for a league grid./debug bandwidthand/debug qosprint network data to the server console; type them again to stop.
Result files are named by date, time and session type, for example 190806_193009_R.json, and hold the leaderboard, every lap and every penalty. Copy the results folder and the dated cfg copies off the machine yourself; they are the record of a season. For other racing servers on the same machines, see the Wreckfest dedicated server and the BeamMP multiplayer server.
Questions
Can the ACC server run on Linux?
Not as Kunos ships it. Steam lists app 1430110 for Windows only, and the handbook describes Windows paths alone. Running it any other way is outside what the developer documents, so plan on Windows Server.
Which ports does it use?
One TCP port and one UDP port, both 9201 by default, set as tcpPort and udpPort in configuration.json. Both must be unique on the machine and allowed in by the firewall. A server that never shows a ping value usually has its UDP port blocked.
How many drivers can one server hold?
A public server is capped at 30 cars. A private one takes maxCarSlots, lowered to the track's pit count, while maxConnections caps cars and spectators together. Kunos gives no hardware figure per driver, so test a full grid on your own machine.
Why does accServer.exe close as soon as it starts?
The handbook says the server closes at once when it detects an implausible configuration, and the newest file in the log folder carries the error. Check that file first, then the JSON syntax, the UTF-16 LE encoding and the track key.
How do I make the server private for a league?
Set a password in settings.json and leave registerToLobby at 1, so drivers still find it in the server list. A password declares the server private, which lifts the public restrictions and makes the server read eventRules.json. Setting registerToLobby to 0 is the other private mode; the handbook pitches it at LAN sessions, where only LAN discovery finds the server. Add forceEntryList 1 to turn away anyone not on your entry list.
What is the update procedure?
Stop it, then paste the install block again. It copies the configured cfg folder to a dated backup, has SteamCMD update and validate app 1430110, then copies your files back over whatever validate reset. Check the newest log after the first start on the new build.