Use case · Game server

Running a Mordhau dedicated server on Linux bare metal

A Mordhau dedicated server is Triternion's server build, installed with SteamCMD as app 629800 under an anonymous login and started on Linux through MordhauServer.sh, with the starting map as its first argument. By default it takes game traffic on 7777, Steam queries on 27015 and slot reservations on the beacon port, 15000; RCON defaults to TCP 7778. Triternion publishes no setup manual of its own, so the detailed reference is the community-run Mordhau Wiki, checked here against the developer's patch notes on Steam.

See the machines

Where the instructions come from

Triternion's website and Steam store page carry no server manual. The working reference is the Mordhau Wiki on Fandom, which describes itself as written and maintained by players: its Dedicated Server Hosting Guide lists the ports and launch parameters, and its Server Configuration page lists the Game.ini and Engine.ini keys. Where Triternion documented a setting itself, in patch notes posted to Steam, this page cites those notes: the beacon port (Patch #4), Mods= lines (Patch #18), RCON broadcasts (Patch #20) and the fix for setting the RCON port in Game.ini (Patch #21).

The current wiki guide sends Linux owners to LinuxGSM instead of giving raw steps. An earlier revision of the same guide gave them, and its paths agree with LinuxGSM's configuration: MordhauServer.sh sits in the install root, the binary is Mordhau/Binaries/Linux/MordhauServer-Linux-Shipping, and the configs are written to Mordhau/Saved/Config/LinuxServer. The steps below are assembled from those community sources, not from a Triternion document.

The four ports

PurposeDefaultProtocol (wiki)Set withExpose
Game traffic7777TCP/UDP-Port=Yes
Server browser queries27015TCP/UDP-QueryPort=Yes
Beacon (slot reservation)15000TCP/UDP-BeaconPort=Yes
RCON (Source RCON protocol)7778TCP-RconPort= or RconPort= in Game.iniNo: SSH tunnel

The beacon port is the one people forget. Triternion's Patch #4 notes explain that joining now reserves a slot before the map loads, and that owners must keep port 15000 reachable for it. The machine holds its own public IPv4, so port forwarding is not part of the job: the host firewall is the only gate.

Sizing the machine

Neither Triternion nor the wiki publishes CPU, memory or disk figures. The wiki names the two settings that drive load: the player cap and the tick rate. It calls a cap above 64 a cause of engine performance problems, and warns that raising tick rate and players together cuts performance steeply. Measure instead of guessing: run a full match at your intended cap, watch the average and maximum tick rate with the RCON stats command (the wiki says the minimum always wobbles), and check top and free -m.

SteamCMD's Linux build needs 32-bit x86 libraries and neither source mentions ARM, so our inference is to choose an x86-64 line from the game server range and skip the ARM machines, among them the X-Gene cartridge, which boots only Ubuntu 16.04 or 18.04.

Every dedicated server includes an unmetered port and one IPv4: 1 Gbps on 10 of the 18 configurable lines, 500 Mbps on the other 8. Rack servers and blades carry an out-of-band controller (iLO, iDRAC or a Supermicro BMC) whose browser console the dashboard publishes once you add a console login; Moonshot cartridges other than the m510 and m710x have power control only. Taken ready-built from the rack, a server is running about 30 minutes past order approval; builds to order run 4-24 hours. All five locations run on our own network, AS19624; ping each city's test IP and pick the one nearest your players.

Install and firewall

Run this as your sudo user on Ubuntu or Debian from the Linux images. A dedicated mordhau account owns the install, so the server process has no root rights. Firewall order: IPv6 is enabled in /etc/default/ufw first, then SSH is allowed, then ufw is enabled, and the game ports come last.

sudo apt update && sudo apt install -y lib32gcc-s1 curl ufw
sudo useradd -m -s /bin/bash mordhau
sudo -u mordhau bash -c 'mkdir -p /home/mordhau/steamcmd && cd /home/mordhau/steamcmd && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxf -'
sudo -u mordhau bash -c '/home/mordhau/steamcmd/steamcmd.sh +force_install_dir /home/mordhau/server +login anonymous +app_update 629800 validate +quit'

