Run a private Turtle WoW server with Docker. This stack uses Shyalya/tortoise-wow with playerbots.
The server work and install steps come from this video:
Tortoise WoW / playerbots setup (YouTube)
This repository ships a Compose file. CI builds and publishes the server images to GHCR. The published binaries use a portable x86-64-v2 CPU target so the image does not depend on the instruction set of the CI runner.
- Docker Desktop (or Docker Engine with Compose v2)
- A Turtle WoW 1.18.1 client (build 7272)
- Client data folders:
dbc,maps,vmaps,mmaps - Several GB of free disk space
The images do not include client data. You extract that data from your game client. The video and the Linux install guide show how.
git clone https://github.com/Nescabir/tortoise-docker.git
cd tortoise-dockercp .env.example .envEdit .env:
- Set strong values for
DB_ROOT_PASSWORDandDB_PASSWORD. - Set
REALM_ADDRESSto an address your game client can reach. - Set
DATA_PATHif your client data is not in./data.
Use 127.0.0.1 for REALM_ADDRESS only when the client runs on the same machine. For another PC on your LAN, use your host LAN IP and set GAME_BIND_IP=0.0.0.0 in .env — by default the game ports are only published on 127.0.0.1, so other machines cannot reach them even if REALM_ADDRESS points at your LAN IP.
Put the extracted folders here (or under your DATA_PATH):
data/
dbc/
maps/
vmaps/
mmaps/
Compose pulls the published images and starts the stack:
docker compose up -dThe first start downloads the images (if needed) and imports the world database. This takes several minutes.
Then watch the world server:
docker compose logs -f mangosdWait until the log shows:
World server is up and running
The first start with playerbots is slow. The server builds bot gear data before it is ready. Do not create an account before that line appears.
docker compose exec -u turtle mangosd bash -c 'echo "account create myuser mypass" > /opt/turtle/run/mangosd.in'Check that the account exists:
docker compose exec -T db mariadb -uroot -pYOUR_ROOT_PASSWORD -e "SELECT id, username FROM tw_logon.account;"Replace YOUR_ROOT_PASSWORD with the value of DB_ROOT_PASSWORD from .env.
Edit realmlist.wtf in your Turtle WoW client:
set realmlist 127.0.0.1
Use the same host as REALM_ADDRESS in .env. Then log in with the account you created.
If an older published image exits with code 132 (SIGILL), rebuild it locally with the same portable target and select it with TURTLE_IMAGE:
docker build \
--build-arg BUILD_PLAYERBOTS=ON \
--build-arg CPU_TARGET=x86-64-v2 \
-t tortoise-wow:playerbots-local .
TURTLE_IMAGE=tortoise-wow:playerbots-local docker compose up -dThe TURTLE_IMAGE override is optional; without it, Compose uses the published image selected by TAG.
| Setting | Default | Meaning |
|---|---|---|
REALM_ADDRESS |
127.0.0.1 |
Host the client uses to reach the world server |
REALM_NAME |
TurtleWoW |
Name of the realm in the client list |
DATA_PATH |
./data |
Folder with dbc, maps, vmaps, mmaps |
TAG |
playerbots |
Image variant (playerbots or no-bots) |
TURTLE_IMAGE |
published image from TAG |
Optional full image reference, useful for a local build |
AI_PLAYERBOT_ENABLED |
1 |
Turn bots on or off (playerbots image only) |
AI_MIN_RANDOM_BOTS / AI_MAX_RANDOM_BOTS |
10 / 10 |
How many random bots to keep online |
Keep bot counts low for the first start. Raise them later in .env, then run:
docker compose up -d mangosdmangosd.conf, realmd.conf, aiplayerbot.conf, and ahbot.conf are written to ./config on the host (or CONFIG_PATH from .env) the first time the stack starts.
Edit any setting there directly — for example server rates, difficulty, or announce messages. Settings that also have a .env variable (see the table above) get overwritten from that variable on every start; everything else you edit is left as-is.
After editing, restart the affected service:
docker compose up -d mangosd realmdView logs:
docker compose logs -f realmd
docker compose logs -f mangosdStop the stack:
docker compose downStart again (keeps your database):
docker compose up -dReset the database (deletes characters and accounts):
docker compose down
docker volume ls
docker volume rm tortoise-docker_db-data tortoise-docker_init-marker
docker compose up -dVolume names can include your Compose project name. Use docker volume ls to confirm the names.
| Problem | What to do |
|---|---|
| Login fails / unknown account | Wait for World server is up and running, then create the account again |
| Account create does nothing | mangosd is still starting; wait and retry |
| Realm list is empty or offline | Check that realmd and mangosd are up: docker compose ps |
| Client hangs after you pick the realm | Set REALM_ADDRESS to an IP the client can reach; world port is 8090 |
| Empty world / no NPCs | First database import failed; check docker compose logs db-init |
| No bots | Use TAG=playerbots and AI_PLAYERBOT_ENABLED=1 |
| Client crash: interface corrupt | Use the published image from this project; do not strip Turtle addons |
| LAN client can't reach the realm | Set GAME_BIND_IP=0.0.0.0 in .env (default 127.0.0.1 only accepts connections from the host itself), then docker compose up -d |
- Setup walkthrough: YouTube video
- Server source: Shyalya/tortoise-wow
- Install notes: INSTALL-LINUX.md
Server code stays under the upstream project license. This repository only provides the Docker packaging.