For the complete documentation index, see llms.txt. This page is also available as Markdown.

Launching Your Server

Step-by-step setup for a fresh AXIOM-EMU server install on a Windows host.

This guide walks through a clean install from the files you downloaded off the customer portal to players connecting with the client. It assumes a single Windows machine (local test or dedicated host) running SQL Server.

1. Get the files

Sign in to the customer portal and download the latest server bundle and matching client bundle. The portal dashboard surfaces a banner when a new release is out and your servers haven't been upgraded yet.

Keep an eye on the portal and the Discord announcements channel. Required updates (security hotfixes) close your running server with a popup the next time it heartbeats - you must apply them before it will run again.

Extract the server archive somewhere with no spaces or localized characters in the path. C:\AxiomServer is a safe default. You should end up with this layout:

AxiomServer\
├── ConnectServer\        ConnectServer.exe + ServerList.xml + Log\
├── DataServer\           DataServer.exe + DataServer.ini
├── GameServer\           GameServer.exe + configs
├── JoinServer\           JoinServer.exe + JoinServer.ini
├── Data\                 shared game data (items, monsters, drops)
├── Tools\                ConfigEncoder, AxiomEditor, ServerStartUP, PngToOzt, SQL, DB
└── migrations\           SQL migrations for updates

2. Add an antivirus exclusion before you launch anything

Windows Defender and most third-party AV products flag the server binaries because of the protection wrapper around them. If you skip this step, the EXEs get quarantined mid-run and you will chase phantom crashes.

Open PowerShell as administrator (right-click the Start menu → Windows PowerShell (Admin) / Terminal (Admin), or right-click the PowerShell icon → Run as administrator). Without elevation the cmdlet fails with an access-denied error.

Add-MpPreference -ExclusionPath "C:\AxiomServer"

Replace the path with wherever you extracted the server.

3. Paste your license key

Your portal license key has to be written into every server's config and into ConfigEncoder. All five locations validate the key at startup and refuse to run without it.

Grab the key from axiomemu.com/portal/licenses: click the license card to open its detail page, find the License Key field at the top, then click Click to reveal and use the copy button next to the revealed value.

Component
File
Field

DataServer

DataServer\DataServer.ini

LicenseKey=

JoinServer

JoinServer\JoinServer.ini

LicenseKey=

ConnectServer

ConnectServer\ConnectServer.ini

LicenseKey=

GameServer

GameServer\DATA\GameServerInfo - Common.dat

LicenseKey=

ConfigEncoder

Tools\ConfigEncoder\EncoderConfig.xml

<License Key="..." />

GameServerInfo - Common.dat is a plain text INI file - open it with any editor. The .dat extension is historical.

4. Install SQL Server

Minimum supported version: SQL Server 2022 (engine 16.00.1000). The shipped MuOnline.bak was taken on 2022, and SQL Server refuses to restore a backup onto an older engine - the file format is forward-compatible only. 2019, 2017, 2014, and 2012 will fail step 5 with Msg 3169. 2022 is the sweet spot; 2025 also works.

SQL Server Express (free, sufficient for private servers up to a few hundred concurrent players):

SQL Server Management Studio (SSMS) - pick any version, all are backward-compatible with older SQL Server engines:

During SQL Server setup:

  1. Choose Mixed Mode authentication - this enables the sa account alongside Windows auth.

  2. Set a strong sa password and write it down. You will need it for the ODBC DSN.

  3. On the Server Configuration step, make sure SQL Server Browser is set to Automatic if you plan to connect by instance name.

If you get stuck, there are hundreds of SQL Server setup walkthroughs on YouTube - the steps above are the only ones that matter for AXIOM-EMU. Ask in our Discord if something specific breaks.

5. Restore the MuOnline database

The backup ships at server\migrations\MuOnline.bak. The .mdf / .ldf paths baked into it are from the machine it was taken on, so the restore has to redirect them. The script below reads your instance's default data/log folders and builds the RESTORE dynamically, so the only thing you edit is the path to MuOnline.bak.

Connect to your SQL Server 2022 instance in SSMS using Windows Authentication (the account that installed SQL Server is already sysadmin; the sa password from step 4 is for DataServer/JoinServer at runtime, not this restore). New Query → paste, edit @bak, F5:

Success prints RESTORE DATABASE successfully processed ... in the Messages pane and muonline appears under Databases (F5 the node to refresh).

Verify:

Returns 0 on a fresh restore.

