Running your own World of Warcraft private server on a Linux VPS used to be a niche project, but in 2026 the tooling has matured to the point where a sysadmin with basic SSH skills can build one in an afternoon. The hardest part most newcomers hit is not the compile or the database, but the auto-start configuration. After all, a server that needs a manual restart every time your VPS provider does maintenance is barely a server at all.
In this guide I walk through how to set up a WoW private server on a Linux VPS with systemd auto-start, using AzerothCore as the emulator core. I cover the full path: VPS hardware requirements, dependency installation, source compilation, MariaDB setup, configuration files, and the systemd service units that make worldserver and authserver survive reboots. The goal is a single document you can follow from a freshly provisioned VPS to a server that comes back on its own after a power cycle.
A quick note on legality before we start. A private server itself is software you compile and run on your own hardware. It is not affiliated with or endorsed by Blizzard. Distributing modified game clients or operating a for-profit server is a different legal territory that I will not cover here. This guide is aimed at people building a test box, a friends-and-family realm, or a development environment. Yes, WoW private servers are absolutely still a thing in 2026, and yes, you can host one yourself with the right approach.
Table of Contents
VPS Hardware and OS Requirements for a WoW Private Server
The VPS you choose matters more than which emulator you pick. A WotLK core like AzerothCore is forgiving, but an underpowered VM will fall over the moment more than a handful of players log in. I have run these servers on everything from a $5 droplet to a dedicated box, and there is a real floor below which the experience is unusable.
Here is the hardware breakdown I recommend for a WotLK (3.3.5a) private server. These numbers assume AzerothCore with a few modules; TrinityCore on a later expansion will need more RAM and CPU.
CPU: Minimum 2 cores (vCPU), recommended 4+ cores. The worldserver thread is single-threaded for the main game loop, so clock speed matters more than core count for that process. Authserver is lightweight.
RAM: Minimum 4 GB, recommended 8 GB. The core itself uses roughly 1.5 to 2.5 GB; MariaDB needs 1 GB; the build process can spike to 3 GB during compilation.
Storage: Minimum 40 GB SSD, recommended 80 GB NVMe. The client data files (dbc, maps, vmaps, mmaps) alone take 8 to 12 GB, and the source plus build directory adds another 5 to 8 GB.
Network: 100 Mbps is fine for 50 players. Look for a provider with low latency to your player base and generous or unmetered monthly transfer.
For the operating system I strongly recommend Ubuntu 22.04 LTS or Debian 12. Both are well documented by the AzerothCore community, ship modern enough packages for cmake and boost, and have predictable systemd behavior. Rocky Linux 9 works too if you prefer an RHEL-family distro, but expect to enable some extra repositories like EPEL and PowerTools. This guide uses Ubuntu and Debian package names; translate to dnf if you go the Rocky route.
Preparing Your Linux VPS for Server Installation
Start with a freshly provisioned VPS and a root-equivalent user. The first thing I do on any new game server box is create a dedicated, non-root system user for the WoW server binaries. Running worldserver as root is a security smell and makes systemd harder to configure cleanly later.
Create the user and switch into it for the build steps:
sudo useradd -m -s /bin/bash wowsudo passwd wowsudo usermod -aG sudo wowsu - wow
Before installing anything else, lock down SSH access. Disable password authentication and require key-based login by editing /etc/ssh/sshd_config, setting PasswordAuthentication no, and restarting sshd. Update the system and install essential tools:
sudo apt update && sudo apt upgrade -ysudo apt install -y git wget curl nano unzip htop
Set the timezone on the VPS to UTC to avoid confusing log timestamps across the authserver and worldserver. The command is sudo timedatectl set-timezone UTC. This sounds minor, but mismatched clocks between the database and the core are a classic source of realm list errors.
Installing Build Dependencies and Database Tools
AzerothCore and TrinityCore share most of their build dependencies because AzerothCore is a fork of TrinityCore. The full dependency list for Ubuntu and Debian is short. Install it in one shot:
sudo apt install -y build-essential cmake g++ clang libboost-all-dev libssl-dev libmysqlclient-dev libbz2-dev libreadline-dev libncurses-dev zlib1g-dev
Verify that cmake is at least version 3.16 (cmake --version). Older Debian releases ship cmake 3.13, which is too old for AzerothCore. On Debian 11 you may need to install a newer cmake from the official Kitware repository.
Next install MariaDB as the database backend. I prefer MariaDB over MySQL on Linux VPS deployments because it is lighter on memory and the package is current in both Ubuntu and Debian repos:
sudo apt install -y mariadb-server mariadb-clientsudo systemctl enable --now mariadbsudo mysql_secure_installation
Run the secure installation script and set a strong root password. Disable the test database and anonymous users. We will create the actual game databases in a later step, so just make sure MariaDB is running and enabled on boot with systemctl is-enabled mariadb.
Downloading and Compiling the AzerothCore Source
With dependencies in place, clone the AzerothCore repository. I keep all server files under /home/wow/azeroth-server so the systemd service paths are predictable. From the wow user home directory:
mkdir -p ~/azeroth-server/{bin,etc,data}cd ~git clone https://github.com/azerothcore/azerothcore-wotlk.gitcd azerothcore-wotlk
Create a build directory and run cmake. The key flags tell cmake where to install the binaries and that we want both the worldserver and authserver targets:
mkdir build && cd buildcmake ../ -DCMAKE_INSTALL_PREFIX=/home/wow/azeroth-server -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DTOOLS=0 -DSCRIPTS=1
The -DTOOLS=0 flag skips building the data extraction tools on the server (we will get the data files separately). -DSCRIPTS=1 compiles the included C++ scripts which most people want. If you want NPCBots or specific modules, add those module git submodules now before the build.
Compile with all available cores. On a 4 vCPU VPS this takes roughly 25 to 40 minutes:
make -j$(nproc)make install
After make install, you should see worldserver and authserver binaries in /home/wow/azeroth-server/bin. If either is missing, the cmake configuration step likely failed silently, re-run it and read the output carefully. The two default configuration templates worldserver.conf.dist and authserver.conf.dist will land in /home/wow/azeroth-server/etc.
Configuring MySQL/MariaDB and Importing Databases
Now the database layer. AzerothCore ships the full schema and base data as SQL dumps in the source tree under data/sql/base. We need three databases: acore_auth, acore_characters, and acore_world. The worldserver can auto-create and populate these on first run if you give it a privileged MySQL user, but I prefer to set them up manually so I know exactly what is in the box.
Create the databases and a dedicated user:
sudo mysql -u root -p
Inside the MySQL prompt:
CREATE DATABASE acore_auth DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;CREATE DATABASE acore_characters DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;CREATE DATABASE acore_world DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;CREATE USER 'acore'@'localhost' IDENTIFIED BY 'YourStrongPasswordHere';GRANT ALL PRIVILEGES ON acore_*.* TO 'acore'@'localhost';FLUSH PRIVILEGES;EXIT;
If you prefer the automated path, just create the acore user with the grants above and skip creating the databases manually. Worldserver will create and populate them on first launch, pulling from the SQL dumps in the source tree.
One forum pain point worth flagging: the localhost hostname in the GRANT statement is intentional. Do not use the VPS public IP unless you have a specific reason, because binding the database to a public interface is a major security risk.
Editing worldserver.conf and authserver.conf
Copy the distribution templates into the live config files and edit them:
cd /home/wow/azeroth-server/etccp worldserver.conf.dist worldserver.confcp authserver.conf.dist authserver.conf
In authserver.conf, set the database connection string. Look for the LoginDatabaseInfo line and update it to match the credentials you just created:
LoginDatabaseInfo = "127.0.0.1;3306;acore;YourStrongPasswordHere;acore_auth"
In worldserver.conf, update three database connection strings and the DataDir path:
LoginDatabaseInfo = "127.0.0.1;3306;acore;YourStrongPasswordHere;acore_auth"WorldDatabaseInfo = "127.0.0.1;3306;acore;YourStrongPasswordHere;acore_world"CharacterDatabaseInfo = "127.0.0.1;3306;acore;YourStrongPasswordHere;acore_characters"DataDir = "/home/wow/azeroth-server/data"
The format is host;port;user;password;database. The semicolons are required, not a typo. Save both files. The config also has many gameplay tuning knobs (rates, spawns, ah bot) but leave those at defaults until the server boots cleanly at least once.
You still need the game data files in the DataDir. Either extract them from a 3.3.5a client using the official AzerothCore extractor tools, or download a pre-extracted data pack from the AzerothCore community. The four subdirectories you need are dbc, maps, vmaps, and mmaps. Without these, worldserver will refuse to start.
Creating systemd Service Units for Auto-Start
This is the step that most guides gloss over and the reason this article exists. systemd service units are what turn your manually-launched WoW server into a real daemon that starts on boot, restarts on crash, and logs cleanly to the journal.
Create two unit files as root (or with sudo). The authserver service goes first because worldserver does not strictly depend on it, but having auth up first makes player logins immediate.
/etc/systemd/system/azerothcore-auth.service
[Unit]Description=AzerothCore Auth ServerAfter=network.target mariadb.serviceWants=mariadb.service[Service]Type=simpleUser=wowGroup=wowWorkingDirectory=/home/wow/azeroth-server/binExecStart=/home/wow/azeroth-server/bin/authserver -c /home/wow/azeroth-server/etc/authserver.confRestart=alwaysRestartSec=5StandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.target
/etc/systemd/system/azerothcore-world.service
[Unit]Description=AzerothCore World ServerAfter=network.target mariadb.service azerothcore-auth.serviceWants=mariadb.service[Service]Type=simpleUser=wowGroup=wowWorkingDirectory=/home/wow/azeroth-server/binExecStart=/home/wow/azeroth-server/bin/worldserver -c /home/wow/azeroth-server/etc/worldserver.confRestart=alwaysRestartSec=10StandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.target
A few details worth explaining because they trip people up. Type=simple is correct for AzerothCore binaries because they do not fork into the background when run from the command line. Restart=always with a RestartSec of 5 to 10 seconds means the server comes back automatically after a crash or a kill, which is exactly the auto-restart behavior the forum posts keep asking for. WantedBy=multi-user.target in the Install section is what makes systemctl enable actually wire up boot-time startup.
Reload systemd, enable both services on boot, and start them:
sudo systemctl daemon-reloadsudo systemctl enable azerothcore-auth.service azerothcore-world.servicesudo systemctl start azerothcore-auth.servicesudo systemctl start azerothcore-world.service
Verify both are running and enabled on boot:
sudo systemctl status azerothcore-authsudo systemctl status azerothcore-worldsudo systemctl is-enabled azerothcore-auth azerothcore-world
Both should report enabled. If you reboot the VPS now (sudo reboot), the auth server and world server will come up automatically once MariaDB is online, which is the systemd auto-start outcome we wanted from the start. This is the part Reddit threads on r/wowservers consistently say is poorly documented, and it is honestly just two small unit files.
Opening WoW Server Ports With UFW or firewalld
Players cannot connect if the firewall blocks them. The three TCP ports AzerothCore uses by default are 3724 (authserver), 8085 (worldserver), and 3443 if you enable RA remote administration. On Ubuntu and Debian with UFW:
sudo ufw allow 3724/tcp comment 'WoW authserver'sudo ufw allow 8085/tcp comment 'WoW worldserver'sudo ufw reload
On Rocky Linux with firewalld, the equivalent is:
sudo firewall-cmd --permanent --add-port=3724/tcpsudo firewall-cmd --permanent --add-port=8085/tcpsudo firewall-cmd --reload
Do not expose MySQL (3306) to the public internet under any circumstances. The database should only listen on 127.0.0.1, which is the MariaDB default. If your VPS provider also runs a cloud firewall or security group, open the same ports there too, otherwise UFW will be open but traffic will still be dropped at the provider edge.
Starting, Testing, and Connecting to the Server
With both services running, create your first admin account. AzerothCore exposes a SOAP or RA interface, but the simplest path is to run a command inside the worldserver console. Use journalctl to follow the worldserver log:
sudo journalctl -u azerothcore-world -f
Look for the line World initialized or similar. That means the data files loaded, the world database populated, and the realm is broadcasting. To create an account, attach to the worldserver console:
sudo systemctl attach azerothcore-world
Inside the console run: account create admin yourpassword and then account set gmlevel admin 3 -1 to grant administrator rights across all realms. Detach with Ctrl+\ (not Ctrl+C, which would stop the service).
On the client side, edit the file realmlist.wtf inside your WoW 3.3.5a client Data directory. Replace its contents with:
set realmlist YOUR_VPS_PUBLIC_IP
Launch the client and log in with the admin account you just created. If everything is wired up, you will see the realm selection screen and then the character creation screen. If the realm shows as offline or the client hangs at “Connecting”, jump to the troubleshooting section below.
Troubleshooting Common WoW Private Server Issues
Most connection and boot problems fall into a small set of categories. Here are the ones I see most often when helping people bring up AzerothCore on a fresh VPS.
Authserver starts but worldserver immediately exits. Run sudo journalctl -u azerothcore-world -n 100 and look for missing data files or a database connection error. The most common cause is an empty DataDir; worldserver will refuse to boot without dbc, maps, vmaps, and mmaps in place.
Client hangs at “Connected” or “Logging in to game server”. This is almost always a realmlist issue in the database, not the realmlist.wtf file. Open the acore_auth database and check the realmlist table: the address column for your realm must contain the VPS public IP, not 127.0.0.1. Update it with: UPDATE acore_auth.realmlist SET address='YOUR_VPS_PUBLIC_IP' WHERE id=1;
systemd keeps restarting worldserver in a loop. Check that the wow user can read all files in /home/wow/azeroth-server and that the binary has execute permission. Also confirm MariaDB is actually running with systemctl is-active mariadb; the After= directive only orders startup, it does not fail the unit if mariadb dies.
Players can see the realm list but cannot enter the world. Port 8085 is blocked, either by UFW on the VPS or by the cloud firewall at your provider. Re-check both layers. The auth handshake uses 3724 and the world transfer uses 8085, so partial connectivity is a classic symptom.
Build fails with a boost or openssl error. You are likely missing one of the dev packages. Re-run the apt install line for the dependencies and confirm dpkg -l | grep libboost-all-dev shows it installed. Old cmake is the other common cause; AzerothCore requires cmake 3.16+.
FAQs
Is hosting a private WoW server illegal?
Running server emulator software like AzerothCore on your own hardware is not itself illegal, but it violates Blizzard’s terms of service and the server is not affiliated with or endorsed by Blizzard. Distributing modified game clients, charging players for access, or hosting a large public server all carry much higher legal risk. This guide is intended for personal, friends-and-family, or development use only.
How do you start your own WoW private server?
The basic steps are: provision a Linux VPS with at least 4 GB RAM, install build dependencies and MariaDB, clone and compile AzerothCore, create the acore_auth, acore_characters, and acore_world databases, copy and edit worldserver.conf and authserver.conf, place the dbc, maps, vmaps, and mmaps data files in the DataDir, then launch authserver and worldserver. Open ports 3724 and 8085 in your firewall and point your client realmlist.wtf at the VPS public IP.
Are WoW private servers still a thing?
Yes. The AzerothCore and TrinityCore projects are actively maintained as of 2026, with regular commits, active module communities, and ongoing Reddit discussion on r/wowservers. Most activity is around WotLK (3.3.5a) and Classic-era cores. Players use private servers to revisit old expansions, run customized gameplay, or build small private communities for friends.
Can you host your own World of Warcraft server?
Yes, with a Linux VPS or a dedicated home server. A WotLK AzerothCore server runs comfortably on a 4 GB RAM, 2 vCPU VPS for a small group of friends. The main requirements are enough RAM for MariaDB and the worldserver process, SSD storage for the 8 to 12 GB of client data files, and an internet connection with enough bandwidth for your expected player count. systemd service units handle automatic startup and crash recovery on a VPS.
Final Thoughts on Running a WoW Private Server With systemd
Once the systemd units are in place, how to set up a WoW private server on a Linux VPS with systemd auto-start becomes a solved problem rather than a recurring chore. The server boots with the VPS, restarts itself on crash, and logs cleanly to the journal where you can grep for errors. The two unit files are the difference between a hobby project and something that can run unattended for weeks.
From here, the natural next steps are installing modules for extra gameplay features, setting up a regular database backup job with mysqldump and cron, and watching the systemd journal after each module change to confirm worldserver still boots cleanly. Treat the unit files as the source of truth for how the server starts, edit configs in /home/wow/azeroth-server/etc, and your realm will survive every reboot your VPS provider throws at it.