2025-10-01 03:26:18 -04:00

AzerothCore Docker/Podman Stack

A complete containerized deployment of AzerothCore WoW 3.3.5a (Wrath of the Lich King) private server with Playerbot functionality, Eluna scripting, and automated management features.

Implementation Credits

This project is a Docker/Podman implementation based on:

Key Improvements in This Implementation

  • Logger Issue Resolution: Fixed worldserver startup issues with proper logger configuration
  • Dynamic URL Generation: Web interfaces automatically detect external URLs for deployment flexibility
  • Port Collision Prevention: All external ports optimized to avoid common development tool conflicts
  • Enhanced Security: Comprehensive security settings for all web interfaces (Grafana, InfluxDB, PHPMyAdmin)
  • Full Environment Variable Configuration: No hardcoded values, everything configurable via .env
  • External Domain Support: Configurable base URLs for custom domain deployment
  • Multi-Runtime Support: Works with both Docker and Podman
  • Automated Database Initialization: Complete schema import and setup automation
  • Comprehensive Health Checks: Built-in service monitoring and restart policies
  • Automated Backup System: Scheduled backups with configurable retention
  • Production-Ready Security: Advanced security configurations and best practices

Table of Contents

Overview

This project provides a production-ready AzerothCore deployment using Docker/Podman containers, building upon the foundational work of the AzerothCore project and incorporating containerization patterns from coc0nut's Docker setup.

What This Implementation Provides

  • Enhanced Configuration: All settings externalized to environment variables
  • Container Runtime Flexibility: Works with both Docker and Podman
  • Production Features: Health checks, automated backups, log management
  • Improved Security: No hardcoded passwords, configurable network isolation
  • Operational Tools: Comprehensive maintenance scripts and troubleshooting guides
  • Full Documentation: Complete setup, configuration, and maintenance procedures

