How to host a WoW private server on DigitalOcean

This is a complete step-by-step video tutorial created by heyaapl about setting up a World of Warcraft 3.3.5 server – and making it public – using the DigitalOcean, a popular cloud infrastructure provider. In January 2018, DigitalOcean was rated the third-largest hosting company in the world.

The video goes through the entire AzerothCore server setup process starting from scratch, installing the server on a Debian operating system that runs remotely in the DigitalOcean cloud.

The user local operating system used in the video tutorial is Windows but you can also use macOS or any GNU/Linux distribution.

Note: this tutorial is about creating a production WoW server hosted remotely in the cloud. If you are looking for how to setup a local development environment or domestic private server setup in your own machine, you can read this guide instead for Linux and Windows. For macOS users you can read this.

Note2: this tutorial is about creating a WoW private server for World of Warcraft Wrath of The Lich King 3.3.5a (WOTLK). If you look for another WoW version you can have a look at our article comparing different WoW emulators with different WoW versions.

The tutorial covers the following:

  • Looking at various tools to help you get your server up and running, such as MySQL Clients, SSH Clients, SFTP Clients, and powerful file editors.
  • Configuring a Droplet on DigitalOcean from scratch
  • Building the Core
  • Loading the Database

PC Apps You May Need:

 

MySQL Clients:

SSH Clients:

FTP Clients:

File Editors:

Choosing our Droplet

 

Setup new DigitalOcean Droplet

  • 8GB RAM / 4 Cores
  • Debian 9
  • Choose Region
  • Enable Monitoring
  • One-time Password
  • Name Droplet “AzerothCore”

DigitalOcean Droplet Initial Configuration

 

Change your Time Zone

  • Enter the command timedatectl to confirm the Droplet is set to UTC (00:00) time.
  • Before we can set the time zone, we first need to figure out what the code is for your time zone. Enter the command timedatectl list-timezones to see a list of all time zones. Hit Enter until you find your time zone, and make note of it. Hit Control+C once you’re done looking for time zones.
  • Once you’re back at the command line, enter sudo timedatectl set-timezone YOUR_TIME_ZONE
  • Verify that the Time Zone set correctly by entering timedatectl

Add a new User

  • It’s best practice to not use the root user for applications. Because of this, we’re going create a user that will be responsible for all AzerothCore activities. Enter adduser azcore to create a new user.
  • Next, let’s make sure this user has sudo permissions. Provision those permissions by using the following command usermod -aG sudo azcore

Verify Sudo access for the new User

  • Let’s log in as our new user sudo su azcore
  • Enter sudo whoami and then enter the password you chose for this user (may be different from your root password).
  • If it says root, then you’re all set! Enter the command exit to return to your root user for the next steps.

Installing Key Libraries & Additional Apps

  • Next we need to install a bunch of important libraries, applications, and tools needed to Azerothcore. Run the following command:
    sudo apt-get update && sudo apt-get install git cmake make gcc g++ clang default-libmysqlclient-dev libssl1.0-dev libbz2-dev libreadline-dev libncurses-dev mysql-server libace-6.* libace-dev
    
  • Choose ‘Y’ for any prompts asking for additional space for the installation.
  • Let’s refresh our App List once again before we continue sudo apt-get update
  • Let’s install Screen, an application that will let us have multiple applications open at once and persist after we log out of the console sudo apt-get install screen
  • Next up is curl – we’ll be using this to get the VMAP, MMAP, and other required data for the server sudo apt install curl
  • Let’s install the unzip utility, so we can unzip the data files sudo apt install unzip
  • Finally, let’s wrap up with sudo apt install

Complete the MariaDB Secure Installation

  • Let’s begin the process sudo mysql_secure_installation
  • For the following prompts, answer [no pass]/N/Y/Y/Y/Y
  • Once we’re back in the command line, type sudo mysql to enter the MariaDB Console
  • Once in the MariaDB Console, let’s create our User:
    GRANT ALL ON *.* TO 'dbadmin'@'%' IDENTIFIED BY 'password1' WITH GRANT OPTION;
    
  • Choose a Username you want – it can be anything you’d like, it doesn’t have to be dbadmin. Also, please make sure you choose a very secure password, as password1 should NEVER be used.
  • Let’s refresh the permissions for MariaDB Flush Privileges;
  • Return to the main Debian console exit

Configure Remote Connections to MariaDB

  • Navigate to the folder holding the file we need cd /etc/mysql/mariadb.conf.d
  • Launch the nano file editor for the configuration file nano 50-server.cnf
  • Navigate to the Bind Address, and update it to: 0.0.0.0
  • To save your changes, press Ctrl + X, then Y, followed by Ctrl + T. Then use your arrow keys to select 50-server.cnf
  • Now that we’ve updated a key MariaDB Configuration file, we need to restart the MariaDB process. Enter sudo /etc/init.d/mysql restart

Configure the Uncomplicated Firewall (UFW)

  • Let’s refresh our catalog of apps sudo apt update
  • Let’s install UFW sudo apt install ufw
  • Next, we’re going to blanket-block all Incoming connections. This is an important step to protecting your server. We’ll open up ports in the following steps sudo ufw default deny incoming
  • Next, let’s blanket-allow all Outgoing connections. This should allow your server to make callouts without issue. sudo ufw default allow outgoing
  • We need to make sure we don’t get locked out of the Console, so we need to unblock port 22, which is the port SSH uses. To do this, enter sudo ufw allow ssh
  • Let’s allow the MariaDB Port to accept incoming connections sudo ufw allow 3306
  • Let’s enable the Authentication Server to accept incoming connections sudo ufw allow 3724
  • And now the Worldserver port sudo ufw allow 8085
  • Verify that you’ve enabled all the above ports, and then turn on UFW with this: sudo ufw enable

