Dedicated Server Setup on Linode

Ut2004-boxRecently, I decided to rebuild my Unreal Tournament 2004 server on a new platform. The latest Linux versions presented a few challenges and it took quite a bit of time and research to get everything working.

Here I’ve tried to document as much as possible to preserve the knowledge and share with others.

These instructions are specifically for a Linode virtual server running Ubuntu 14.04 although most of the setup is similar on other systems.

Server “Hardware”

Using a virtual server at

  • Linode 2048 Plan
  • 24GB DISK
  • 1 CPU Core
  • 2TB XFER
  • Ubuntu 14.04 LTS Profile, Latest 64 bit (4.5.0-x86_64)

UT2004 Server + Bonus Pack

This is the most recent dedicated server for Unreal Tournament 2004 that I know of. The Unreal Tournament 2004 Server v3339 server pack contains all the needed files for running a UT 2004 game server. The Bonus Pack contains additional game maps and add-on.

Download: Unreal Tournament 2004 Server v3339 + Bonus Pack

Pre-Installation Tasks

Create a user account for the UT server to run as.

Do not run the dedicated server as root or any other system account. Best to use a normal user account to run the server.

sudo adduser ut2004

Setup and enable the firewall

Using Uncomplicated Firewall to setup the rules shown below. Read about The Uncomplicated Firewall (ufw) if you want to learn more. I think it’s a great improvement over the old way of messing with iptables.

To check the status of UFW:

sudo ufw status verbose

Allow only SSH, http(s) and UT2004 Server ports:

sudo ufw default deny

sudo ufw allow http

sudo ufw allow https

sudo ufw allow ssh

sudo ufw allow 7777/udp

sudo ufw allow 7778/udp

sudo ufw allow 7787/udp

sudo ufw allow 7788/udp

sudo ufw allow 28902/tcp

sudo ufw allow 8080/tcp

sudo ufw enable

Install legacy GCC library

New versions of Linux, particularly 64-bit, lack some old libraries. More info about it at

Download the 32-bit GCC library libstdc++5_3.3.6-20~lucid1_i386.deb

The libstdc++ library goes in the /usr/lib directory. Use the below procedure:

#Make a temp folder
mkdir tmp

# Unpack file into tmp
dpkg-deb -R libstdc++5_3.3.6-20~lucid1_i386.deb tmp

# Look in tmp then find and copy libstdc++5.0.7 to /usr/lib
cp /usr/lib

# Make a link to the lib inside the /usr/lib dir ->

Need 32-bit compatibility

On some systems, you have to add extra libraries and such to support 32-bit programs and provide files and libraries used by the dynamically linked ucc-bin executable.

32-bit compatibility libraries

Install the 32-bit compatibility libraries to run 32 bit programs normally. Read more about it here.

apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

Multi Libs

Enabling the multilib repository allows the user to run and build 32-bit applications on 64-bit installations.

apt-get install gcc-multilib


Unpack Files

Unpack the UT Server files in the ut2004 home directory. This will create a folder named “ut-server” with all the server files inside. After unpacking the files, verify the permissions and ownership are correct.

gzip -d dedicated-server-3339-bonuspack.tar.gz

tar -xvf dedicated-server-3339-bonuspack.tar.gz

Verify File Permission and Ownership

# Ownership

sudo chown -R ut2004.ut2004 ./*

# For Directories

find . -type d -exec chmod 755 {} \;

# For Files

find . -type f -exec chmod 644 {} \;

# ucc-bin must be executable

chmod 755 System/ucc-bin


Custom Startup Script

Download the startup script and put it in the ut2004 home directory. Then chmod the file so it is executable.

chmod 744 UT2004ServerStart

The startup script is simply an easy way to quickly start up a game server.

Usage examples:

  • Start a Death Match Server: ./UT2004ServerStart DM
  • View help: ./UT2004ServerStart –help

The server log output is directed to ucc-bin.out.

Custom UT2004.ini File

To get started use this custom UT2004.ini file and change these lines as appropriate for your installation:


ServerName=My Awesome UT Server


A good resource for creating an ini file is at The Unreal Admin Page

Get a Server CD-Key

You need a CD Key, to advertise your server and collect stats.

Fill out the form and and you’ll receive a CD key by email. To install the key on your server do:

echo "SRVER-YOUR-CDKEY-HERE" > ut-server/System/cdkey

Web Admin

The web administration page is quite useful for managing the UT server. The default URL is http://your.server:8080

Edit/Create System/XAdmin.ini file to change the admin username and password.


Setup Public Downloads

When a client connects to a game for which they do not have the game maps and other files they’ll have to download them from your server. The steps outlined here show how to compress files and use Apache’s user mod for distribution.

Add Download Files

1. Make a public_html directory in the ut2004 home dir: ~/public_html

2. Then make directories like ~/public_html/maps and ~/public_html/temp

3. Go through each of the UT2004 folders and copy these files into into the public_html/temp directory:

  • .ukx – Animations
  • .ut2 – Maps
  • .uax – Sounds
  • .usx – StaticMeshes
  • .int – System
  • .u – System
  • .utx – Textures

4. Compress the files as shown below. Note, -nohomedir is important or else fails.

cd ~/ut-server/System

for file in ~/public_html/temp/*; do ./ucc-bin compress -nohomedir $file; done

5. Finally, move all the compressed files into /public_html/maps folder .


Activate Apache’s userdir module

The userdir module is what sets up the option for you to use user directories with Apache.

cd /etc/apache2/mods-available/

a2enmod userdir

service apache2 restart


GameSpy is No More

The master servers at are defunct and your dedicated server will not be able to connect to them. An alternative server is at so put the following into /etc/hosts file:

Start the Game Server!

Finally, you are ready to start playing. Now, switch to the ut2004 user and go into the home directory and enter:

./UT2004ServerStart DM

Once that starts, use tail -f ucc-bin.out to view the server’s startup sequence. If all is well you should see some output like this:

Executing Class Engine.ServerCommandlet
Missing Class Class Editor.TransBuffer
Browse: DM-CarPark-DCSE-XL-2K4?Name=Player?Class=Engine.Pawn?Character=Jakob?team=255?game=XGame.xDeathMatch
Collecting garbage
Purging garbage
Garbage: objects: 35125->35121; refs: 387137
Game class is 'xDeathMatch'
Bringing Level DM-CarPark-DCSE-XL-2K4.myLevel up for play (25) appSeconds: 1.766319...
Loading Admins & Groups
Kick and Ban Privileges Loaded
Maps & Game Privileges Loaded
Admins & Groups Management Loaded
Extra Privileges Loaded
GameInfo::InitGame : bEnableStatLogging False
UdpServerQuery(crt): Port 7787 successfully bound.
Defaulting to false
Loading Available Maps
Loading Game Types
xWebAdmin.UTServerAdmin Initialized on port 8080
MasterServerUplink: Resolved as
Resolved (
UdpGameSpyUplink: Master Server is
UdpGameSpyUplink: Port 7788 successfully bound.
MasterServerUplink: Connection to established.
Master server requests heartbeat 0 with code 1176
Master server requests heartbeat 1 with code 1176
Master server requests heartbeat 2 with code 1176
Master server assigned our MatchID: 0
Client netspeed is 10000
New Player Nargonne id=212934ijhjhjh0c96f1b7a779a2f09e