Core Components

  • Automated database initialization and imports
  • Playerbot support for solo play (using liyunfan1223's mod-playerbots)
  • Eluna Lua scripting engine
  • Automated backups
  • Full configuration through environment variables
  • Support for both Docker and Podman runtimes
  • Portainer compatibility

Version Information

Features

  • Fully Containerized: All components run in isolated containers
  • Automated Setup: Database creation, schema import, and configuration handled automatically
  • Playerbot Integration: AI-controlled bots for solo/small group play
  • Eluna Support: Lua scripting for custom content
  • Automated Backups: Scheduled database backups with retention policies
  • Environment-Based Config: All settings configurable via .env file
  • Health Monitoring: Built-in health checks for all services
  • Network Isolation: Custom bridge network for container communication
  • Persistent Storage: Named volumes for data persistence

Available Modules

This deployment includes an automated module management system that supports 28 AzerothCore modules. All modules are automatically downloaded from GitHub when enabled and include proper configuration files.

Quality of Life Modules

Module Description Repository README Post-Install Notes
AutoBalance Dynamic difficulty scaling for dungeons/raids mod-autobalance 📖 Requires AutoBalance.conf configuration
AHBot Auction House bot for populated auctions mod-ahbot 📖 Requires mod_ahbot.conf configuration
Transmog Transmogrification system mod-transmog 📖 Requires transmog.conf configuration
NPC Buffer Buff NPC services mod-npc-buffer 📖 Requires npc_buffer.conf configuration
AoE Loot Area of effect looting feature mod-aoe-loot 📖 No additional configuration required
Learn Spells Automatic spell learning mod-learn-spells 📖 Requires mod_learnspells.conf configuration
Auto Revive Auto-revive functionality for GMs mod-auto-revive 📖 Requires AutoRevive.conf configuration
NPC Enchanter NPC-based gear enchantment services mod-npc-enchanter 📖 Requires npc_enchanter.conf configuration
Instance Reset NPC-based instance reset functionality mod-instance-reset 📖 Requires instance-reset.conf configuration

Gameplay Enhancement Modules

Module Description Repository README Post-Install Notes
Individual Progression Custom character progression system mod-individual-progression 📖 Complex SQL imports required
Dynamic XP Configurable experience rates mod-dynamic-xp 📖 Requires Individual-XP.conf configuration
Solo LFG Solo dungeon finder system mod-solo-lfg 📖 Requires SoloLfg.conf configuration
1v1 Arena Arena combat system mod-1v1-arena 📖 Database tables auto-created
Phased Duels Isolated dueling system mod-phased-duels 📖 No additional configuration required
Solocraft Solo dungeon scaling mod-solocraft 📖 Requires Solocraft.conf configuration
Random Enchants Random item enchantments mod-random-enchants 📖 Requires RandomEnchants.conf configuration
Level Grant Quest-based level granting mod-quest-count-level 📖 Requires levelGrant.conf configuration

Server Management Modules

Module Description Repository README Post-Install Notes
Breaking News Override Server announcement system mod-breaking-news-override 📖 No additional configuration required
Boss Announcer Raid boss kill notifications mod-boss-announcer 📖 No additional configuration required
Account Achievements Cross-character achievements mod-account-achievements 📖 Database tables auto-created
Gain Honor Guard Honor system for killing guards mod-gain-honor-guard 📖 Requires GainHonorGuard.conf configuration
PvP Titles Honor-based PvP title system mod-pvp-titles 📖 Requires mod_pvptitles.conf configuration
Pocket Portal Teleportation portal system mod-pocket-portal 📖 Requires pocketportal.conf configuration

Core System Modules

Module Description Repository README Post-Install Notes
Playerbots AI-controlled bot system mod-playerbots 📖 Enabled by default, extensive configuration
Fireworks Fireworks on level up mod-fireworks-on-level 📖 No additional configuration required
Eluna Lua scripting engine mod-eluna 📖 Requires mod_LuaEngine.conf configuration
Time Is Time Realistic day/night cycle mod-TimeIsTime 📖 Requires mod-time_is_time.conf configuration
NPC Beastmaster Cross-class pet system mod-npc-beastmaster 📖 Requires npc_beastmaster.conf configuration

Module Configuration

Enable modules by setting their environment variables to 1 in docker-compose-azerothcore-services.env:

# Example: Enable AutoBalance and Transmog
MODULE_AUTOBALANCE=1
MODULE_TRANSMOG=1

After enabling/disabling modules:

  1. Restart the module container: docker-compose up -d ac-modules
  2. Enabled modules will be automatically downloaded to storage/azerothcore/modules/
  3. Disabled modules will be automatically removed from the modules directory
  4. Configuration files (.conf.dist) are automatically managed:
    • Enabled modules: Config files copied to storage/azerothcore/config/
    • Disabled modules: Config files removed from config directory
  5. Important: Modules require server recompilation to be active
  6. Some modules require database imports (check individual module README files)

Module Management Behavior

The module management system provides complete automation:

  • Enable Module (MODULE_NAME=1):
    • Downloads module source code if not present
    • Copies .conf.dist files to config directory
  • Disable Module (MODULE_NAME=0):
    • Removes module directory completely
    • Removes associated configuration files
  • Module Persistence: Only enabled modules and their configs remain
  • Clean Slate: Disabling and re-enabling ensures fresh download and config
  • Zero Manual Setup: No need to manually copy configuration files

Post-Installation Requirements

⚠️ Critical: Most modules require additional steps after download:

  1. Server Recompilation: Modules need to be compiled into the server
  2. Configuration Files: Copy .conf files to config directory
  3. Database Imports: Some modules include SQL files for database schema
  4. Module-Specific Setup: Check each module's README for specific requirements

See the AzerothCore Module Documentation for complete installation procedures.

Requirements

System Requirements

  • OS: Linux (Ubuntu 20.04+, Debian 11+, RHEL 8+, or similar)
  • RAM: Minimum 4GB, Recommended 8GB+
  • Storage: 20GB minimum (50GB+ recommended with client data)
  • CPU: 2+ cores recommended
  • Network: Static IP recommended for external access

Software Requirements

  • Container Runtime: Docker 20.10+ OR Podman 3.0+
  • Compose Tool: docker-compose 1.29+ OR podman-compose 1.0+
  • MySQL Client: For manual database operations (optional)
  • Git: For cloning repositories (optional)

Game Client Requirements

  • WoW Client: Version 3.3.5a (Build 12340)
  • Client Data: Extracted maps, vmaps, mmaps, and DBC files

Project Structure

acore-compose/
├── docker-compose-azerothcore-database.yml     # Database layer
├── docker-compose-azerothcore-services.yml     # Game services layer
├── docker-compose-azerothcore-tools.yml        # Management tools layer
├── docker-compose-azerothcore-database.env     # Database configuration
├── docker-compose-azerothcore-services.env     # Services configuration
├── docker-compose-azerothcore-tools.env        # Tools configuration
├── docker-compose-azerothcore-optional.env     # Optional services config
├── scripts/                                     # Deployment, cleanup, and backup automation
├── storage/                                     # Unified storage root (configurable via STORAGE_ROOT)
│   └── azerothcore/                            # All persistent data (database, configs, tools)
├── backups/                                     # Database backups
└── readme.md                                   # This documentation

Container Architecture

Service Containers

Container Image Purpose Exposed Ports
ac-mysql mysql:8.0 MySQL database server 64306:3306
ac-authserver acore/ac-wotlk-authserver:14.0.0-dev Authentication server 3784:3724
ac-worldserver acore/ac-wotlk-worldserver:14.0.0-dev Game world server 8215:8085, 7778:7878
ac-eluna acore/eluna-ts:master Lua scripting engine -
ac-phpmyadmin phpmyadmin/phpmyadmin:latest Database management web UI 8081:80
ac-grafana grafana/grafana:latest Monitoring dashboard 3001:3000
ac-influxdb influxdb:2.7-alpine Metrics database 8087:8086
ac-keira3 uprightbass360/keira3:latest Production database editor with API 4201:8080
ac-backup mysql:8.0 Automated backup service -
ac-modules alpine/git:latest Module management -

Container Relationships

graph TD
    A[ac-mysql] -->|depends_on| B[ac-db-init]
    B -->|depends_on| C[ac-db-import]
    C -->|depends_on| D[ac-authserver]
    C -->|depends_on| E[ac-worldserver]
    E -->|depends_on| F[ac-eluna]
    A -->|backup| G[ac-backup]

Network Architecture

  • Network Name: azerothcore
  • Type: Bridge network
  • Subnet: 172.28.0.0/16 (configurable)
  • Internal DNS: Container names resolve to IPs

Initial Setup

Step 1: Clone and Configure

# Clone the repository
git clone https://github.com/uprightbass360/acore-compose.git
cd acore-compose

# Environment files are pre-configured with defaults
# Modify the relevant .env files for your deployment:
# - docker-compose-azerothcore-database.env: Database settings
# - docker-compose-azerothcore-services.env: Game server settings
# - docker-compose-azerothcore-tools.env: Management tools settings

# IMPORTANT: Configure storage location for your environment
# For local development (default):
#   STORAGE_ROOT=./storage
# For production with NFS:
#   STORAGE_ROOT=/nfs/containers
# For custom mount:
#   STORAGE_ROOT=/mnt/azerothcore-data

Step 2: Deploy the Stack

Deploy services in the correct order:

# Step 1: Deploy database layer
docker compose --env-file docker-compose-azerothcore-database.env -f docker-compose-azerothcore-database.yml up -d
#The database import happens automatically via the `ac-db-import` container. Monitor progress:
docker logs ac-db-init -f      # Watch database initialization
# Check import status
docker logs ac-db-import -f
# Verify databases were created
docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "SHOW DATABASES;"
# Step 2: Wait for database initialization, then deploy services
docker compose --env-file docker-compose-azerothcore-services.env -f docker-compose-azerothcore-services.yml up -d
docker logs ac-client-data -f  # Watch data download/extraction

The server automatically downloads and extracts game data on first run. The ac-client-data service will:

  • Download the latest client data from wowgaming/client-data releases (~15GB)
  • Extract maps, vmaps, mmaps, and DBC files
  • Cache the download for future deployments
  • Verify data integrity
  • This can take around 20 minutes to complete depending on your storage

No manual data extraction is required, but ensure you have sufficient disk space and bandwidth.

# Step 3: Deploy management tools (optional)
docker compose --env-file docker-compose-azerothcore-tools.env -f docker-compose-azerothcore-tools.yml up -d

Step 3: Create Admin Account

Once the worldserver is running:

# Attach to worldserver console
docker attach ac-worldserver

# In the worldserver console, create admin account:
account create admin yourpassword
account set gmlevel admin 3 -1
server info

# Detach from console without stopping: Ctrl+P, Ctrl+Q

Step 4: Configure Game Client

Edit your WoW 3.3.5a client's realmlist.wtf:

set realmlist YOUR_SERVER_IP

Configuration

Environment Variables

Configuration is managed through separate .env files for each layer:

Storage Configuration (All Layers)

  • STORAGE_ROOT: Root storage path (default: ./storage)
    • Local development: ./storage
    • Production NFS: /nfs/containers
    • Custom mount: /mnt/azerothcore-data
  • All layers use the same STORAGE_PATH variable derived from STORAGE_ROOT:
    • Database: STORAGE_PATH=${STORAGE_ROOT}/azerothcore
    • Services: STORAGE_PATH=${STORAGE_ROOT}/azerothcore
    • Tools: STORAGE_PATH=${STORAGE_ROOT}/azerothcore
    • Optional: STORAGE_PATH=${STORAGE_ROOT}/azerothcore

Database Layer (docker-compose-azerothcore-database.env)

  • MYSQL_ROOT_PASSWORD: Database root password (default: azerothcore123)
  • MYSQL_EXTERNAL_PORT: External MySQL port (default: 64306)
  • STORAGE_ROOT: Root storage path (default: ./storage)
  • STORAGE_PATH: Derived storage path (${STORAGE_ROOT}/azerothcore)
  • NETWORK_SUBNET: Docker network subnet
  • BACKUP_RETENTION_DAYS: Backup retention period

Services Layer (docker-compose-azerothcore-services.env)

  • AUTH_EXTERNAL_PORT: Auth server external port (3784)
  • WORLD_EXTERNAL_PORT: World server external port (8215)
  • SOAP_EXTERNAL_PORT: SOAP API port (7778)
  • STORAGE_ROOT: Root storage path (default: ./storage)
  • STORAGE_PATH: Derived storage path (${STORAGE_ROOT}/azerothcore)
  • PLAYERBOT_ENABLED: Enable/disable playerbots (1/0)
  • PLAYERBOT_MAX_BOTS: Maximum number of bots (default: 40)

Tools Layer (docker-compose-azerothcore-tools.env)

  • PMA_EXTERNAL_PORT: PHPMyAdmin port (8081)
  • KEIRA3_EXTERNAL_PORT: Database editor port (4201)
  • GF_EXTERNAL_PORT: Grafana monitoring port (3001)
  • INFLUXDB_EXTERNAL_PORT: InfluxDB metrics port (8087)
  • STORAGE_ROOT: Root storage path (default: ./storage)
  • STORAGE_PATH: Derived storage path (${STORAGE_ROOT}/azerothcore)

Realm Configuration

Update realm settings in the database:

# Update realm IP address
docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "
USE acore_auth;
UPDATE realmlist SET address='NEW_IP' WHERE id=1;"

# View current realm configuration
docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "
USE acore_auth;
SELECT * FROM realmlist;"

Volume Management

Storage Architecture

The deployment uses a unified storage approach controlled by the STORAGE_ROOT variable:

Storage Component Local Path Production Path Purpose
Database Data ./storage/azerothcore/mysql-data ${STORAGE_ROOT}/azerothcore/mysql-data MySQL database files
Game Data ./storage/azerothcore/data ${STORAGE_ROOT}/azerothcore/data Maps, vmaps, mmaps, DBC files
Configuration ./storage/azerothcore/config ${STORAGE_ROOT}/azerothcore/config Server configuration files
Application Logs ./storage/azerothcore/logs ${STORAGE_ROOT}/azerothcore/logs Server and service logs
Tools Data ./storage/azerothcore/azerothcore/grafana ${STORAGE_ROOT}/azerothcore/azerothcore/grafana Grafana dashboards
Metrics Data ./storage/azerothcore/azerothcore/influxdb ${STORAGE_ROOT}/azerothcore/azerothcore/influxdb InfluxDB time series data
Backups ./backups ./backups Database backup files

Storage Configuration Examples

Local Development

# All data stored locally in ./storage/
STORAGE_ROOT=./storage

Production with NFS

# All data on NFS mount
STORAGE_ROOT=/nfs/containers

Custom Mount Point

# All data on dedicated storage mount
STORAGE_ROOT=/mnt/azerothcore-data

Unified Storage Benefits

Single Mount Point: Only need to mount one directory in production Simplified Backup: All persistent data in one location Easy Migration: Copy entire ${STORAGE_ROOT}/azerothcore directory Consistent Paths: All layers use same storage root Environment Flexibility: Change storage location via single variable

Volume Backup Procedures

Complete Storage Backup:

# Backup entire storage directory (recommended)
tar czf azerothcore-storage-backup-$(date +%Y%m%d).tar.gz storage/

# Or backup to remote location
rsync -av storage/ backup-server:/backups/azerothcore/$(date +%Y%m%d)/

Component-Specific Backups:

# Backup just database files
tar czf mysql-backup-$(date +%Y%m%d).tar.gz storage/azerothcore/mysql-data/

# Backup just game data
tar czf gamedata-backup-$(date +%Y%m%d).tar.gz storage/azerothcore/data/

# Backup just configuration
tar czf config-backup-$(date +%Y%m%d).tar.gz storage/azerothcore/config/

Production Storage Backup:

# When using custom STORAGE_ROOT
source docker-compose-azerothcore-database.env
tar czf azerothcore-backup-$(date +%Y%m%d).tar.gz ${STORAGE_ROOT}/azerothcore/

Maintenance

Daily Operations

Check Service Status:

# View all AzerothCore containers
docker ps | grep ac-

# Check resource usage
docker stats $(docker ps --format "{{.Names}}" | grep ac-)

# View recent logs
docker logs ac-worldserver --tail 100
docker logs ac-authserver --tail 100

Server Commands:

# Attach to worldserver console
docker attach ac-worldserver

# Common console commands:
server info                    # Show server status
account create USER PASS       # Create new account
account set gmlevel USER 3 -1 # Set GM level
server shutdown 60             # Shutdown in 60 seconds
saveall                       # Save all characters

Database Maintenance

Manual Backup:

# Full database backup
docker exec ac-mysql mysqldump \
  -uroot -p${MYSQL_ROOT_PASSWORD} \
  --all-databases \
  --single-transaction \
  --routines \
  --triggers \
  > backup-$(date +%Y%m%d-%H%M%S).sql

Restore Backup:

# Restore from backup
docker exec -i ac-mysql mysql \
  -uroot -p${MYSQL_ROOT_PASSWORD} \
  < backup-file.sql

Database Optimization:

# Optimize all tables
docker exec ac-mysql mysqlcheck \
  -uroot -p${MYSQL_ROOT_PASSWORD} \
  --all-databases \
  --optimize

Container Updates

Update Containers:

# Pull latest images for database layer
docker-compose -f docker-compose-azerothcore-database.yml pull

# Pull latest images for services layer
docker-compose -f docker-compose-azerothcore-services.yml pull

# Pull latest images for tools layer
docker-compose -f docker-compose-azerothcore-tools.yml pull

# Recreate containers with new images
docker-compose -f docker-compose-azerothcore-database.yml up -d --force-recreate
docker-compose -f docker-compose-azerothcore-services.yml up -d --force-recreate
docker-compose -f docker-compose-azerothcore-tools.yml up -d --force-recreate

# Remove old unused images
docker image prune -a

Update AzerothCore:

# Stop services layer
docker-compose -f docker-compose-azerothcore-services.yml stop

# Update database
docker-compose -f docker-compose-azerothcore-database.yml up ac-db-import

# Restart services layer
docker-compose -f docker-compose-azerothcore-services.yml up -d

Log Management

View Logs:

# Follow worldserver logs
docker logs -f ac-worldserver

# Export logs to file
docker logs ac-worldserver > worldserver.log 2>&1

# Clear old logs (adjust path based on STORAGE_ROOT)
find ${STORAGE_ROOT}/azerothcore/logs -name "*.log" -mtime +30 -delete

Log Rotation (using bind mount):

# Create logrotate config (adjust path based on STORAGE_ROOT)
cat > /etc/logrotate.d/azerothcore <<EOF
${STORAGE_ROOT}/azerothcore/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}
EOF