AzerothCore Installation

 

Let’s clone the AzerothCore Git

  • Log in as our sudo user sudo su azcore
  • Navigate to our home directory cd
  • Let’s download and clone the latest version of AzerothCore git clone https://github.com/azerothcore/azerothcore-wotlk.git --branch master --single-branch azerothcore
  • Once the clone is complete, let’s navigate to the top level folder of the git directory cd azerothcore
  • We need to make a folder called build mkdir build
  • Navigate to the new build folder cd build
  • Now we run the cmake command, this is the pre-compile step to ensure all cpp files are accounted for before we compile, and it tells the compile what to compile.
    cmake ../ -DCMAKE_INSTALL_PREFIX=$HOME/azeroth-server/ -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -DTOOLS=0 -DSCRIPTS=1
    
  • Now we compile AzerothCore – this can take some time, depending on the number of cpu cores your Droplet has. This tutorial is based on the 4 cpu core Droplet. Enter the following command to compile the core and place the assembled items in their new home:
    MTHREADS=`grep -c ^processor /proc/cpuinfo`; MTHREADS=$(($MTHREADS + 2));
    make -j $MTHREADS;
    make install -j $MTHREADS;
    

Data Files

  • Let’s navigate back to the home directory cd
  • Now we need to go to the compile server folder cd azeroth-server
  • Let’s download the data files required. curl https://wow.heyaapl.com/data.zip --output data.zip
  • Let’s unzip the main data directory unzip data.zip
  • We need to navigate to the data folder to continue unzipping the child folders cd data
  • No we will unzip all child zip files unzip '*.zip'

Set up the server config files

  • Using SFTP, navigate to /home/azcore/azeroth-server/etc and download the authserver.conf.dist and worldserver.conf.dist to your local machine.
  • Rename them on your local machine to remove the .dist from the file name.
  • Update the Database information in both the Authserver and Worldserver configuration files by using your file editor to edit. Use the username and password you created in the earlier steps to update the database connection information.
  • In the Worldserver config, configure the DataDir folder to: "/home/azcore/azeroth-server/data"
  • Upload the .conf files back to the etc directory using your SFTP client.

Initial Database Setup and Load

  • Similar to what was done with the Authserver.conf and Worldserver.conf, we need to update the database import configuration file. Using SFTP, navigate to /home/azcore/azerothcore/conf/ and find the config.sh.dist. Download it to your local machine.
  • Rename it to remove the .dist from the file name, so it reads config.sh.
  • Open up config.sh in an editor and locate the section DB EXPORTER/IMPORTER CONFIGURATIONS.
  • Replace the Database login information beginning at line 153 with the database username and password you set earlier in this tutorial. Do this for the Auth, Character, and World database configuration sections (beginning at line 153, 158, and 163 respectively).
  • Save config.sh and upload back to the directory /home/azcore/azerothcore/conf/.
  • We need to be in the git directory in order to execute the import script, so enter the following command cd /home/azcore/azerothcore
  • Start up the database import script by entering the following command bash apps/db_assembler/db_assembler.sh. We need to configure all databases, so we need to choose Import-all: Assemble & Import All. Type import-all and hit enter. This may error after each execution, but that’s ok – it imports each database successfully. Repeate this entire step until the World database loads. Type quit once the World database has been imported.

Server Start Up

 

Final Configuration

  • Using your MySQL Client, connect to your database. The IP address of your DigitalOcean server is the hostname, the username is your database username, and the password is your database password. The port should default to 3306. Connect.
  • Navigate to the acore_auth database, and open up the table called realmlist. View the table’s Data.
  • Update the address value to your server’s IP address. This is where you can update the name of the realm of your server if you so choose.

Start up Your Server

  • In your SSH terminal, enter the following command cd /home/azcore/azeroth-server/bin
  • Now, let’s turn on the Authserver. We’re using Screens so we can have both the Authserver and Worldserver open at the same time. We’re going to label the Authserver’s Screen ‘auth’. Enter the following command to start it up screen -AmdS auth ./authserver. Enter screen -r auth to verify that it started successfully. Press Ctrl + A, followed by D to exit the auth screen. To quit the screen altogether, hit Ctrl + C. This will kill the process, so only use this when shutting down the Authserver.
  • Now, let’s turn on the Worldserver. We’re going to label the Worldserver’s Screen ‘world’. Enter the following command to start it up screen -AmdS world ./worldserver. Enter screen -r world to verify that it started successfully. Press Ctrl + A, followed by D to exit the world screen. To quit the screen altogether, hit Ctrl + C. This will kill the process, so only use this when shutting down the Worldserver.
  • Side note: If you want to learn more about why we’re passing AmdS when initializing Screens, or to see if there are other arguments you want to pass, here’s a great reference on what each letter means and why they’re used.

Create your In-Game Account

  • Navigate to the world screen by typing screen -r world
  • Enter the following command to create your new account account create [accountname] [password]
  • Next, let’s make your new Account an Administrator account account set gmlevel [accountname] 3 -1

Update Your Realmlist

  • Set your realmlist.wtf to your DigitalOcean IP, which can be found in the [WoW Directory]/data/enUS. Edit with your editor, and log in!

This tutorial has been extracted from: the AzerothCore DigitalOcean wiki tutorial

Leave a Reply