Common restore errors

  • Msg 3156 or Msg 3634 - Access is denied - the SQL Server service account can't write to the default data folder. Rare, but happens on locked-down hosts; grant the service account write access to the folder SERVERPROPERTY('InstanceDefaultDataPath') returns.

  • Msg 3169 - backup was taken on a newer engine. See the troubleshooting entry at the bottom of this page; you're on SQL 2019 or older and need to install 2022 (step 4).

  • Empty string / NULL path from SERVERPROPERTY - only happens on very old engines or unusual installs. Fall back to an explicit RESTORE ... WITH MOVE ... TO N'C:\...\muonline.mdf' and hard-code the paths.

sqlcmd alternative (no SSMS)

-E uses Windows Authentication. Run from a shell signed in as a sysadmin account. Save the T-SQL above to restore.sql (edit @bak), then:

6. Set up the ODBC DSN

DataServer and JoinServer both talk to SQL Server through an ODBC DSN named MuOnline. The server bundle ships registry files that create the DSN for you.

6a. Multiple SQL Server instances? Edit the .reg first

The shipped MuOnline.reg and MuOnline64.reg hard-code "Server"="(local)", which resolves to the default unnamed instance. If you have more than one SQL Server installed - for example a leftover SQL 2019 alongside the SQL 2022 you added in step 4, or a named Express install like SQLEXPRESS02 - (local) either picks the wrong engine or fails to connect at all. Edit the .reg before importing so the DSN targets the 2022 instance that holds the restored muonline database.

  1. Find your instance name. In SSMS, connect to the 2022 engine and look at the title bar - it shows HOSTNAME\INSTANCENAME. Or run SELECT @@SERVERNAME; in a new query. Common values: SQLEXPRESS, SQLEXPRESS2022, MSSQLSERVER (the default instance - use (local) for this one).

  2. Open server\migrations\MuOnline.reg in Notepad (right-click → Edit, not Merge).

  3. Change the "Server" line under the MuOnline DSN key:

Use .\\INSTANCENAME for a named instance on the same machine (note the doubled backslash - .reg files require it), or HOSTNAME\\INSTANCENAME for remote. Leave (local) only if you're on the default unnamed instance.

  1. Repeat for MuOnline64.reg if you plan to use AxiomEditor x64.

  2. Save, then import as below.

6b. Import the DSN

The files live in server\migrations\ (e.g. C:\AxiomServer\server-v1.0.0\server\migrations\):

  • MuOnline.reg - 32-bit DSN. Required; DataServer and JoinServer are both 32-bit.

  • MuOnline64.reg - 64-bit DSN. Optional; AxiomEditor x64 uses this.

Double-click the file, confirm the UAC prompt, then confirm the import.

7. Configure server IPs

ConnectServer binds to all interfaces, so its own .ini has no IP field - only ports. The addresses your players (and your other servers) connect to live in a handful of other places. Pick your public IP (or 127.0.0.1 for a single-box local test) and replace it in each file below.

GameServer\DATA\GameServerInfo - Common.dat

If GameServer lives on the same box as DataServer, JoinServer, and ConnectServer, leave all three *Address lines at 127.0.0.1. If you split them across hosts, point each to the right internal IP.

ServerCode is the map-group ID that ties this GameServer instance to a <Server Code="..."> entry in MapServerInfo.xml and ServerList.xml - all three must agree.

JoinServer\JoinServer.ini

JoinServer uses this to push user and server status updates to ConnectServer.

GameServer\Data\MapServerInfo.xml

This is the address GameServer hands back to the client after the server-select screen. Replace the IP - keep the leading S, it's part of the format. The Port on each row must match the ServerPort in the corresponding GameServer's Common.dat.

ConnectServer\ServerList.xml

Edit the <Server> entries so the Code values match your MapServerInfo.xml / GameServer ServerCode, and set the display names you want on the server-select screen.

Tools\ConfigEncoder\ServerConfig.xml

Connection is the address the client uses to reach ConnectServer. Serial and Version have to match ServerSerial / ServerVersion in every GameServer's Common.dat - if you change them anywhere, change them in both places, or clients will fail the handshake.

Tools\ConfigEncoder\ClientConfig.xml

Point this at your patch server. Set Enabled="0" only if you're replacing the built-in updater with your own launcher DLL/EXE. See the comments above each block in ClientConfig.xml for every other tunable - graphics, interpolation, economy caps, launcher branding.

8. Encode the client configs

Before the first run, point ConfigEncoder at your client install by editing Tools\ConfigEncoder\EncoderConfig.xml:

  • Output Path - the client's Data\Local\ folder. ConfigEncoder writes the encoded blobs straight into here.

  • DLLIntegrity Path - the root of the client install, used to compute integrity hashes for its DLLs.