Backup System

The deployment includes a comprehensive automated backup system with individual database backups, compression, and retention management.

Backup Configuration

Configure via environment variables in docker-compose-azerothcore-database.env:

  • STORAGE_ROOT: Root storage path (default: ./storage)
  • BACKUP_CRON_SCHEDULE: Cron expression (default: "0 3 * * *" - 3 AM daily)
  • BACKUP_RETENTION_DAYS: Days to keep backups (default: 7)
  • HOST_BACKUP_PATH: Local backup storage path (default: ./backups)
  • HOST_BACKUP_SCRIPTS_PATH: Backup scripts path (default: ./scripts)

Note: The backup service operates independently of STORAGE_ROOT and uses dedicated backup paths for database exports.

Backup Features

Individual Database Backups: Separate compressed files for each database Backup Manifests: JSON metadata with timestamps and backup information Automated Compression: Gzip compression for space efficiency Retention Management: Automatic cleanup of old backups External Scripts: Uses external backup/restore scripts for flexibility

Backup Operations

Automatic Backups

The ac-backup container runs continuously and performs scheduled backups:

  • Schedule: Daily at 3:00 AM by default (configurable via BACKUP_CRON_SCHEDULE)
  • Databases: All AzerothCore databases (auth, world, characters)
  • Format: Individual compressed SQL files per database
  • Retention: Automatic cleanup after configured days