sudo sed -i 's/^IPV6=.*/IPV6=yes/' /etc/default/ufw
sudo ufw allow OpenSSH
sudo ufw --force enable
sudo ufw allow 7777
sudo ufw allow 27015
sudo ufw allow 15000
sudo ufw status verbose

force_install_dir comes before login, the order SteamCMD expects. Port 7778 is deliberately not opened. If the first start fails on a missing shared library, add the package that ships it; an older revision of the wiki guide listed extra libraries such as libnss3, and that list is dated.

A systemd unit that updates on start

The unit goes in /etc/systemd/system/mordhau.service. The map before the switches is the first map loaded; the wiki requires it to be the first parameter.

[Unit]
Description=Mordhau dedicated server
After=network-online.target
Wants=network-online.target

[Service]
User=mordhau
Group=mordhau
WorkingDirectory=/home/mordhau/server
ExecStartPre=-/home/mordhau/steamcmd/steamcmd.sh +force_install_dir /home/mordhau/server +login anonymous +app_update 629800 +quit
ExecStart=/bin/bash /home/mordhau/server/MordhauServer.sh FFA_ThePit -log -Port=7777 -QueryPort=27015 -BeaconPort=15000
KillSignal=SIGINT
Restart=always
RestartSec=10
TimeoutStartSec=1800

[Install]
WantedBy=multi-user.target

Then sudo systemctl daemon-reload && sudo systemctl enable --now mordhau. Triternion's Patch #22 Hotfix 1 notes say a server saves its default config to Game.ini on first run, so let it come up once, then sudo systemctl stop mordhau before editing. The minus sign on ExecStartPre lets the server boot even if SteamCMD returns an error code; it does not cover an update that hangs, which is why TimeoutStartSec=1800 replaces the 90-second default that includes the update. The wiki's SteamCMD page says the server does not update itself, so sudo systemctl restart mordhau after a patch is your update. Restart=always brings the process back however it exits, including the RCON shutdown command, so stop it with systemctl. KillSignal=SIGINT follows the stop signal in the wiki's older sample unit.

That MordhauServer.sh hands its arguments to MordhauServer-Linux-Shipping after the project name is our inference: the older wiki revision passes -Port and -BeaconPort to the script, and LinuxGSM starts the binary itself with Mordhau followed by the map. If the server ignores the map, point ExecStart at the binary directly: /home/mordhau/server/Mordhau/Binaries/Linux/MordhauServer-Linux-Shipping Mordhau FFA_ThePit -log -Port=7777 -QueryPort=27015 -BeaconPort=15000.

Game.ini: name, admins, slots and rotation

The file is /home/mordhau/server/Mordhau/Saved/Config/LinuxServer/Game.ini. The wiki's warning is the rule to work by: change it with the server stopped, because on shutdown the server writes its in-memory copy over the file. Edit with sudo -u mordhau nano on that path, put each key under its existing heading rather than repeating a heading, then sudo -u mordhau chmod 600 the file, since it holds the RCON password.

[/Script/Mordhau.MordhauGameSession]
ServerName=My Mordhau Server
MaxSlots=24
ServerPassword=
AdminPassword=
Admins=YOUR_PLAYFAB_ID
RconPassword=replace-with-a-long-random-string
RconPort=7778
bUseOfficialBanList=True

[/Script/Engine.GameSession]
MaxPlayers=24

[/Script/Mordhau.MordhauGameMode]
MapRotation=SKM_Contraband
MapRotation=TDM_Camp
MapRotation=FFA_ThePit
  • Admins take PlayFab IDs, one Admins= line each. Join your server and run PlayerList in the console to read yours, or LookupPlayer with your SteamID64 to translate it.
  • AdminPassword stays empty here. The wiki warns that anyone holding it can log in and add further admins.
  • MaxSlots goes with MaxPlayers, as the wiki sets both. An empty ServerPassword leaves the server public.
  • bUseOfficialBanList defaults to False, per Triternion's Patch #21 Hotfix 2; True applies the official ban list.
  • MapRotation names come from the wiki's Server Map Names list: SKM is Skirmish, TDM Team Deathmatch, FFA free-for-all, FL Frontline, INV Invasion, HRD Horde. Variants ending in _64 drop the map bounds.