Then run Tools\ConfigEncoder\ConfigEncoder.exe. It reads ServerConfig.xml and ClientConfig.xml and writes:

  • ServerInfo.axiom - connection details (ConnectServer IP/port, serial, version).

  • ClientConfig.axiom - client-side tunables (graphics, interpolation, economy caps, launcher branding).

Both files are consumed by the client only. GameServer reads its own GameServerInfo - *.dat files and never touches the .axiom blobs.

Re-run ConfigEncoder every time you change ServerConfig.xml or ClientConfig.xml. The client reads the encoded blob on startup; editing the XML alone has no effect. No manual copy step - the tool overwrites the blobs in Output Path directly.

9. Start the servers

You can launch the four EXEs by hand, or use the bundled Tools\ServerStartUP\ServerStartUP.exe to start them in one go. Expected startup order:

Launching manually: open each server's folder, double-click the EXE, wait for the console to settle (no new red/error lines) before starting the next.

Using ServerStartUp

StartUp.xml ships empty on first install - you add your servers through the tool's UI, not by hand-editing the file. Run ServerStartUp.exe and, for each server in the order above, add a row with:

  • Path - absolute path to the server EXE (e.g. C:\AxiomServer\DataServer\DataServer.exe).

  • Delay - milliseconds to wait after launching this process before launching the next. 2000 (2s) is a reasonable default; bump it if your SQL Server is slow to accept connections.

  • Run - leave enabled. Disable a row to skip that server without deleting it (useful when debugging one component in isolation).

  • Parameters - leave empty unless you have a specific reason to pass command-line arguments.

The tool persists your rows back to StartUp.xml, so you only do this once. After that, launch ServerStartUp.exe any time and it boots the whole stack in order.

Healthy startup looks like each server loading its config, opening its listening ports, and then going quiet aside from periodic status lines. If a server exits immediately, re-read its console - the vast majority of startup failures come down to:

  • Wrong or missing license key.

  • ODBC DSN not created, or pointing at the wrong instance / wrong credentials.

  • Port already in use (another AXIOM-EMU instance, another MU emulator, or SSMS holding a connection).

  • Address mismatch - e.g. JoinServer.ini pointing to a ConnectServer IP that isn't reachable.

10. Create an account and connect

Accounts live in the MEMB_INFO table. The shipped way to create them is AxiomEditor.

  1. Run Tools\AxiomEditor\AxiomEditor.exe.

  2. On first launch, configure the DB connection. Two options:

    • ODBC - reuse the MuOnline DSN. No password needed if the DSN uses Windows auth.

    • Direct - server 127.0.0.1, port 1433, database MuOnline, user sa, password as set in step 4.

  3. Open the Accounts tab → New Account. Set username, password, and (optionally) pre-create a character.

  4. Launch the client with the encoded ServerInfo.axiom and ClientConfig.axiom in place, log in with the account you just created, and you should land on the character-select screen.

AxiomEditor.exe needs the .NET 8 Desktop Runtime. If it fails to start with no error dialog, install it from dotnet.microsoft.com.

Troubleshooting

Server exits on startup with a license error

The key in one of the five license locations is empty, has surrounding quotes, or doesn't match the one issued on the portal. Double-check all five: DataServer.ini, JoinServer.ini, ConnectServer.ini, GameServerInfo - Common.dat, and EncoderConfig.xml. Copy the key fresh from the portal dashboard.

DataServer fails to connect to the database

The MuOnline DSN doesn't exist, points at the wrong instance, or the SQL Server service isn't running. Verify by running C:\Windows\SysWOW64\odbcad32.exe, opening the DSN, and clicking Test Data Source.

Client connects to ConnectServer but character list is empty

ConnectServer reached GameServer, but GameServer can't advertise its map. Check that MapServerInfo.xml has the correct IP with the leading S and that the Code matches your ServerList.xml entry.

Client can't reach the server at all

Port-forwarding or firewall. You need inbound rules for TCP 44405 (ConnectServer), 55557 UDP (ConnectServer announce), and every Port= listed in MapServerInfo.xml. On a dedicated host, add them to Windows Firewall and to your provider's network firewall.

Restore fails with Msg 3169 - backup is from a newer server version

The .bak was taken on SQL Server 2022 (engine 16.00.1000). Older engines (2019 / 2017 / 2014 / 2012) cannot restore it - SQL Server backup format is forward-compatible only.

Install SQL Server 2022 (or newer) and restore onto that instance. Existing older instances can stay - just point the ODBC DSN at the 2022 instance name (e.g. .\SQLEXPRESS2022).

Servers run fine then get quarantined after a few minutes

AV exclusion missing or not applied to the right folder (step 2). Real-time scanning waits until the protection wrapper finishes unpacking before it fires. Add the exclusion, restore the quarantined EXE, and relaunch.

Last updated