Manual Backups

# Execute backup immediately using container
docker exec ac-backup /scripts/backup.sh

# Or run backup script directly (if scripts are accessible)
cd scripts
./backup.sh

# Check backup status and logs
docker logs ac-backup --tail 20

# List available backups
ls -la backups/

Backup Structure

backups/
├── 20250930_181843/                    # Timestamp-based backup directory
│   ├── acore_auth.sql.gz              # Compressed auth database (8KB)
│   ├── acore_world.sql.gz             # Compressed world database (77MB)
│   ├── acore_characters.sql.gz        # Compressed characters database (16KB)
│   └── manifest.json                  # Backup metadata
├── 20250930_120000/                    # Previous backup
└── ...                                 # Additional backups (retention managed)

Backup Metadata

Each backup includes a manifest.json file with backup information:

{
    "timestamp": "20250930_181843",
    "databases": ["acore_auth acore_world acore_characters"],
    "backup_size": "77M",
    "retention_days": 7,
    "mysql_version": "8.0.43"
}

Backup Restoration

Using Restore Script

cd scripts
./restore.sh /path/to/backup/directory/20250930_181843

Manual Restoration

# Restore individual database from compressed backup
gunzip -c backups/20250930_181843/acore_world.sql.gz | \
  docker exec -i ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} acore_world