Tick rate lives in Engine.ini in the same folder: NetServerMaxTickRate under [/Script/OnlineSubsystemUtils.IpNetDriver], repeated under [IpDrv.TcpNetDriver], as the wiki shows. Raise it only while stats shows the average holding.

RCON, mods and a second instance

RCON speaks the Source RCON protocol, so most Source RCON clients work. Keep 7778 closed and reach it through your own login: ssh -N -L 7778:127.0.0.1:7778 you@your-server, then point the client at 127.0.0.1:7778. Neither the wiki nor Triternion's notes say which address RCON listens on. If the tunnel connects but RCON stays silent, put the server's public address in the -L argument instead; that traffic stays on the machine, so 7778 can remain closed in ufw. Useful commands from the wiki's list: playerlist, maplist, addmap with a map, a position and true to save it to Game.ini, ban with a duration in minutes, info and stats.

Mods come from mod.io. Patch #18 retired the old auth-token method: add a Mods= line with each mod's resource ID under [/Script/Mordhau.MordhauGameSession]. A mod that asks to run as a server actor goes in SpawnServerActorsOnMapLoad= under [/Script/Mordhau.MordhauGameMode] (Patch #17), and a modded map's rotation name comes from its author's mod.io page. Patch #21 also mounts pak files dropped into Mordhau/Content/CustomPaks/.

Two instances on one machine means the second gets its own install directory (+force_install_dir /home/mordhau/server2), its own unit (mordhau2.service), its own Game.ini inside that install, and its own four ports, for example -Port=7787 -QueryPort=27016 -BeaconPort=15001 with RconPort=7788 in its Game.ini. Open the three public ones in ufw; leave 7788 closed like the first.

Backups and limits

The config folder is what you cannot download again. With the server stopped, run sudo tar -czf ~/mordhau-config.tgz -C /home/mordhau/server/Mordhau/Saved Config, then sudo chown "$USER": ~/mordhau-config.tgz && chmod 600 ~/mordhau-config.tgz, check it with tar -tzf ~/mordhau-config.tgz, and copy it off the machine yourself. To restore, stop the server, unpack with sudo tar -xzf ~/mordhau-config.tgz -C /home/mordhau/server/Mordhau/Saved, run sudo chown -R mordhau: /home/mordhau/server/Mordhau/Saved/Config, and confirm with sudo ls -l /home/mordhau/server/Mordhau/Saved/Config/LinuxServer, run with sudo so it works whatever the permissions on the mordhau home directory.

  • Console players: the wiki says they cannot host private servers, and Triternion's 2024 crossplay notes name official servers only, so do not promise them a seat.
  • Steam and Epic players both join a server built this way, according to the wiki.
  • Updates are manual: nothing restarts the unit after a patch unless you do it.

Questions

Does the server need a Steam account that owns Mordhau?

Not with SteamCMD. App 629800 installs with login anonymous, so no personal account sits on the machine. The wiki's other route, the dedicated server tool in a Steam library, does require owning the game.

Why can't players find my server in the browser?

Check that 27015 and 15000 are open as well as 7777, and that bAdvertiseServerViaSteam is not set to False in Game.ini. The wiki suggests quakestat -a2s against the server's address and query port as an outside check; it ships in the qstat package.

How many players can one instance hold?

The cap is MaxSlots and MaxPlayers in Game.ini. The wiki advises against going above 64 because of engine performance, and against raising tick rate and players together. Watch the average tick rate with stats at full load and settle on the highest cap that holds it.

Can I set a password without putting it on the command line?

Yes. ServerPassword, AdminPassword and RconPassword all live in Game.ini, which the steps above leave readable only by the mordhau account. None of them appears in the launch line or the process list.

Pick the machine for your server

Whole x86 machines with an unmetered port, root and a remote console on rack servers, in five cities on AS19624.

See the machines

Related on Server Room

Other use cases