noobtuts

UNET Server Hosting Tutorial

In this Tutorial we will learn how to build a Headless Mode UNET server, find a decent host and then use SSH to transfer and run our game server on it. We will explain the whole process step by step, so that everyone can understand it.

Building in Headless Mode

Unity allows us to build Linux executables as Headless, so that no graphics card is needed, which saves lots of performance and is perfect for game servers.
Note: headless mode currently only works for Linux builds, so that's our best option.

Our first step is to open our UNET Project and select File->Build Settings... where we build for Linux with Headless Mode enabled:
Unity Headless Mode

After pressing the Build button, Unity will create the headless executable in the directory that we specified. We have to transfer the build to the server later, so let's also compress it as one zip file and name it headless.zip:
Headless Mode Zip

Renting a Server

In order to host the game server on the Internet, we first need to rent a server. Most hosting companies offer virtual servers and dedicated servers. A virtual server means that we share the resources with a few other virtual servers, that all run one one physical machine. A dedicated server means that it's just one physical machine all for us alone.

When it comes to the hardware, we have to understand that all our Unity Scripts run in a single thread, so we should prefer a server with only a few really fast cores over many slow cores. For example, 4 cores with 4 GHz would give us better performance than 8 cores with 2 GHz. The amount of RAM mostly depends on the amount of entities in our Scene, so it's recommended to test the game locally first and monitor the RAM usage over a few hours. The hard drive should be an SSD, so that loading and saving data from/to it happens as fast as possible. The size of the disk mostly depends on the amount of players in the database, which starts small and then grows over time.

The best choice for the server's operating system is a Linux that is supported by Unity. According to posts on the Unity forums, their main target is Ubuntu Linux, but Linux Mint (which is an Ubuntu derivate) works just as well.

For real world game servers, we recommend renting a dedicated server. For development and testing, a virtual server (also known as VPS) is totally fine though.

As the next step, we will rent a host. We recommend to use a major hosting company that doesn't mess with the networking settings too much. Smaller companies tend to have weird configurations and limitations that may cause UNET bugs. The following hoster works perfectly fine with our uMMORPG and has outstanding customer support:

It's important to select Ubuntu as the operating system.

After purchasing, it will take up to 2 hours for them to setup our server. Afterwards we will receive an email with the SSH credentials. The email contains something like:

Configuring the Server

SSH and SCP

We will need the SCP command to transfer the file and the SSH command to configure the server.

SSH stands for secure shell, which is like running a Terminal or Command Prompt on the remote server. On Linux and MacOS, we can simply open a Terminal and use the ssh command directly. On Windows systems we need the PuTTY tool for that.
Note: the rest of this Tutorial will use the Linux/MacOS Terminal. Windows users will need to use the tool mentioned above and click a button here and there.

SCP is a tool that copies a file from our local machine over SSH to the remote server. On Linux/MacOS we can use the scp command in the Terminal. On Windows we need the WinSCP tool.
Note: the rest of this Tutorial will use the Linux/MacOS Terminal. Windows users will need to use the tool mentioned above and click through the interface to transfer the file.

Transferring the File

Alright, let's begin by copying the headless.zip file to the server. We can open a Terminal and then run the following command:

scp /path/to/headless.zip root@1.2.3.4:~/headless.zip

Note: replace the first path with the path to your headless.zip file and replace the IP with your server's IP address.

We will be asked for our password (the SSH password) after a few seconds. Afterwards it starts transferring the file:
SCP Transfer

Unpacking the File

Now we can establish a ssh connection to the server:

ssh root@1.2.3.4

Note: 1.2.3.4 is just an example IP, you will need to use the one from your server.

Afterwards we may get a warning that asks us if we want to continue. In this case we enter yes. Afterwards we also enter the SSH password. Now our Terminal looks like this:
SSH logged in

We can enter ls to see the files on the server:

ls

Which shows us our file:
SSH LS command

Awesome! Let's install the unzip tool really quick:

apt-get update
apt-get install unzip

Now we can unzip our file:

unzip headless.zip

Running the Server

We can run the server with the following command:

./game.x86_64

If you get a 'file not found' error:

If you get a 'permission denied' error:

After successfully running it, we can see the default Unity headless output:
Unity run Headless build
Note: closing the Terminal window will also close the server.

It's important to know that this command just runs the game server. UNET also requires us to call the StartServer function after startup. Read our Detect Headless Mode Tutorial for more info.
Note: uMMORPG already does that automatically.

Showing Debug Messages

Sadly Unity doesn't show any Debug.Log/Warning/Error messages here, but there is a workaround. We can open a new Terminal window, ssh to the server again and then constantly show the latest Log messages like this:

ssh root@1.2.3.4
tail -f ~/.config/unity3d/noobtuts.com/uMMORPG/Player.log

Note: replace the path with your Project's Company Name and Product Name that can be found in under Edit->Project Settings->Player.

If you also feel like they should show Debug messages directly when running the server, then please reply in our Unity Thread.

Connecting with a Game Client

Finally we can open our Unity Project, select the NetworkManager component and insert our server's IP address under Network Info->Network Address in the Inspector. If we press Play then we can now connect to our remote server!

Security Notes

In this Tutorial we learned how to run the server remotely in the easiest way possible. It is also recommened to learn how to secure a Ubuntu server and how to run the game as a non-root user.