# Restore all databases from a backup directory
for db in auth world characters; do
  gunzip -c backups/20250930_181843/acore_${db}.sql.gz | \
    docker exec -i ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} acore_${db}
done

Backup Monitoring

# Monitor backup service logs
docker logs ac-backup -f

# Check backup service status
docker ps | grep ac-backup

# Verify recent backups
find backups/ -name "*.sql.gz" -mtime -1 -ls

# Check backup sizes
du -sh backups/*/

Deployment Scripts

The scripts/ directory contains automation tools for deployment, health checking, and cleanup operations.

Available Scripts

Script Purpose Usage
deploy-and-check.sh Automated deployment and health verification ./deploy-and-check.sh [--skip-deploy] [--quick-check]
cleanup.sh Multi-level resource cleanup ./cleanup.sh [--soft|--hard|--nuclear] [--dry-run]
backup.sh Manual database backup ./backup.sh
restore.sh Database restoration ./restore.sh <backup_directory>

Deployment and Health Check Script

The deploy-and-check.sh script provides automated deployment and comprehensive health verification.

Features

Layered Deployment: Deploys database → services → tools in correct order Container Health Validation: Checks all 8 core containers Port Connectivity Tests: Validates all external ports Web Service Verification: HTTP response and content validation Database Validation: Schema and realm configuration checks Comprehensive Reporting: Color-coded status with detailed results

Usage Examples

cd scripts

# Full deployment with health checks
./deploy-and-check.sh

# Health check only (skip deployment)
./deploy-and-check.sh --skip-deploy

# Quick health check (basic tests only)
./deploy-and-check.sh --skip-deploy --quick-check

Cleanup Script

The cleanup.sh script provides safe and comprehensive cleanup options with multiple levels of cleanup intensity.

Cleanup Levels

  • 🟢 Soft (--soft): Stop containers only (preserves data)
  • 🟡 Hard (--hard): Remove containers + networks (preserves volumes/data)
  • 🔴 Nuclear (--nuclear): Complete removal (DESTROYS ALL DATA)

Usage Examples

cd scripts

# Safe cleanup - stop containers only
./cleanup.sh --soft

# Moderate cleanup - remove containers and networks (preserves data)
./cleanup.sh --hard

# Complete cleanup - remove everything (DESTROYS ALL DATA)
./cleanup.sh --nuclear

# See what would happen without doing it
./cleanup.sh --hard --dry-run

# Force cleanup without prompts (for automation)
./cleanup.sh --hard --force

Script Documentation

For complete documentation on each script:

  • Deployment: See scripts/DEPLOYMENT.md
  • Cleanup: See scripts/CLEANUP.md
  • Scripts Overview: See scripts/README.md

Troubleshooting

Common Issues

1. Worldserver Won't Start

Error: "Failed to find map files for starting areas"

Solution: Ensure game data files are properly extracted and placed in the data volume:

# Check if data files exist
docker run --rm -v ac_data:/data alpine ls -la /data/

# Should see: dbc/, maps/, vmaps/, mmaps/ directories

2. Cannot Connect to Realm

Error: Realm list shows but cannot enter world

Solution: Update realm IP address:

docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "
USE acore_auth;
UPDATE realmlist SET address='YOUR_PUBLIC_IP' WHERE id=1;"

3. Database Connection Failed

Error: "Can't connect to MySQL server"

Solution: Check MySQL container and credentials:

# Verify MySQL is running
docker ps | grep ac-mysql

# Test connection
docker exec ac-authserver ping ac-mysql

# Check MySQL logs
docker logs ac-mysql --tail 50

4. Permission Denied Errors

Error: Various permission denied messages

Solution: Containers are configured to run as root to handle NFS permissions. Check volume mount permissions and ensure storage paths are accessible.

Debug Commands

# Check container health
docker inspect ac-mysql | grep -A 10 "Health"

# View network configuration
docker network inspect azerothcore

# Check volume mounts
docker inspect ac-worldserver | grep -A 10 "Mounts"

# Test database connectivity
docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "STATUS;"

# View process list in container
docker top ac-worldserver

# Execute commands in container
docker exec ac-worldserver ls -la /azerothcore/data/

Reset Procedures

Complete Reset:

# Stop all layers
docker-compose -f docker-compose-azerothcore-tools.yml down
docker-compose -f docker-compose-azerothcore-services.yml down
docker-compose -f docker-compose-azerothcore-database.yml down

# Remove all volumes (WARNING: Deletes all data)
docker volume prune -f

# Remove all containers and images
docker system prune -a

# Start fresh (in order)
docker-compose -f docker-compose-azerothcore-database.yml up -d
docker-compose -f docker-compose-azerothcore-services.yml up -d
docker-compose -f docker-compose-azerothcore-tools.yml up -d

Reset Specific Service:

# Reset worldserver only
docker-compose -f docker-compose-azerothcore-services.yml stop ac-worldserver
docker-compose -f docker-compose-azerothcore-services.yml rm -f ac-worldserver
docker-compose -f docker-compose-azerothcore-services.yml up -d ac-worldserver

Security Considerations

Best Practices

  1. Strong Passwords

    • Use complex passwords for MySQL root
    • Avoid default passwords for game accounts
    • Regularly rotate admin credentials
  2. Network Security

    • Use firewall rules to restrict access
    • Consider VPN for admin access
    • Disable SOAP if not needed
  3. File Permissions

    • Restrict access to .env files: chmod 600 *.env
    • Secure backup directories
    • Containers run as root to handle NFS permissions
  4. Regular Updates

    • Keep containers updated
    • Apply security patches promptly
    • Monitor security advisories

Firewall Configuration

# Allow only necessary ports
ufw allow 3784/tcp  # Auth server
ufw allow 8215/tcp  # World server
ufw allow 22/tcp    # SSH (restrict source IP)
ufw enable

Monitoring

# Monitor connection attempts
docker logs ac-authserver | grep -i "failed"

# Check for unusual database queries
docker exec ac-mysql mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "
SHOW PROCESSLIST;"

# Monitor resource usage
docker stats --no-stream

Support and Resources

Official Documentation

Community Resources

Available Services

Service Endpoint Port Purpose
Game Server localhost:8215 8215 World server (game connection)
Auth Server localhost:3784 3784 Authentication server
SOAP API localhost:7778 7778 Server administration API
PHPMyAdmin http://localhost:8081 8081 Database management interface
Keira3 http://localhost:4201 4201 Database editor web UI with API backend
Grafana http://localhost:3001 3001 Monitoring dashboard
InfluxDB localhost:8087 8087 Metrics database
MySQL localhost:64306 64306 Direct database access

Database Credentials

  • Host: localhost:64306
  • User: root
  • Password: azerothcore123 (configurable in environment files)
  • Databases: acore_auth, acore_world, acore_characters

Useful Commands Reference

# Quick status check
docker ps | grep ac-

# Restart database layer
docker-compose -f docker-compose-azerothcore-database.yml restart

# Restart services layer
docker-compose -f docker-compose-azerothcore-services.yml restart

# Restart tools layer
docker-compose -f docker-compose-azerothcore-tools.yml restart

# View database logs
docker-compose -f docker-compose-azerothcore-database.yml logs

# View services logs
docker-compose -f docker-compose-azerothcore-services.yml logs

# View tools logs
docker-compose -f docker-compose-azerothcore-tools.yml logs

# Stop everything (in reverse order)
docker-compose -f docker-compose-azerothcore-tools.yml down
docker-compose -f docker-compose-azerothcore-services.yml down
docker-compose -f docker-compose-azerothcore-database.yml down

# Start everything (in order)
docker-compose -f docker-compose-azerothcore-database.yml up -d
docker-compose -f docker-compose-azerothcore-services.yml up -d
docker-compose -f docker-compose-azerothcore-tools.yml up -d

# Update and restart all layers
docker-compose -f docker-compose-azerothcore-database.yml pull && docker-compose -f docker-compose-azerothcore-database.yml up -d
docker-compose -f docker-compose-azerothcore-services.yml pull && docker-compose -f docker-compose-azerothcore-services.yml up -d
docker-compose -f docker-compose-azerothcore-tools.yml pull && docker-compose -f docker-compose-azerothcore-tools.yml up -d

# Backup database
docker exec ac-mysql mysqldump -uroot -p${MYSQL_ROOT_PASSWORD} --all-databases > backup.sql

# Connect to worldserver console
docker attach ac-worldserver

License and Attribution

Project Licenses

  • AzerothCore: Licensed under AGPL-3.0
  • This Docker Configuration: Provided under MIT License for the configuration files
  • Playerbot Module: Check mod-playerbots for specific licensing

Credits

  • AzerothCore Team: For the core server application
  • coc0nut: For the initial Docker setup approach with Playerbots
  • liyunfan1223: For the Playerbot module
  • Community Contributors: For various modules and improvements

World of Warcraft® and Blizzard Entertainment® are registered trademarks of Blizzard Entertainment, Inc. This project is not affiliated with Blizzard Entertainment.

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Create a Pull Request

Note: This is an unofficial community deployment. Always backup your data before updates or changes.

Languages
Shell 85.8%
Python 11.6%
Go 2.6%