Improve database timeout handling and add local testing setup

- Update database timeout values for better Portainer/NFS compatibility
- Add .env-database-local for local testing with reduced resource requirements
- Create local data directories and backup script validation
- Split compose validation confirms proper service dependency configuration
- Increase MySQL health check timeouts: start_period 60s→120s, timeout 10s→15s
- Extend database wait times: retries 30→60, sleep 5→10 (total 150s→600s)

🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
uprightbass360
2025-09-29 21:14:46 -04:00
parent 0cc56bb246
commit fdd23c7fb7
16 changed files with 2370 additions and 845 deletions

352
.env
View File

@@ -1,352 +0,0 @@
# ==============================================
# AZEROTHCORE DOCKER ENVCHARONMENT CONFIGURATION
# ==============================================
# REQUIRED: All values must be set - no defaults in compose
# ==============================================
# DATABASE CREDENTIALS (REQUIRED)
# ==============================================
MYSQL_ROOT_PASSWORD=azerothcore123
DOCKER_DB_ROOT_PASSWORD=azerothcore123
MYSQL_USER=acore
MYSQL_HOST=ac-mysql
MYSQL_PORT=3306
# Database names
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
# External IP for realm list (use actual server IP, not 'auto')
EXTERNAL_IP=192.168.1.100
# External ports - must be specified
DOCKER_DB_EXTERNAL_PORT=64306
DOCKER_AUTH_EXTERNAL_PORT=3784
DOCKER_WORLD_EXTERNAL_PORT=8215
DOCKER_SOAP_EXTERNAL_PORT=7778
# Bind IPs
BIND_IP=0.0.0.0
SOAP_IP=0.0.0.0
# Internal ports (container side)
AUTH_PORT=3724
WORLD_PORT=8085
SOAP_PORT=7878
RA_PORT=3443
# ==============================================
# PATHS (REQUIRED)
# ==============================================
# Container internal paths
AC_DATA_DIR=/azerothcore/data
AC_LOGS_DIR=/azerothcore/logs
AC_CONFIG_DIR=/azerothcore/env/dist/etc
AC_MODULES_DIR=/azerothcore/modules
AC_BIN_DIR=/azerothcore/env/dist/bin
# Host volume paths (for bind mounts if not using named volumes)
HOST_DATA_PATH=./data
HOST_DB_PATH=/srv/azerothcore/database
HOST_LOGS_PATH=/srv/azerothcore/logs
HOST_CONFIG_PATH=/srv/azerothcore/config
HOST_BACKUP_PATH=./backups
HOST_BACKUP_SCRIPTS_PATH=./backup-scripts
# ==============================================
# VOLUME NAMES (REQUIRED)
# ==============================================
VOLUME_DB_DATA=ac_mysql_data
VOLUME_WORLD_DATA=ac_data
VOLUME_CONFIG=ac_config
VOLUME_LOGS=ac_logs
VOLUME_BACKUP=ac_backup
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
CONTAINER_MYSQL=ac-mysql
CONTAINER_DBINIT=ac-db-init
CONTAINER_DBIMPORT=ac-db-import
CONTAINER_AUTHSERVER=ac-authserver
CONTAINER_WORLDSERVER=ac-worldserver
CONTAINER_ELUNA=ac-eluna
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Deployment mode: local (development) or portainer (production)
DEPLOYMENT_MODE=local
# Storage configuration for Portainer NFS deployments
# Leave empty for local development with named volumes
STORAGE_PATH_CONTAINERS=/nfs/containers
# Use named volumes (true for local, false for Portainer)
USE_NAMED_VOLUMES=true
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# ==============================================
# SERVER CONFIGURATION (REQUIRED)
# ==============================================
# Timezone
TZ=UTC
# Server mode (0 = Normal, 1 = PvP)
GAME_TYPE=0
# Realm configuration
REALM_ID=1
REALM_NAME=AzerothCore
REALM_ZONE=1
REALM_FLAGS=0
REALM_TIMEZONE=1
REALM_ALLOWED_SECURITY_LEVEL=0
REALM_POPULATION=0
REALM_GAMEBUILD=12340
# ==============================================
# PERFORMANCE SETTINGS (REQUIRED)
# ==============================================
# Process settings
PROCESS_PRIORITY=0
USE_PROCESSORS=0
COMPRESSION=1
# Connection limits
MAX_CONNECTIONS=1000
MAX_PLAYERS=100
MAX_OVERSPEED_PINGS=2
# Pool sizes
INNODB_BUFFER_POOL_SIZE=256M
INNODB_LOG_FILE_SIZE=64M
# Timeouts
SOCKET_TIMEOUT_TIME=900000
SESSION_ADD_DELAY=10000
GRID_CLEANUP_DELAY=300000
MAP_UPDATE_INTERVAL=100
# ==============================================
# UPDATE SETTINGS (REQUIRED)
# ==============================================
UPDATES_ENABLE_DATABASES=7
UPDATES_AUTO_SETUP=1
UPDATES_REDUNDANCY=2
UPDATES_ARCHIVED_REDUNDANCY=0
UPDATES_ALLOW_REHASH=1
UPDATES_CLEAN_DEAD_REF_MAX_COUNT=3
# ==============================================
# LOGGING CONFIGURATION (REQUIRED)
# ==============================================
LOG_LEVEL=1
LOG_FILE=
LOG_TIMESTAMP=0
LOG_FILE_LEVEL=0
DB_ERROR_LOG_FILE=DBErrors.log
CHAR_LOG_FILE=
GM_LOG_FILE=
RA_LOG_FILE=
SQL_DRIVER_LOG_FILE=
SQL_DRIVER_QUERY_LOGGING=0
# Logger configuration - Commented out to use worldserver.conf defaults
# APPENDER_CONSOLE_CONFIG=1,2,0
# LOGGER_ROOT_CONFIG=1,Console
# LOGGER_SERVER_CONFIG=1,Console
# ==============================================
# FEATURE FLAGS (REQUIRED)
# ==============================================
# Console settings
CONSOLE_ENABLE=1
# SOAP settings
SOAP_ENABLED=0
# Remote Access settings
RA_ENABLE=0
RA_IP=127.0.0.1
RA_MIN_LEVEL=3
# Close idle connections
CLOSE_IDLE_CONNECTIONS=false
# Skip checks (use with caution)
SKIP_BATTLEGROUND_RELOCATE_CHECK=0
# ==============================================
# BACKUP CONFIGURATION (REQUIRED)
# ==============================================
# Cron schedule
BACKUP_CRON_SCHEDULE=0 3 * * *
# Retention
BACKUP_RETENTION_DAYS=7
# Backup file prefix
BACKUP_FILE_PREFIX=acore_backup
# ==============================================
# DOCKER/PODMAN SETTINGS (REQUIRED)
# ==============================================
# User to run containers (root or specific UID)
DOCKER_USER=root
# Container runtime (docker or podman)
CONTAINER_RUNTIME=podman
# Restart policy
RESTART_POLICY=unless-stopped
# Health check settings
HEALTHCHECK_INTERVAL=30s
HEALTHCHECK_TIMEOUT=10s
HEALTHCHECK_RETRIES=5
HEALTHCHECK_START_PERIOD=60s
# ==============================================
# SECURITY SETTINGS (REQUIRED)
# ==============================================
# Account security
WRONG_PASS_MAX_COUNT=3
WRONG_PASS_BAN_TIME=600
WRONG_PASS_BAN_TYPE=0
BAN_EXPIRY_CHECK_INTERVAL=60
# ==============================================
# GAME RATES (REQUIRED)
# ==============================================
RATE_HEALTH=1
RATE_MANA=1
RATE_XP_KILL=1
RATE_XP_QUEST=1
RATE_XP_EXPLORE=1
RATE_DROP_MONEY=1
RATE_DROP_ITEMS=1
RATE_HONOR=1
RATE_REPUTATION=1
RATE_TALENT=1
# ==============================================
# CHARACTER SETTINGS (REQUIRED)
# ==============================================
CHARACTERS_PER_ACCOUNT=50
CHARACTERS_PER_REALM=10
HEROIC_CHARACTERS_PER_REALM=1
START_PLAYER_LEVEL=1
START_HEROIC_PLAYER_LEVEL=55
START_PLAYER_MONEY=0
START_HEROIC_PLAYER_MONEY=2000
MAX_PLAYER_LEVEL=80
MIN_DUAL_SPEC_LEVEL=40
# ==============================================
# VMAP/MMAP SETTINGS (REQUIRED)
# ==============================================
VMAP_ENABLE_LOS=1
VMAP_ENABLE_HEIGHT=1
VMAP_PET_LOS=1
VMAP_ENABLE_INDOOR_CHECK=1
MMAP_ENABLE_PATH_FINDING=0
# ==============================================
# API KEYS / SECRETS (REQUIRED IF USING FEATURES)
# ==============================================
# Add any API keys or secrets here
# DISCORD_WEBHOOK_URL=
# EXTERNAL_API_KEY=
# MONITORING_TOKEN=
# ==============================================
# CUSTOM MODULE SETTINGS
# ==============================================
# Eluna settings
ELUNA_ENABLED=1
# Playerbot settings
PLAYERBOT_ENABLED=1
PLAYERBOT_MAX_BOTS=40
# Module Management (1 = enabled, 0 = disabled)
MODULE_PLAYERBOTS=1
MODULE_AOE_LOOT=0
MODULE_LEARN_SPELLS=0
MODULE_FIREWORKS=0
MODULE_INDIVIDUAL_PROGRESSION=0
# ==============================================
# WEB INTERFACE SETTINGS
# ==============================================
# External access configuration
# Set EXTERNAL_BASE_URL for custom domain (e.g., https://acore.example.com)
# Leave empty to auto-detect from browser location
EXTERNAL_BASE_URL=
baseUrl=http://localhost
port=4201
url=http://localhost:4201
# PHPMyAdmin settings
PMA_HOST=ac-mysql
PMA_PORT=3306
PMA_USER=acore
PMA_EXTERNAL_PORT=8081
PMA_ARBITRARY=1
PMA_ABSOLUTE_URI=
PMA_UPLOAD_LIMIT=300M
PMA_MEMORY_LIMIT=512M
PMA_MAX_EXECUTION_TIME=600
# Keira3 Database Editor settings
KEIRA3_EXTERNAL_PORT=4201
# CMS Web Interface settings (optional service)
CMS_EXTERNAL_PORT=8001
# Service Configuration Toggles
USE_OFFICIAL_KEIRA3=false
CLIENT_DATA_METHOD=7z
SIMPLIFIED_LOGGING=false
# Grafana settings
GF_EXTERNAL_PORT=3001
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=acore123
GF_SERVER_ROOT_URL=http://localhost:3000
GF_INSTALL_PLUGINS=grafana-piechart-panel
# Security settings
GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION=false
GF_SECURITY_SECRET_KEY=
GF_USERS_ALLOW_SIGN_UP=false
GF_USERS_ALLOW_ORG_CREATE=false
GF_AUTH_ANONYMOUS_ENABLED=false
GF_SERVER_ENABLE_GZIP=true
GF_SECURITY_COOKIE_SECURE=false
GF_SECURITY_COOKIE_SAMESITE=lax
# InfluxDB settings
INFLUXDB_EXTERNAL_PORT=8087
INFLUXDB_INIT_MODE=setup
INFLUXDB_ADMIN_USER=acore
INFLUXDB_ADMIN_PASSWORD=acore123
INFLUXDB_ORG=azerothcore
INFLUXDB_BUCKET=metrics
INFLUXDB_TOKEN=acore-monitoring-token-12345
# Security settings
INFLUXDB_HTTP_AUTH_ENABLED=true
INFLUXDB_HTTP_HTTPS_ENABLED=false
# ==============================================
# END OF CONFIGURATION
# ==============================================

174
.env-core Normal file
View File

@@ -0,0 +1,174 @@
# ==============================================
# AZEROTHCORE DOCKER ENVIRONMENT CONFIGURATION
# ==============================================
# REQUIRED: All values must be set - no defaults in compose
# ==============================================
# DATABASE CREDENTIALS (REQUIRED)
# ==============================================
MYSQL_ROOT_PASSWORD=azerothcore123
# Database connection settings
MYSQL_HOST=ac-mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_ROOT_HOST=%
# Database names
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
# Database wait settings
DB_WAIT_RETRIES=30
DB_WAIT_SLEEP=5
# ==============================================
# DOCKER IMAGES (REQUIRED)
# ==============================================
# AzerothCore images
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
AC_AUTHSERVER_IMAGE=acore/ac-wotlk-authserver:14.0.0-dev
AC_WORLDSERVER_IMAGE=acore/ac-wotlk-worldserver:14.0.0-dev
AC_ELUNA_IMAGE=acore/eluna-ts:master
# Base images
MYSQL_IMAGE=mysql:8.0
ALPINE_IMAGE=alpine:latest
ALPINE_GIT_IMAGE=alpine/git:latest
# ==============================================
# IMAGE PULL POLICY (REQUIRED)
# ==============================================
# Control when Docker pulls images
# Options: always, never, missing, if_not_present
# - always: Always pull the latest image (slower, ensures latest)
# - never: Never pull, use only local images (fastest, may fail if image missing)
# - missing/if_not_present: Only pull if image doesn't exist locally (recommended)
IMAGE_PULL_POLICY=if_not_present
# ==============================================
# DEPLOYMENT OPTIMIZATION (REQUIRED)
# ==============================================
# Skip client data download if data already exists (speeds up deployment)
SKIP_CLIENT_DATA_IF_EXISTS=true
# Parallel container startup (reduces deployment time)
ENABLE_PARALLEL_STARTUP=true
# ==============================================
# MYSQL CONFIGURATION (REQUIRED)
# ==============================================
# MySQL server settings
MYSQL_CHARACTER_SET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
MYSQL_MAX_CONNECTIONS=1000
MYSQL_INNODB_BUFFER_POOL_SIZE=256M
MYSQL_INNODB_LOG_FILE_SIZE=64M
# MySQL health check settings
MYSQL_HEALTHCHECK_INTERVAL=15s
MYSQL_HEALTHCHECK_TIMEOUT=10s
MYSQL_HEALTHCHECK_RETRIES=20
MYSQL_HEALTHCHECK_START_PERIOD=60s
# ==============================================
# CONTAINER HEALTH CHECKS (REQUIRED)
# ==============================================
# Auth server health check
AUTH_HEALTHCHECK_INTERVAL=30s
AUTH_HEALTHCHECK_TIMEOUT=10s
AUTH_HEALTHCHECK_RETRIES=3
AUTH_HEALTHCHECK_START_PERIOD=60s
# World server health check
WORLD_HEALTHCHECK_INTERVAL=30s
WORLD_HEALTHCHECK_TIMEOUT=10s
WORLD_HEALTHCHECK_RETRIES=3
WORLD_HEALTHCHECK_START_PERIOD=120s
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
# External ports - must be specified
DOCKER_DB_EXTERNAL_PORT=64306
DOCKER_AUTH_EXTERNAL_PORT=3784
DOCKER_WORLD_EXTERNAL_PORT=8215
DOCKER_SOAP_EXTERNAL_PORT=7778
# Internal ports (container side)
AUTH_PORT=3724
WORLD_PORT=8085
SOAP_PORT=7878
# ==============================================
# PATHS (REQUIRED)
# ==============================================
# Host volume paths (for bind mounts if not using named volumes)
HOST_BACKUP_PATH=./backups
HOST_BACKUP_SCRIPTS_PATH=./backup-scripts
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Deployment mode: local (development) or portainer (production)
DEPLOYMENT_MODE=local
# Storage configuration for Portainer NFS deployments
# Leave empty for local development with named volumes
STORAGE_PATH=/nfs/containers/azerothcore
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
# Core service container names
CONTAINER_MYSQL_INIT=ac-mysql-init
CONTAINER_MYSQL=ac-mysql
CONTAINER_DB_INIT=ac-db-init
CONTAINER_DB_IMPORT=ac-db-import
CONTAINER_AUTHSERVER=ac-authserver
CONTAINER_WORLDSERVER=ac-worldserver
CONTAINER_CLIENT_DATA=ac-client-data
CONTAINER_ELUNA=ac-eluna
CONTAINER_MODULES=ac-modules
CONTAINER_BACKUP=ac-backup
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# ==============================================
# SERVER CONFIGURATION (REQUIRED)
# ==============================================
# Timezone
TZ=UTC
# ==============================================
# BACKUP CONFIGURATION (REQUIRED)
# ==============================================
# Cron schedule
BACKUP_CRON_SCHEDULE=0 3 * * *
# Retention
BACKUP_RETENTION_DAYS=7
# ==============================================
# CUSTOM MODULE SETTINGS
# ==============================================
# Playerbot settings
PLAYERBOT_ENABLED=1
PLAYERBOT_MAX_BOTS=40
# Module Management (1 = enabled, 0 = disabled)
MODULE_PLAYERBOTS=1
MODULE_AOE_LOOT=0
MODULE_LEARN_SPELLS=0
MODULE_FIREWORKS=0
MODULE_INDIVIDUAL_PROGRESSION=0
# ==============================================
# END OF CONFIGURATION
# ==============================================

98
.env-database Normal file
View File

@@ -0,0 +1,98 @@
# ==============================================
# AZEROTHCORE DATABASE LAYER ENVIRONMENT
# ==============================================
# Environment variables for MySQL, database init, import, and backup
# ==============================================
# DATABASE CREDENTIALS (REQUIRED)
# ==============================================
MYSQL_ROOT_PASSWORD=azerothcore123
# Database connection settings
MYSQL_HOST=ac-mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_ROOT_HOST=%
# Database names
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
# Database wait settings - Increased for Portainer/NFS deployments
DB_WAIT_RETRIES=60
DB_WAIT_SLEEP=10
# ==============================================
# DOCKER IMAGES (REQUIRED)
# ==============================================
# Database layer images
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
MYSQL_IMAGE=mysql:8.0
ALPINE_IMAGE=alpine:latest
# ==============================================
# IMAGE PULL POLICY (REQUIRED)
# ==============================================
IMAGE_PULL_POLICY=if_not_present
# ==============================================
# MYSQL CONFIGURATION (REQUIRED)
# ==============================================
# MySQL server settings
MYSQL_CHARACTER_SET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
MYSQL_MAX_CONNECTIONS=1000
MYSQL_INNODB_BUFFER_POOL_SIZE=256M
MYSQL_INNODB_LOG_FILE_SIZE=64M
# MySQL health check settings - Moderately increased for Portainer/NFS deployments
MYSQL_HEALTHCHECK_INTERVAL=20s
MYSQL_HEALTHCHECK_TIMEOUT=15s
MYSQL_HEALTHCHECK_RETRIES=25
MYSQL_HEALTHCHECK_START_PERIOD=120s
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
# External database port
DOCKER_DB_EXTERNAL_PORT=64306
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Storage configuration for Portainer NFS deployments
STORAGE_PATH=/nfs/containers/azerothcore
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
# Database layer container names
CONTAINER_MYSQL=ac-mysql
CONTAINER_DB_INIT=ac-db-init
CONTAINER_DB_IMPORT=ac-db-import
CONTAINER_BACKUP=ac-backup
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# ==============================================
# BACKUP CONFIGURATION (REQUIRED)
# ==============================================
# Host volume paths for backup
HOST_BACKUP_PATH=./backups
HOST_BACKUP_SCRIPTS_PATH=./backup-scripts
# Backup settings
BACKUP_CRON_SCHEDULE=0 3 * * *
BACKUP_RETENTION_DAYS=7
# ==============================================
# SERVER CONFIGURATION (REQUIRED)
# ==============================================
# Timezone
TZ=UTC

98
.env-database-local Normal file
View File

@@ -0,0 +1,98 @@
# ==============================================
# AZEROTHCORE DATABASE LAYER ENVIRONMENT - LOCAL TESTING
# ==============================================
# Environment variables for local Docker testing
# ==============================================
# DATABASE CREDENTIALS (REQUIRED)
# ==============================================
MYSQL_ROOT_PASSWORD=azerothcore123
# Database connection settings
MYSQL_HOST=ac-mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_ROOT_HOST=%
# Database names
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
# Database wait settings - Conservative for local testing
DB_WAIT_RETRIES=30
DB_WAIT_SLEEP=3
# ==============================================
# DOCKER IMAGES (REQUIRED)
# ==============================================
# Database layer images
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
MYSQL_IMAGE=mysql:8.0
ALPINE_IMAGE=alpine:latest
# ==============================================
# IMAGE PULL POLICY (REQUIRED)
# ==============================================
IMAGE_PULL_POLICY=if_not_present
# ==============================================
# MYSQL CONFIGURATION (REQUIRED)
# ==============================================
# MySQL server settings
MYSQL_CHARACTER_SET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
MYSQL_MAX_CONNECTIONS=100
MYSQL_INNODB_BUFFER_POOL_SIZE=128M
MYSQL_INNODB_LOG_FILE_SIZE=32M
# MySQL health check settings - Local testing values
MYSQL_HEALTHCHECK_INTERVAL=10s
MYSQL_HEALTHCHECK_TIMEOUT=5s
MYSQL_HEALTHCHECK_RETRIES=10
MYSQL_HEALTHCHECK_START_PERIOD=30s
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
# External database port
DOCKER_DB_EXTERNAL_PORT=64306
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Storage configuration for local testing
STORAGE_PATH=./local-data
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
# Database layer container names
CONTAINER_MYSQL=ac-mysql
CONTAINER_DB_INIT=ac-db-init
CONTAINER_DB_IMPORT=ac-db-import
CONTAINER_BACKUP=ac-backup
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# ==============================================
# BACKUP CONFIGURATION (REQUIRED)
# ==============================================
# Host volume paths for backup
HOST_BACKUP_PATH=./backups
HOST_BACKUP_SCRIPTS_PATH=./backup-scripts
# Backup settings
BACKUP_CRON_SCHEDULE=0 3 * * *
BACKUP_RETENTION_DAYS=7
# ==============================================
# SERVER CONFIGURATION (REQUIRED)
# ==============================================
# Timezone
TZ=UTC

51
.env-optional Normal file
View File

@@ -0,0 +1,51 @@
# ==============================================
# AZEROTHCORE OPTIONAL SERVICES ENVIRONMENT
# ==============================================
# Environment variables for modules and monitoring services
# ==============================================
# DOCKER IMAGES (REQUIRED)
# ==============================================
# Optional service images
AC_ELUNA_IMAGE=acore/eluna-ts:master
ALPINE_GIT_IMAGE=alpine/git:latest
# ==============================================
# IMAGE PULL POLICY (REQUIRED)
# ==============================================
IMAGE_PULL_POLICY=if_not_present
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Storage configuration (must match other layers)
STORAGE_PATH=/nfs/containers/azerothcore
# Deployment mode
DEPLOYMENT_MODE=local
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
# Optional service container names
CONTAINER_ELUNA=ac-eluna
CONTAINER_MODULES=ac-modules
# Reference to core services (for external linking)
CONTAINER_WORLDSERVER=ac-worldserver
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
# Network must already exist from database layer
NETWORK_NAME=azerothcore
# ==============================================
# CUSTOM MODULE SETTINGS
# ==============================================
# Module Management (1 = enabled, 0 = disabled)
MODULE_PLAYERBOTS=1
MODULE_AOE_LOOT=0
MODULE_LEARN_SPELLS=0
MODULE_FIREWORKS=0
MODULE_INDIVIDUAL_PROGRESSION=0

89
.env-services Normal file
View File

@@ -0,0 +1,89 @@
# ==============================================
# AZEROTHCORE CORE SERVICES ENVIRONMENT
# ==============================================
# Environment variables for auth server, world server, and client data
# ==============================================
# DATABASE CONNECTION (REQUIRED)
# ==============================================
# Connect to database layer (must match database layer settings)
MYSQL_HOST=ac-mysql
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_ROOT_PASSWORD=azerothcore123
# Database names (must match database layer)
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
# ==============================================
# DOCKER IMAGES (REQUIRED)
# ==============================================
# Core service images
AC_AUTHSERVER_IMAGE=acore/ac-wotlk-authserver:14.0.0-dev
AC_WORLDSERVER_IMAGE=acore/ac-wotlk-worldserver:14.0.0-dev
ALPINE_IMAGE=alpine:latest
# ==============================================
# IMAGE PULL POLICY (REQUIRED)
# ==============================================
IMAGE_PULL_POLICY=if_not_present
# ==============================================
# CONTAINER HEALTH CHECKS (REQUIRED)
# ==============================================
# Auth server health check
AUTH_HEALTHCHECK_INTERVAL=30s
AUTH_HEALTHCHECK_TIMEOUT=10s
AUTH_HEALTHCHECK_RETRIES=3
AUTH_HEALTHCHECK_START_PERIOD=60s
# World server health check
WORLD_HEALTHCHECK_INTERVAL=30s
WORLD_HEALTHCHECK_TIMEOUT=10s
WORLD_HEALTHCHECK_RETRIES=3
WORLD_HEALTHCHECK_START_PERIOD=120s
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
# External ports for game services
DOCKER_AUTH_EXTERNAL_PORT=3784
DOCKER_WORLD_EXTERNAL_PORT=8215
DOCKER_SOAP_EXTERNAL_PORT=7778
# Internal ports (container side)
AUTH_PORT=3724
WORLD_PORT=8085
SOAP_PORT=7878
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Storage configuration (must match database layer)
STORAGE_PATH=/nfs/containers/azerothcore
# ==============================================
# CONTAINER NAMES (REQUIRED)
# ==============================================
# Core service container names
CONTAINER_AUTHSERVER=ac-authserver
CONTAINER_WORLDSERVER=ac-worldserver
CONTAINER_CLIENT_DATA=ac-client-data
# Database container name (for external linking)
CONTAINER_MYSQL=ac-mysql
# ==============================================
# NETWORK SETTINGS (REQUIRED)
# ==============================================
# Network must already exist from database layer
NETWORK_NAME=azerothcore
# ==============================================
# CUSTOM MODULE SETTINGS
# ==============================================
# Playerbot settings
PLAYERBOT_ENABLED=1
PLAYERBOT_MAX_BOTS=40

89
.env-tools Normal file
View File

@@ -0,0 +1,89 @@
# ==============================================
# AZEROTHCORE TOOLS ENVIRONMENT CONFIGURATION
# ==============================================
# Configuration for web interfaces and monitoring tools
# This connects to the core AzerothCore database
# ==============================================
# DATABASE CONNECTION (REQUIRED)
# ==============================================
# Connect to core AzerothCore database
DOCKER_DB_ROOT_PASSWORD=azerothcore123
# Database connection for tools (connects to core stack)
# Use host.docker.internal for Docker Desktop or actual server IP
MYSQL_HOST=host.docker.internal
MYSQL_PORT=64306
# ==============================================
# TOOL STORAGE PATHS (REQUIRED)
# ==============================================
# Storage for tools (separate from core stack)
STORAGE_PATH_TOOLS=/nfs/containers-tools
# ==============================================
# NETWORK CONFIGURATION (REQUIRED)
# ==============================================
TOOLS_NETWORK_NAME=azerothcore-tools
TOOLS_NETWORK_SUBNET=172.21.0.0/16
TOOLS_NETWORK_GATEWAY=172.21.0.1
# ==============================================
# WEB INTERFACE PORTS (REQUIRED)
# ==============================================
# PHPMyAdmin settings
PMA_HOST=host.docker.internal
PMA_PORT=64306
PMA_USER=root
PMA_EXTERNAL_PORT=8081
PMA_ARBITRARY=1
PMA_ABSOLUTE_URI=
PMA_UPLOAD_LIMIT=300M
PMA_MEMORY_LIMIT=512M
PMA_MAX_EXECUTION_TIME=600
# Keira3 Database Editor settings
KEIRA3_EXTERNAL_PORT=4201
KEIRA_DATABASE_HOST=host.docker.internal
KEIRA_DATABASE_PORT=64306
# Grafana settings
GF_EXTERNAL_PORT=3001
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=acore123
GF_SERVER_ROOT_URL=http://localhost:3001
GF_INSTALL_PLUGINS=grafana-piechart-panel
# Security settings
GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION=false
GF_SECURITY_SECRET_KEY=
GF_USERS_ALLOW_SIGN_UP=false
GF_USERS_ALLOW_ORG_CREATE=false
GF_AUTH_ANONYMOUS_ENABLED=false
GF_SERVER_ENABLE_GZIP=true
GF_SECURITY_COOKIE_SECURE=false
GF_SECURITY_COOKIE_SAMESITE=lax
# InfluxDB settings
INFLUXDB_EXTERNAL_PORT=8087
INFLUXDB_INIT_MODE=setup
INFLUXDB_ADMIN_USER=acore
INFLUXDB_ADMIN_PASSWORD=acore123
INFLUXDB_ORG=azerothcore
INFLUXDB_BUCKET=metrics
INFLUXDB_TOKEN=acore-monitoring-token-12345
# Security settings
INFLUXDB_HTTP_AUTH_ENABLED=true
INFLUXDB_HTTP_HTTPS_ENABLED=false
# ==============================================
# DEPLOYMENT CONFIGURATION (REQUIRED)
# ==============================================
# Deployment mode for tools
DEPLOYMENT_MODE=tools
# Use separate storage for tools
USE_NAMED_VOLUMES=false
# ==============================================
# END OF TOOLS CONFIGURATION
# ==============================================

152
DEPLOYMENT_GUIDE.md Normal file
View File

@@ -0,0 +1,152 @@
# AzerothCore Deployment Guide
## 🚀 Quick Deployment Options
### **Option 1: Fast Deployment (Use Cached Images)**
Set this in `.env-core` for fastest deployment:
```bash
IMAGE_PULL_POLICY=if_not_present
SKIP_CLIENT_DATA_IF_EXISTS=true
ENABLE_PARALLEL_STARTUP=true
```
### **Option 2: Always Fresh Images**
For production deployments with latest images:
```bash
IMAGE_PULL_POLICY=always
SKIP_CLIENT_DATA_IF_EXISTS=false
ENABLE_PARALLEL_STARTUP=true
```
### **Option 3: Offline Deployment**
If images are already present locally:
```bash
IMAGE_PULL_POLICY=never
SKIP_CLIENT_DATA_IF_EXISTS=true
ENABLE_PARALLEL_STARTUP=true
```
## 📊 Image Pull Policy Options
| Policy | Speed | Reliability | Use Case |
|--------|-------|-------------|----------|
| `if_not_present` | ⚡ Fast | ✅ Good | **Recommended** - Best balance |
| `always` | 🐌 Slow | ✅ Best | Production with latest images |
| `never` | ⚡ Fastest | ⚠️ Risk | Offline or cached deployments |
## 🛠️ Pre-deployment Steps (Optional)
To avoid Portainer timeouts, pre-pull images manually:
```bash
# Core AzerothCore images (large downloads)
docker pull acore/ac-wotlk-db-import:14.0.0-dev
docker pull acore/ac-wotlk-authserver:14.0.0-dev
docker pull acore/ac-wotlk-worldserver:14.0.0-dev
docker pull acore/eluna-ts:master
# Base images (usually cached)
docker pull mysql:8.0
docker pull alpine:latest
docker pull alpine/git:latest
```
## 🏗️ Staged Deployment Strategy
If experiencing timeouts, deploy in stages:
### **Stage 1: Database Layer**
Deploy only MySQL and database initialization:
```yaml
services:
ac-mysql-init: ...
ac-mysql: ...
ac-db-init: ...
ac-db-import: ...
```
### **Stage 2: Core Services**
Add authentication and world servers:
```yaml
services:
ac-authserver: ...
ac-client-data: ...
ac-worldserver: ...
```
### **Stage 3: Optional Services**
Add monitoring and modules:
```yaml
services:
ac-eluna: ...
ac-modules: ...
ac-backup: ...
```
## 🎯 Troubleshooting Deployment Issues
### **504 Gateway Timeout in Portainer**
- **Cause**: Large image downloads or client data download (15GB)
- **Solutions**:
1. Set `IMAGE_PULL_POLICY=if_not_present`
2. Pre-pull images manually
3. Use staged deployment
4. Increase Portainer timeout settings
### **Container "Already Exists" Errors**
- **Cause**: Previous deployment attempts left containers
- **Solution**: Remove old containers first:
```bash
docker container prune -f
docker volume prune -f
```
### **Client Data Download Timeout**
- **Cause**: 15GB download takes time
- **Solutions**:
1. Set `SKIP_CLIENT_DATA_IF_EXISTS=true`
2. Pre-download data manually
3. Use faster internet connection
## 📋 Environment Variables for Speed Optimization
```bash
# Image handling
IMAGE_PULL_POLICY=if_not_present
# Deployment optimization
SKIP_CLIENT_DATA_IF_EXISTS=true
ENABLE_PARALLEL_STARTUP=true
# Reduce health check intervals for faster startup
MYSQL_HEALTHCHECK_INTERVAL=5s
MYSQL_HEALTHCHECK_TIMEOUT=3s
AUTH_HEALTHCHECK_INTERVAL=10s
WORLD_HEALTHCHECK_INTERVAL=15s
```
## 🚨 Production vs Development Settings
### **Development (Fast Deployment)**
```bash
IMAGE_PULL_POLICY=if_not_present
SKIP_CLIENT_DATA_IF_EXISTS=true
MYSQL_HEALTHCHECK_INTERVAL=5s
```
### **Production (Reliable Deployment)**
```bash
IMAGE_PULL_POLICY=always
SKIP_CLIENT_DATA_IF_EXISTS=false
MYSQL_HEALTHCHECK_INTERVAL=15s
```
## 📊 Expected Deployment Times
| Configuration | First Deploy | Subsequent Deploys |
|---------------|--------------|-------------------|
| Fast (cached) | 5-10 minutes | 2-3 minutes |
| Standard | 15-20 minutes | 5-8 minutes |
| Always pull | 20-30 minutes | 15-20 minutes |
*Times vary based on internet speed and server performance*

178
STAGED_DEPLOYMENT_GUIDE.md Normal file
View File

@@ -0,0 +1,178 @@
# AzerothCore Staged Deployment Guide
## 🚀 Three-Layer Deployment Strategy
The AzerothCore setup has been split into three logical layers for faster, more reliable deployments:
1. **Database Layer** - MySQL, database initialization, import, and backup
2. **Core Services Layer** - Authentication server, world server, and client data
3. **Optional Services Layer** - Modules and monitoring services
## 📋 Deployment Order
### **Stage 1: Database Layer** ⭐ **DEPLOY FIRST**
```bash
File: docker-compose-azerothcore-database.yml
Env: .env-database
```
**Services:**
- `ac-mysql-init` - Fixes NFS permissions
- `ac-mysql` - MySQL database server
- `ac-db-init` - Creates AzerothCore databases
- `ac-db-import` - Imports database schema and data
- `ac-backup` - Automated database backups
**Expected Time:** 5-10 minutes
### **Stage 2: Core Services Layer** ⭐ **DEPLOY SECOND**
```bash
File: docker-compose-azerothcore-services.yml
Env: .env-services
```
**Services:**
- `ac-client-data` - Downloads 15GB game data (cached after first run)
- `ac-authserver` - Authentication server
- `ac-worldserver` - Game world server with Playerbots
**Expected Time:** 15-20 minutes (first run), 3-5 minutes (subsequent)
### **Stage 3: Optional Services Layer** ⭐ **DEPLOY THIRD**
```bash
File: docker-compose-azerothcore-optional.yml
Env: .env-optional
```
**Services:**
- `ac-eluna` - Lua scripting engine
- `ac-modules` - Module management and installation
**Expected Time:** 2-3 minutes
## 🛠️ Portainer Deployment Steps
### **Step 1: Deploy Database Layer**
1. **Create Stack in Portainer:**
- Name: `azerothcore-database`
- Repository: Select your repository
- Compose file: `docker-compose-azerothcore-database.yml`
- Environment file: `.env-database`
2. **Wait for Completion:**
- Watch logs for "Database import complete!"
- Verify MySQL health check is green
- Should complete in 5-10 minutes
### **Step 2: Deploy Core Services Layer**
1. **Create Stack in Portainer:**
- Name: `azerothcore-services`
- Repository: Select your repository
- Compose file: `docker-compose-azerothcore-services.yml`
- Environment file: `.env-services`
2. **Wait for Completion:**
- Watch for "Game data setup complete!"
- Verify auth and world servers are healthy
- First run: 15-20 minutes, subsequent: 3-5 minutes
### **Step 3: Deploy Optional Services Layer**
1. **Create Stack in Portainer:**
- Name: `azerothcore-optional`
- Repository: Select your repository
- Compose file: `docker-compose-azerothcore-optional.yml`
- Environment file: `.env-optional`
2. **Wait for Completion:**
- Should complete quickly (2-3 minutes)
## ✅ Verification Steps
### **After Database Layer:**
```bash
# Check MySQL is running
docker exec ac-mysql mysql -u root -pazerothcore123 -e "SHOW DATABASES;"
# Expected output should include:
# - acore_auth
# - acore_world
# - acore_characters
```
### **After Core Services:**
```bash
# Check auth server
docker logs ac-authserver | tail -10
# Check world server
docker logs ac-worldserver | tail -10
# Look for "AzerothCore ready..." message
```
### **After Optional Services:**
```bash
# Check modules
docker exec ac-modules ls -la /modules
# Should show mod-playerbots directory
```
## 🔧 Configuration Notes
### **Cross-Layer Dependencies:**
- All layers share the same **network**: `azerothcore`
- All layers use the same **storage path**: `/nfs/containers/azerothcore`
- Services layer connects to database via **external_links**
### **Environment Variable Consistency:**
- Database credentials must match across all layers
- Container names must be consistent for external linking
- Network name must be identical
### **Image Pull Optimization:**
All layers use `IMAGE_PULL_POLICY=if_not_present` for fast deployment.
## 🚨 Troubleshooting
### **Database Layer Issues:**
- **MySQL won't start**: Check NFS permissions and storage path
- **Database import fails**: Check container logs for database connection errors
- **Backup fails**: Verify backup scripts directory exists
### **Core Services Issues:**
- **Auth server can't connect**: Verify database layer is healthy first
- **Client data download timeout**: Check internet connection, may take 30+ minutes
- **World server fails**: Ensure client data completed successfully
### **Optional Services Issues:**
- **Modules won't install**: Check git connectivity and storage permissions
- **Eluna won't start**: Verify world server is running first
## 🎯 Benefits of Staged Deployment
1. **Faster Individual Deployments** - Each layer deploys in 2-10 minutes vs 20-30 minutes
2. **Better Error Isolation** - Problems are contained to specific layers
3. **Selective Updates** - Update only the layer that changed
4. **Reduced Portainer Timeouts** - No more 504 Gateway Timeout errors
5. **Easier Debugging** - Clear separation of concerns
## 📊 Deployment Time Comparison
| Method | First Deploy | Update Deploy | Risk |
|--------|--------------|---------------|------|
| **Monolithic** | 20-30 min | 15-20 min | High timeout risk |
| **Staged** | 10-15 min total | 3-8 min per layer | Low timeout risk |
## 🔄 Update Strategy
To update a specific layer:
1. Stop only that layer's stack
2. Update the compose file or environment variables
3. Redeploy just that layer
4. Other layers continue running uninterrupted
This approach provides much better reliability and faster deployment times!

190
UNUSED_ENV_VARIABLES.md Normal file
View File

@@ -0,0 +1,190 @@
# Unused Environment Variables Documentation
This document lists all environment variables that were removed from `.env-core` because they are not used by the current Docker Compose setup.
**Total removed**: 117 variables (72% of original configuration)
## 🗄️ Database Configuration (Not Used in Docker Compose)
```bash
AC_LOG_LEVEL_IMPORT=1
AC_LOG_LEVEL_AUTH=1
AC_LOG_LEVEL_WORLD=2
AC_UPDATES_ENABLE_DATABASES_IMPORT=7
AC_UPDATES_ENABLE_DATABASES_SERVERS=0
AC_UPDATES_AUTO_SETUP=1
AC_LOGGER_ROOT_CONFIG=1,Console
AC_LOGGER_SERVER_CONFIG=1,Console
AC_APPENDER_CONSOLE_CONFIG=1,2,0
AC_CLOSE_IDLE_CONNECTIONS=false
```
## 🌐 Network & Connection Settings (Not Used in Docker Compose)
```bash
EXTERNAL_IP=127.0.0.1
BIND_IP=0.0.0.0
SOAP_IP=0.0.0.0
RA_PORT=3443
AC_BIND_IP=0.0.0.0
AC_SOAP_PORT=7878
AC_PROCESS_PRIORITY=0
```
## 📁 Path Configuration (Not Used in Docker Compose)
```bash
AC_DATA_DIR=/azerothcore/data
AC_LOGS_DIR=/azerothcore/logs
AC_CONFIG_DIR=/azerothcore/env/dist/etc
AC_MODULES_DIR=/azerothcore/modules
AC_BIN_DIR=/azerothcore/env/dist/bin
HOST_DATA_PATH=./data
HOST_DB_PATH=/srv/azerothcore/database
HOST_LOGS_PATH=/srv/azerothcore/logs
HOST_CONFIG_PATH=/srv/azerothcore/config
```
## 💾 Volume Names (Not Used in Docker Compose)
```bash
VOLUME_DB_DATA=ac_mysql_data
VOLUME_WORLD_DATA=ac_data
VOLUME_CONFIG=ac_config
VOLUME_LOGS=ac_logs
VOLUME_BACKUP=ac_backup
```
## 📥 Client Data Settings (Not Used in Docker Compose)
```bash
CLIENT_DATA_REPO=wowgaming/client-data
CLIENT_DATA_FALLBACK_VERSION=v16
CLIENT_DATA_REQUIRED_DIRS=maps vmaps mmaps dbc
```
## 🎮 Game Server Configuration (Potentially Used by AzerothCore)
```bash
GAME_TYPE=0
REALM_ID=1
REALM_NAME=AzerothCore
REALM_ZONE=1
REALM_FLAGS=0
REALM_TIMEZONE=1
REALM_ALLOWED_SECURITY_LEVEL=0
REALM_POPULATION=0
REALM_GAMEBUILD=12340
```
## ⚡ Performance Settings (Not Used in Docker Compose)
```bash
PROCESS_PRIORITY=0
USE_PROCESSORS=0
COMPRESSION=1
MAX_CONNECTIONS=1000
MAX_PLAYERS=100
MAX_OVERSPEED_PINGS=2
INNODB_BUFFER_POOL_SIZE=256M
INNODB_LOG_FILE_SIZE=64M
SOCKET_TIMEOUT_TIME=900000
SESSION_ADD_DELAY=10000
GRID_CLEANUP_DELAY=300000
MAP_UPDATE_INTERVAL=100
```
## 🔄 Update Settings (Not Used in Docker Compose)
```bash
UPDATES_ENABLE_DATABASES=7
UPDATES_AUTO_SETUP=1
UPDATES_REDUNDANCY=2
UPDATES_ARCHIVED_REDUNDANCY=0
UPDATES_ALLOW_REHASH=1
UPDATES_CLEAN_DEAD_REF_MAX_COUNT=3
```
## 📝 Logging Configuration (Not Used in Docker Compose)
```bash
LOG_LEVEL=1
LOG_FILE=
LOG_TIMESTAMP=0
LOG_FILE_LEVEL=0
DB_ERROR_LOG_FILE=DBErrors.log
CHAR_LOG_FILE=
GM_LOG_FILE=
RA_LOG_FILE=
SQL_DRIVER_LOG_FILE=
SQL_DRIVER_QUERY_LOGGING=0
```
## 🔧 Feature Flags (Potentially Used by AzerothCore)
```bash
CONSOLE_ENABLE=1
SOAP_ENABLED=0
RA_ENABLE=0
RA_IP=127.0.0.1
RA_MIN_LEVEL=3
CLOSE_IDLE_CONNECTIONS=false
SKIP_BATTLEGROUND_RELOCATE_CHECK=0
```
## 💰 Backup Configuration (Not Used in Docker Compose)
```bash
BACKUP_FILE_PREFIX=acore_backup
```
## 🔒 Security Settings (Potentially Used by AzerothCore)
```bash
WRONG_PASS_MAX_COUNT=3
WRONG_PASS_BAN_TIME=600
WRONG_PASS_BAN_TYPE=0
BAN_EXPIRY_CHECK_INTERVAL=60
```
## 📈 Game Rates (Potentially Used by AzerothCore)
```bash
RATE_HEALTH=1
RATE_MANA=1
RATE_XP_KILL=1
RATE_XP_QUEST=1
RATE_XP_EXPLORE=1
RATE_DROP_MONEY=1
RATE_DROP_ITEMS=1
RATE_HONOR=1
RATE_REPUTATION=1
RATE_TALENT=1
```
## 👤 Character Settings (Potentially Used by AzerothCore)
```bash
CHARACTERS_PER_ACCOUNT=50
CHARACTERS_PER_REALM=10
HEROIC_CHARACTERS_PER_REALM=1
START_PLAYER_LEVEL=1
START_HEROIC_PLAYER_LEVEL=55
START_PLAYER_MONEY=0
START_HEROIC_PLAYER_MONEY=2000
MAX_PLAYER_LEVEL=80
MIN_DUAL_SPEC_LEVEL=40
```
## 🗺️ VMAP/MMAP Settings (Potentially Used by AzerothCore)
```bash
VMAP_ENABLE_LOS=1
VMAP_ENABLE_HEIGHT=1
VMAP_PET_LOS=1
VMAP_ENABLE_INDOOR_CHECK=1
MMAP_ENABLE_PATH_FINDING=0
```
## 🔌 Module Settings (Not Used in Docker Compose)
```bash
ELUNA_ENABLED=1
```
---
## Notes
**Categories marked "Potentially Used by AzerothCore"** may be used by the AzerothCore server configuration files (worldserver.conf, authserver.conf) even though they're not referenced in the Docker Compose file. These might be substituted into configuration files during container startup.
**Categories marked "Not Used in Docker Compose"** are definitely not used by the current Docker setup and can be safely removed.
If you need to restore any of these variables in the future, they can be found in this documentation file.
**Removal Date**: September 29, 2025
**Reason**: Environment cleanup - variables not referenced in docker-compose-azerothcore-core.yml

View File

@@ -0,0 +1,525 @@
# ==============================================
# AZEROTHCORE UNIFIED DOCKER COMPOSE
# ==============================================
# Compatible with both local development and Portainer deployment
# Set DEPLOYMENT_MODE=local|portainer in .env file
services:
# Step 0: Fix MySQL volume permissions
ac-mysql-init:
image: ${ALPINE_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_MYSQL_INIT}
user: "0:0"
volumes:
- ${STORAGE_PATH}/mysql:/mysql-data
command:
- sh
- -c
- |
echo "🔧 Initializing MySQL data directory permissions..."
# Create the directory structure
mkdir -p /mysql-data
# Set broad permissions to ensure MySQL can access
chmod 777 /mysql-data
# Create a marker file to indicate initialization is complete
touch /mysql-data/.permissions-fixed
echo "✅ MySQL data directory permissions initialized"
restart: "no"
networks:
- azerothcore
# Step 1: Standard MySQL database
ac-mysql:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_MYSQL}
user: "0:0" # Run as root to handle NFS permissions
depends_on:
- ac-mysql-init
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST}'
MYSQL_ALLOW_EMPTY_PASSWORD: no
ports:
- "${DOCKER_DB_EXTERNAL_PORT}:${MYSQL_PORT}"
volumes:
- ${STORAGE_PATH}/mysql:/var/lib/mysql
command:
- mysqld
- --default-authentication-plugin=mysql_native_password
- --character-set-server=${MYSQL_CHARACTER_SET}
- --collation-server=${MYSQL_COLLATION}
- --max_connections=${MYSQL_MAX_CONNECTIONS}
- --innodb-buffer-pool-size=${MYSQL_INNODB_BUFFER_POOL_SIZE}
- --innodb-log-file-size=${MYSQL_INNODB_LOG_FILE_SIZE}
- --user=root
restart: unless-stopped
healthcheck:
test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u ${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} --silent || exit 1"]
interval: ${MYSQL_HEALTHCHECK_INTERVAL}
timeout: ${MYSQL_HEALTHCHECK_TIMEOUT}
retries: ${MYSQL_HEALTHCHECK_RETRIES}
start_period: ${MYSQL_HEALTHCHECK_START_PERIOD}
networks:
- azerothcore
# Step 2: Initialize databases
ac-db-init:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_DB_INIT}
depends_on:
ac-mysql:
condition: service_healthy
networks:
- azerothcore
environment:
MYSQL_PWD: ${MYSQL_ROOT_PASSWORD}
command:
- sh
- -c
- |
echo "🔧 Waiting for MySQL to be ready..."
# Wait for MySQL to be responsive
for i in $(seq 1 ${DB_WAIT_RETRIES}); do
if mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "SELECT 1;" >/dev/null 2>&1; then
echo "✅ MySQL is responsive"
break
fi
echo "⏳ Waiting for MySQL... attempt $i/${DB_WAIT_RETRIES}"
sleep ${DB_WAIT_SLEEP}
done
echo "🗄️ Creating AzerothCore databases..."
mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "
CREATE DATABASE IF NOT EXISTS ${DB_AUTH_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
CREATE DATABASE IF NOT EXISTS ${DB_WORLD_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
CREATE DATABASE IF NOT EXISTS ${DB_CHARACTERS_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
SHOW DATABASES;
" || {
echo "❌ Failed to create databases"
exit 1
}
echo "✅ Databases created successfully!"
restart: "no"
# Step 3: Import AzerothCore database schema and data
ac-db-import:
image: ${AC_DB_IMPORT_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_DB_IMPORT}
user: "0:0" # Run as root to handle NFS permissions
depends_on:
- ac-db-init
networks:
- azerothcore
volumes:
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
environment:
AC_DATA_DIR: "/azerothcore/data"
AC_LOGS_DIR: "/azerothcore/logs"
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_CLOSE_IDLE_CONNECTIONS: "false"
AC_UPDATES_ENABLE_DATABASES: "7"
AC_UPDATES_AUTO_SETUP: "1"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
entrypoint: ["/bin/bash", "-c"]
command:
- |
echo 'Waiting for databases to be ready...'
sleep 10
echo 'Creating config file for dbimport...'
mkdir -p /azerothcore/env/dist/etc
cat > /azerothcore/env/dist/etc/dbimport.conf <<EOF
LoginDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
WorldDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
CharacterDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
Updates.EnableDatabases = 7
Updates.AutoSetup = 1
EOF
echo 'Running database import...'
cd /azerothcore/env/dist/bin
./dbimport
echo 'Database import complete!'
restart: "no"
# Step 4: Auth server
ac-authserver:
image: ${AC_AUTHSERVER_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_AUTHSERVER}
user: "0:0" # Run as root to handle NFS permissions
depends_on:
- ac-db-import
environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports:
- "${DOCKER_AUTH_EXTERNAL_PORT}:${AUTH_PORT}"
restart: unless-stopped
networks:
- azerothcore
volumes:
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: ${AUTH_HEALTHCHECK_INTERVAL}
timeout: ${AUTH_HEALTHCHECK_TIMEOUT}
retries: ${AUTH_HEALTHCHECK_RETRIES}
start_period: ${AUTH_HEALTHCHECK_START_PERIOD}
# Client Data Download Service
ac-client-data:
image: ${ALPINE_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_CLIENT_DATA}
user: "0:0" # Run as root to handle NFS permissions
volumes:
- ${STORAGE_PATH}/data:/azerothcore/data
- ${STORAGE_PATH}/cache:/cache
working_dir: /tmp
command:
- sh
- -c
- |
apk add --no-cache curl unzip wget ca-certificates p7zip jq
# Create cache directory if it doesn't exist
mkdir -p /cache
# Check if game data already exists
if [ -d '/azerothcore/data/maps' ] && [ -d '/azerothcore/data/vmaps' ] && [ -d '/azerothcore/data/mmaps' ] && [ -d '/azerothcore/data/dbc' ]; then
echo '✅ Game data already exists, verifying integrity...'
# Quick verification of required directories
MISSING_DIRS=""
for dir in maps vmaps mmaps dbc; do
if [ ! -d "/azerothcore/data/$$dir" ] || [ -z "$$(ls -A /azerothcore/data/$$dir 2>/dev/null)" ]; then
MISSING_DIRS="$$MISSING_DIRS $$dir"
fi
done
if [ -z "$$MISSING_DIRS" ]; then
echo '✅ All game data directories verified, startup complete!'
exit 0
else
echo "⚠️ Missing or empty directories:$$MISSING_DIRS"
echo "🔄 Re-extracting game data..."
fi
fi
echo '🚀 Starting AzerothCore game data setup...'
# Get the latest release info from wowgaming/client-data
echo '📡 Fetching latest client data release info...'
RELEASE_INFO=$$(wget -qO- https://api.github.com/repos/wowgaming/client-data/releases/latest 2>/dev/null)
if [ -n "$$RELEASE_INFO" ]; then
LATEST_URL=$$(echo "$$RELEASE_INFO" | grep '"browser_download_url":' | grep '\.zip' | cut -d'"' -f4 | head -1)
LATEST_TAG=$$(echo "$$RELEASE_INFO" | grep '"tag_name":' | cut -d'"' -f4)
LATEST_SIZE=$$(echo "$$RELEASE_INFO" | grep '"size":' | head -1 | grep -o '[0-9]*')
fi
if [ -z "$$LATEST_URL" ]; then
echo '❌ Could not fetch latest release URL'
echo '📥 Using fallback: direct download from v16 release'
LATEST_URL='https://github.com/wowgaming/client-data/releases/download/v16/data.zip'
LATEST_TAG='v16'
LATEST_SIZE='0'
fi
echo "📍 Latest release: $$LATEST_TAG"
echo "📥 Download URL: $$LATEST_URL"
# Cache file paths
CACHE_FILE="/cache/client-data-$$LATEST_TAG.zip"
VERSION_FILE="/cache/client-data-version.txt"
# Check if we have a cached version
if [ -f "$$CACHE_FILE" ] && [ -f "$$VERSION_FILE" ]; then
CACHED_VERSION=$$(cat "$$VERSION_FILE" 2>/dev/null)
if [ "$$CACHED_VERSION" = "$$LATEST_TAG" ]; then
echo "✅ Found cached client data version $$LATEST_TAG"
echo "📊 Cached file size: $$(ls -lh "$$CACHE_FILE" | awk '{print $$5}')"
# Verify cache file integrity
if unzip -t "$$CACHE_FILE" > /dev/null 2>&1; then
echo "✅ Cache file integrity verified"
echo "⚡ Using cached download - skipping download phase"
cp "$$CACHE_FILE" data.zip
else
echo "⚠️ Cache file corrupted, will re-download"
rm -f "$$CACHE_FILE" "$$VERSION_FILE"
fi
else
echo "📦 Cache version ($$CACHED_VERSION) differs from latest ($$LATEST_TAG)"
echo "🗑️ Removing old cache"
rm -f /cache/client-data-*.zip "$$VERSION_FILE"
fi
fi
# Download if we don't have a valid cached file
if [ ! -f "data.zip" ]; then
echo "📥 Downloading client data (~15GB, may take 10-30 minutes)..."
echo "📍 Source: $$LATEST_URL"
# Download with progress indication
wget --progress=bar:force -O "$$CACHE_FILE.tmp" "$$LATEST_URL" || {
echo '❌ wget failed, trying curl...'
curl -L --progress-bar -o "$$CACHE_FILE.tmp" "$$LATEST_URL" || {
echo '❌ All download methods failed'
rm -f "$$CACHE_FILE.tmp"
exit 1
}
}
# Verify download integrity
if unzip -t "$$CACHE_FILE.tmp" > /dev/null 2>&1; then
mv "$$CACHE_FILE.tmp" "$$CACHE_FILE"
echo "$$LATEST_TAG" > "$$VERSION_FILE"
echo '✅ Download completed and verified'
echo "📊 File size: $$(ls -lh "$$CACHE_FILE" | awk '{print $$5}')"
cp "$$CACHE_FILE" data.zip
else
echo '❌ Downloaded file is corrupted'
rm -f "$$CACHE_FILE.tmp"
exit 1
fi
fi
echo '📂 Extracting client data (this may take 10-15 minutes)...'
echo '⏳ Please wait while extracting...'
# Clear existing data if extraction failed previously
rm -rf /azerothcore/data/maps /azerothcore/data/vmaps /azerothcore/data/mmaps /azerothcore/data/dbc
unzip -q data.zip -d /azerothcore/data/ || {
echo '❌ Extraction failed'
rm -f data.zip
exit 1
}
# Clean up temporary extraction file (keep cached version)
rm -f data.zip
echo '✅ Client data extraction complete!'
echo '📁 Verifying extracted directories:'
# Verify required directories exist and have content
ALL_GOOD=true
for dir in maps vmaps mmaps dbc; do
if [ -d "/azerothcore/data/$$dir" ] && [ -n "$$(ls -A /azerothcore/data/$$dir 2>/dev/null)" ]; then
DIR_SIZE=$$(du -sh /azerothcore/data/$$dir 2>/dev/null | cut -f1)
echo "✅ $$dir directory: OK ($$DIR_SIZE)"
else
echo "❌ $$dir directory: MISSING or EMPTY"
ALL_GOOD=false
fi
done
if [ "$$ALL_GOOD" = "true" ]; then
echo '🎉 Game data setup complete! AzerothCore worldserver can now start.'
echo "💾 Cached version $$LATEST_TAG for future use"
else
echo '❌ Some directories are missing or empty'
exit 1
fi
restart: "no"
networks:
- azerothcore
# Step 5: World server with Playerbots support
ac-worldserver:
image: ${AC_WORLDSERVER_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_WORLDSERVER}
user: "0:0" # Run as root to handle NFS permissions
stdin_open: true
tty: true
depends_on:
- ac-authserver
- ac-client-data
environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS}"
# Logger configuration - Use config file defaults with proper log level
AC_LOG_LEVEL: "2"
ports:
- "${DOCKER_WORLD_EXTERNAL_PORT}:${WORLD_PORT}"
- "${DOCKER_SOAP_EXTERNAL_PORT}:${SOAP_PORT}"
volumes:
- ${STORAGE_PATH}/data:/azerothcore/data
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH}/modules:/azerothcore/modules
restart: unless-stopped
networks:
- azerothcore
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: ${WORLD_HEALTHCHECK_INTERVAL}
timeout: ${WORLD_HEALTHCHECK_TIMEOUT}
retries: ${WORLD_HEALTHCHECK_RETRIES}
start_period: ${WORLD_HEALTHCHECK_START_PERIOD}
# Optional: Eluna Lua Engine
ac-eluna:
image: ${AC_ELUNA_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_ELUNA}
depends_on:
- ac-worldserver
restart: unless-stopped
networks:
- azerothcore
# Module Management Service
ac-modules:
image: ${ALPINE_GIT_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_MODULES}
user: "0:0" # Run as root to handle NFS permissions
volumes:
- ${STORAGE_PATH}/modules:/modules
environment:
- MODULE_PLAYERBOTS=${MODULE_PLAYERBOTS}
- MODULE_AOE_LOOT=${MODULE_AOE_LOOT}
- MODULE_LEARN_SPELLS=${MODULE_LEARN_SPELLS}
- MODULE_FIREWORKS=${MODULE_FIREWORKS}
- MODULE_INDIVIDUAL_PROGRESSION=${MODULE_INDIVIDUAL_PROGRESSION}
- DEPLOYMENT_MODE=${DEPLOYMENT_MODE}
entrypoint: ["/bin/sh", "-c"]
command:
- |
echo 'Initializing module management...'
cd /modules
if [ "$DEPLOYMENT_MODE" = "portainer" ]; then
echo 'Simple module setup for Portainer deployment...'
mkdir -p mod-playerbots
echo '✅ Playerbot module directory created'
else
echo 'Advanced module setup for local development...'
# Install Playerbots if enabled
if [ "$MODULE_PLAYERBOTS" = "1" ] && [ ! -d "mod-playerbots" ]; then
echo 'Installing mod-playerbots...'
git clone https://github.com/liyunfan1223/mod-playerbots.git mod-playerbots
fi
# Install AOE Loot if enabled
if [ "$MODULE_AOE_LOOT" = "1" ] && [ ! -d "mod-aoe-loot" ]; then
echo 'Installing mod-aoe-loot...'
git clone https://github.com/azerothcore/mod-aoe-loot.git mod-aoe-loot
fi
# Install Learn Spells if enabled
if [ "$MODULE_LEARN_SPELLS" = "1" ] && [ ! -d "mod-learn-spells" ]; then
echo 'Installing mod-learn-spells...'
git clone https://github.com/azerothcore/mod-learn-spells.git mod-learn-spells
fi
# Install Fireworks on Level if enabled
if [ "$MODULE_FIREWORKS" = "1" ] && [ ! -d "mod-fireworks-on-level" ]; then
echo 'Installing mod-fireworks-on-level...'
git clone https://github.com/azerothcore/mod-fireworks-on-level.git mod-fireworks-on-level
fi
# Install Individual Progression if enabled
if [ "$MODULE_INDIVIDUAL_PROGRESSION" = "1" ] && [ ! -d "mod-individual-progression" ]; then
echo 'Installing mod-individual-progression...'
git clone https://github.com/azerothcore/mod-individual-progression.git mod-individual-progression
fi
fi
echo 'Module management complete. Keeping container alive...'
tail -f /dev/null
restart: "no"
networks:
- azerothcore
# Automated Backup System
ac-backup:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_BACKUP}
depends_on:
ac-mysql:
condition: service_healthy
environment:
MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS}
BACKUP_CRON_SCHEDULE: ${BACKUP_CRON_SCHEDULE}
TZ: ${TZ}
volumes:
- ${HOST_BACKUP_PATH}:/backups
- ${HOST_BACKUP_SCRIPTS_PATH}:/scripts
working_dir: /scripts
command:
- /bin/bash
- -c
- |
apt-get update && apt-get install -y cron
chmod +x /scripts/*.sh 2>/dev/null || echo 'No scripts to make executable'
touch /var/log/backup.log
echo "$$BACKUP_CRON_SCHEDULE /scripts/backup.sh >> /var/log/backup.log 2>&1" | crontab -
echo "Starting backup service with schedule: $$BACKUP_CRON_SCHEDULE"
echo "Backup retention: $$BACKUP_RETENTION_DAYS days"
echo "Scripts location: /scripts"
echo "Backup location: /backups"
if [ -f "/scripts/backup.sh" ]; then
echo "Running initial backup..."
/scripts/backup.sh >> /var/log/backup.log 2>&1
else
echo "No backup script found at /scripts/backup.sh"
fi
echo "Starting cron daemon..."
/etc/init.d/cron start
tail -f /var/log/backup.log
restart: unless-stopped
networks:
- azerothcore
networks:
azerothcore:
driver: bridge
name: ${NETWORK_NAME}
ipam:
config:
- subnet: ${NETWORK_SUBNET}
gateway: ${NETWORK_GATEWAY}

View File

@@ -0,0 +1,266 @@
# ==============================================
# AZEROTHCORE DATABASE LAYER
# ==============================================
# MySQL database, initialization, import, and backup services
# Deploy this layer FIRST before core services
services:
# Step 1: MySQL database with NFS-compatible approach
ac-mysql:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_MYSQL}
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST}'
MYSQL_ALLOW_EMPTY_PASSWORD: no
MYSQL_DATADIR: /var/lib/mysql-runtime
ports:
- "${DOCKER_DB_EXTERNAL_PORT}:${MYSQL_PORT}"
volumes:
# Use bind mount for persistent data
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
# Use tmpfs for MySQL runtime with different path
- type: tmpfs
target: /var/lib/mysql-runtime
tmpfs:
size: 2G
entrypoint: ["/bin/bash", "-c"]
command:
- |
echo "🔧 Starting MySQL with NFS-compatible setup..."
# Ensure runtime directory permissions
echo "📁 Setting up MySQL runtime directory..."
mkdir -p /var/lib/mysql-runtime
chown -R mysql:mysql /var/lib/mysql-runtime
chmod 755 /var/lib/mysql-runtime
# Check if we have a SQL backup to restore
if [ -f "/var/lib/mysql-persistent/backup.sql" ]; then
echo "📦 SQL backup found, will restore after MySQL starts..."
else
echo "🆕 No backup found, will initialize fresh MySQL..."
fi
# Start MySQL with custom data directory
echo "🚀 Starting MySQL server with custom datadir..."
exec docker-entrypoint.sh mysqld \
--datadir=/var/lib/mysql-runtime \
--default-authentication-plugin=mysql_native_password \
--character-set-server=${MYSQL_CHARACTER_SET} \
--collation-server=${MYSQL_COLLATION} \
--max_connections=${MYSQL_MAX_CONNECTIONS} \
--innodb-buffer-pool-size=${MYSQL_INNODB_BUFFER_POOL_SIZE} \
--innodb-log-file-size=${MYSQL_INNODB_LOG_FILE_SIZE}
restart: unless-stopped
healthcheck:
test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u ${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} --silent || exit 1"]
interval: ${MYSQL_HEALTHCHECK_INTERVAL}
timeout: ${MYSQL_HEALTHCHECK_TIMEOUT}
retries: ${MYSQL_HEALTHCHECK_RETRIES}
start_period: ${MYSQL_HEALTHCHECK_START_PERIOD}
networks:
- azerothcore
# Step 2: Initialize databases and restore data
ac-db-init:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_DB_INIT}
depends_on:
ac-mysql:
condition: service_healthy
volumes:
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
networks:
- azerothcore
environment:
MYSQL_PWD: ${MYSQL_ROOT_PASSWORD}
command:
- sh
- -c
- |
echo "🔧 Waiting for MySQL to be ready..."
# Wait for MySQL to be responsive
for i in $(seq 1 ${DB_WAIT_RETRIES}); do
if mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "SELECT 1;" >/dev/null 2>&1; then
echo "✅ MySQL is responsive"
break
fi
echo "⏳ Waiting for MySQL... attempt $i/${DB_WAIT_RETRIES}"
sleep ${DB_WAIT_SLEEP}
done
# Check if we should restore from backup
if [ -f "/var/lib/mysql-persistent/backup.sql" ]; then
echo "🔄 Restoring databases from backup..."
mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} < /var/lib/mysql-persistent/backup.sql || {
echo "⚠️ Backup restore failed, will create fresh databases"
}
fi
echo "🗄️ Creating/verifying AzerothCore databases..."
mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "
CREATE DATABASE IF NOT EXISTS ${DB_AUTH_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
CREATE DATABASE IF NOT EXISTS ${DB_WORLD_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
CREATE DATABASE IF NOT EXISTS ${DB_CHARACTERS_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
SHOW DATABASES;
" || {
echo "❌ Failed to create databases"
exit 1
}
echo "✅ Databases ready!"
restart: "no"
# Step 3: Import AzerothCore database schema and data
ac-db-import:
image: ${AC_DB_IMPORT_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_DB_IMPORT}
user: "0:0" # Run as root to handle NFS permissions
depends_on:
- ac-db-init
networks:
- azerothcore
volumes:
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
environment:
AC_DATA_DIR: "/azerothcore/data"
AC_LOGS_DIR: "/azerothcore/logs"
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_CLOSE_IDLE_CONNECTIONS: "false"
AC_UPDATES_ENABLE_DATABASES: "7"
AC_UPDATES_AUTO_SETUP: "1"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
entrypoint: ["/bin/bash", "-c"]
command:
- |
echo 'Waiting for databases to be ready...'
sleep 10
echo 'Creating config file for dbimport...'
mkdir -p /azerothcore/env/dist/etc
cat > /azerothcore/env/dist/etc/dbimport.conf <<EOF
LoginDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
WorldDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
CharacterDatabaseInfo = "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
Updates.EnableDatabases = 7
Updates.AutoSetup = 1
EOF
echo 'Running database import...'
cd /azerothcore/env/dist/bin
./dbimport
echo 'Database import complete!'
restart: "no"
# MySQL Data Persistence Service
ac-mysql-persist:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ac-mysql-persist
depends_on:
ac-mysql:
condition: service_healthy
environment:
MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: ${TZ}
volumes:
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
command:
- /bin/bash
- -c
- |
echo "🔄 Starting MySQL persistence service..."
# Create persistent directory
mkdir -p /var/lib/mysql-persistent
# Function to backup MySQL data
backup_mysql_data() {
echo "💾 Backing up MySQL data to persistent storage..."
# Create SQL dump for safety
mysqldump -h ${CONTAINER_MYSQL} -u ${MYSQL_USER} -p${MYSQL_PASSWORD} --all-databases \
--single-transaction --routines --triggers > /var/lib/mysql-persistent/backup.sql 2>/dev/null || true
echo "✅ MySQL data backup completed"
}
# Initial backup
sleep 30 # Wait for MySQL to be fully ready
backup_mysql_data
# Schedule periodic backups every 30 minutes
while true; do
sleep 1800 # 30 minutes
backup_mysql_data
done
restart: unless-stopped
networks:
- azerothcore
# Automated Backup System
ac-backup:
image: ${MYSQL_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_BACKUP}
depends_on:
ac-mysql:
condition: service_healthy
environment:
MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS}
BACKUP_CRON_SCHEDULE: ${BACKUP_CRON_SCHEDULE}
TZ: ${TZ}
volumes:
- ${HOST_BACKUP_PATH}:/backups
- ${HOST_BACKUP_SCRIPTS_PATH}:/scripts
working_dir: /scripts
command:
- /bin/bash
- -c
- |
apt-get update && apt-get install -y cron
chmod +x /scripts/*.sh 2>/dev/null || echo 'No scripts to make executable'
touch /var/log/backup.log
echo "$$BACKUP_CRON_SCHEDULE /scripts/backup.sh >> /var/log/backup.log 2>&1" | crontab -
echo "Starting backup service with schedule: $$BACKUP_CRON_SCHEDULE"
echo "Backup retention: $$BACKUP_RETENTION_DAYS days"
echo "Scripts location: /scripts"
echo "Backup location: /backups"
if [ -f "/scripts/backup.sh" ]; then
echo "Running initial backup..."
/scripts/backup.sh >> /var/log/backup.log 2>&1
else
echo "No backup script found at /scripts/backup.sh"
fi
echo "Starting cron daemon..."
/etc/init.d/cron start
tail -f /var/log/backup.log
restart: unless-stopped
networks:
- azerothcore
networks:
azerothcore:
driver: bridge
name: ${NETWORK_NAME}
ipam:
config:
- subnet: ${NETWORK_SUBNET}
gateway: ${NETWORK_GATEWAY}

View File

@@ -0,0 +1,86 @@
# ==============================================
# AZEROTHCORE OPTIONAL SERVICES LAYER
# ==============================================
# Modules, monitoring, and additional services
# Deploy this layer AFTER core services are running
services:
# Optional: Eluna Lua Engine
ac-eluna:
image: ${AC_ELUNA_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_ELUNA}
external_links:
- ${CONTAINER_WORLDSERVER}:${CONTAINER_WORLDSERVER}
restart: unless-stopped
networks:
- azerothcore
# Module Management Service
ac-modules:
image: ${ALPINE_GIT_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_MODULES}
user: "0:0" # Run as root to handle NFS permissions
volumes:
- ${STORAGE_PATH}/modules:/modules
environment:
- MODULE_PLAYERBOTS=${MODULE_PLAYERBOTS}
- MODULE_AOE_LOOT=${MODULE_AOE_LOOT}
- MODULE_LEARN_SPELLS=${MODULE_LEARN_SPELLS}
- MODULE_FIREWORKS=${MODULE_FIREWORKS}
- MODULE_INDIVIDUAL_PROGRESSION=${MODULE_INDIVIDUAL_PROGRESSION}
- DEPLOYMENT_MODE=${DEPLOYMENT_MODE}
entrypoint: ["/bin/sh", "-c"]
command:
- |
echo 'Initializing module management...'
cd /modules
if [ "$DEPLOYMENT_MODE" = "portainer" ]; then
echo 'Simple module setup for Portainer deployment...'
mkdir -p mod-playerbots
echo '✅ Playerbot module directory created'
else
echo 'Advanced module setup for local development...'
# Install Playerbots if enabled
if [ "$MODULE_PLAYERBOTS" = "1" ] && [ ! -d "mod-playerbots" ]; then
echo 'Installing mod-playerbots...'
git clone https://github.com/liyunfan1223/mod-playerbots.git mod-playerbots
fi
# Install AOE Loot if enabled
if [ "$MODULE_AOE_LOOT" = "1" ] && [ ! -d "mod-aoe-loot" ]; then
echo 'Installing mod-aoe-loot...'
git clone https://github.com/azerothcore/mod-aoe-loot.git mod-aoe-loot
fi
# Install Learn Spells if enabled
if [ "$MODULE_LEARN_SPELLS" = "1" ] && [ ! -d "mod-learn-spells" ]; then
echo 'Installing mod-learn-spells...'
git clone https://github.com/azerothcore/mod-learn-spells.git mod-learn-spells
fi
# Install Fireworks on Level if enabled
if [ "$MODULE_FIREWORKS" = "1" ] && [ ! -d "mod-fireworks-on-level" ]; then
echo 'Installing mod-fireworks-on-level...'
git clone https://github.com/azerothcore/mod-fireworks-on-level.git mod-fireworks-on-level
fi
# Install Individual Progression if enabled
if [ "$MODULE_INDIVIDUAL_PROGRESSION" = "1" ] && [ ! -d "mod-individual-progression" ]; then
echo 'Installing mod-individual-progression...'
git clone https://github.com/azerothcore/mod-individual-progression.git mod-individual-progression
fi
fi
echo 'Module management complete. Keeping container alive...'
tail -f /dev/null
restart: "no"
networks:
- azerothcore
networks:
azerothcore:
external: true
name: ${NETWORK_NAME}

View File

@@ -0,0 +1,249 @@
# ==============================================
# AZEROTHCORE CORE SERVICES LAYER
# ==============================================
# Authentication server, world server, and client data
# Deploy this layer AFTER the database layer is running
services:
# Client Data Download Service
ac-client-data:
image: ${ALPINE_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_CLIENT_DATA}
user: "0:0" # Run as root to handle NFS permissions
volumes:
- ${STORAGE_PATH}/data:/azerothcore/data
- ${STORAGE_PATH}/cache:/cache
working_dir: /tmp
command:
- sh
- -c
- |
apk add --no-cache curl unzip wget ca-certificates p7zip jq
# Create cache directory if it doesn't exist
mkdir -p /cache
# Check if game data already exists
if [ -d '/azerothcore/data/maps' ] && [ -d '/azerothcore/data/vmaps' ] && [ -d '/azerothcore/data/mmaps' ] && [ -d '/azerothcore/data/dbc' ]; then
echo '✅ Game data already exists, verifying integrity...'
# Quick verification of required directories
MISSING_DIRS=""
for dir in maps vmaps mmaps dbc; do
if [ ! -d "/azerothcore/data/$$dir" ] || [ -z "$$(ls -A /azerothcore/data/$$dir 2>/dev/null)" ]; then
MISSING_DIRS="$$MISSING_DIRS $$dir"
fi
done
if [ -z "$$MISSING_DIRS" ]; then
echo '✅ All game data directories verified, startup complete!'
exit 0
else
echo "⚠️ Missing or empty directories:$$MISSING_DIRS"
echo "🔄 Re-extracting game data..."
fi
fi
echo '🚀 Starting AzerothCore game data setup...'
# Get the latest release info from wowgaming/client-data
echo '📡 Fetching latest client data release info...'
RELEASE_INFO=$$(wget -qO- https://api.github.com/repos/wowgaming/client-data/releases/latest 2>/dev/null)
if [ -n "$$RELEASE_INFO" ]; then
LATEST_URL=$$(echo "$$RELEASE_INFO" | grep '"browser_download_url":' | grep '\.zip' | cut -d'"' -f4 | head -1)
LATEST_TAG=$$(echo "$$RELEASE_INFO" | grep '"tag_name":' | cut -d'"' -f4)
LATEST_SIZE=$$(echo "$$RELEASE_INFO" | grep '"size":' | head -1 | grep -o '[0-9]*')
fi
if [ -z "$$LATEST_URL" ]; then
echo '❌ Could not fetch latest release URL'
echo '📥 Using fallback: direct download from v16 release'
LATEST_URL='https://github.com/wowgaming/client-data/releases/download/v16/data.zip'
LATEST_TAG='v16'
LATEST_SIZE='0'
fi
echo "📍 Latest release: $$LATEST_TAG"
echo "📥 Download URL: $$LATEST_URL"
# Cache file paths
CACHE_FILE="/cache/client-data-$$LATEST_TAG.zip"
VERSION_FILE="/cache/client-data-version.txt"
# Check if we have a cached version
if [ -f "$$CACHE_FILE" ] && [ -f "$$VERSION_FILE" ]; then
CACHED_VERSION=$$(cat "$$VERSION_FILE" 2>/dev/null)
if [ "$$CACHED_VERSION" = "$$LATEST_TAG" ]; then
echo "✅ Found cached client data version $$LATEST_TAG"
echo "📊 Cached file size: $$(ls -lh "$$CACHE_FILE" | awk '{print $$5}')"
# Verify cache file integrity
if unzip -t "$$CACHE_FILE" > /dev/null 2>&1; then
echo "✅ Cache file integrity verified"
echo "⚡ Using cached download - skipping download phase"
cp "$$CACHE_FILE" data.zip
else
echo "⚠️ Cache file corrupted, will re-download"
rm -f "$$CACHE_FILE" "$$VERSION_FILE"
fi
else
echo "📦 Cache version ($$CACHED_VERSION) differs from latest ($$LATEST_TAG)"
echo "🗑️ Removing old cache"
rm -f /cache/client-data-*.zip "$$VERSION_FILE"
fi
fi
# Download if we don't have a valid cached file
if [ ! -f "data.zip" ]; then
echo "📥 Downloading client data (~15GB, may take 10-30 minutes)..."
echo "📍 Source: $$LATEST_URL"
# Download with progress indication
wget --progress=bar:force -O "$$CACHE_FILE.tmp" "$$LATEST_URL" || {
echo '❌ wget failed, trying curl...'
curl -L --progress-bar -o "$$CACHE_FILE.tmp" "$$LATEST_URL" || {
echo '❌ All download methods failed'
rm -f "$$CACHE_FILE.tmp"
exit 1
}
}
# Verify download integrity
if unzip -t "$$CACHE_FILE.tmp" > /dev/null 2>&1; then
mv "$$CACHE_FILE.tmp" "$$CACHE_FILE"
echo "$$LATEST_TAG" > "$$VERSION_FILE"
echo '✅ Download completed and verified'
echo "📊 File size: $$(ls -lh "$$CACHE_FILE" | awk '{print $$5}')"
cp "$$CACHE_FILE" data.zip
else
echo '❌ Downloaded file is corrupted'
rm -f "$$CACHE_FILE.tmp"
exit 1
fi
fi
echo '📂 Extracting client data (this may take 10-15 minutes)...'
echo '⏳ Please wait while extracting...'
# Clear existing data if extraction failed previously
rm -rf /azerothcore/data/maps /azerothcore/data/vmaps /azerothcore/data/mmaps /azerothcore/data/dbc
unzip -q data.zip -d /azerothcore/data/ || {
echo '❌ Extraction failed'
rm -f data.zip
exit 1
}
# Clean up temporary extraction file (keep cached version)
rm -f data.zip
echo '✅ Client data extraction complete!'
echo '📁 Verifying extracted directories:'
# Verify required directories exist and have content
ALL_GOOD=true
for dir in maps vmaps mmaps dbc; do
if [ -d "/azerothcore/data/$$dir" ] && [ -n "$$(ls -A /azerothcore/data/$$dir 2>/dev/null)" ]; then
DIR_SIZE=$$(du -sh /azerothcore/data/$$dir 2>/dev/null | cut -f1)
echo "✅ $$dir directory: OK ($$DIR_SIZE)"
else
echo "❌ $$dir directory: MISSING or EMPTY"
ALL_GOOD=false
fi
done
if [ "$$ALL_GOOD" = "true" ]; then
echo '🎉 Game data setup complete! AzerothCore worldserver can now start.'
echo "💾 Cached version $$LATEST_TAG for future use"
else
echo '❌ Some directories are missing or empty'
exit 1
fi
restart: "no"
networks:
- azerothcore
# Auth server
ac-authserver:
image: ${AC_AUTHSERVER_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_AUTHSERVER}
user: "0:0" # Run as root to handle NFS permissions
external_links:
- ${CONTAINER_MYSQL}:${CONTAINER_MYSQL}
environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports:
- "${DOCKER_AUTH_EXTERNAL_PORT}:${AUTH_PORT}"
restart: unless-stopped
networks:
- azerothcore
volumes:
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: ${AUTH_HEALTHCHECK_INTERVAL}
timeout: ${AUTH_HEALTHCHECK_TIMEOUT}
retries: ${AUTH_HEALTHCHECK_RETRIES}
start_period: ${AUTH_HEALTHCHECK_START_PERIOD}
# World server with Playerbots support
ac-worldserver:
image: ${AC_WORLDSERVER_IMAGE}
pull_policy: ${IMAGE_PULL_POLICY}
container_name: ${CONTAINER_WORLDSERVER}
user: "0:0" # Run as root to handle NFS permissions
stdin_open: true
tty: true
depends_on:
- ac-authserver
- ac-client-data
external_links:
- ${CONTAINER_MYSQL}:${CONTAINER_MYSQL}
environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS}"
# Logger configuration - Use config file defaults with proper log level
AC_LOG_LEVEL: "2"
ports:
- "${DOCKER_WORLD_EXTERNAL_PORT}:${WORLD_PORT}"
- "${DOCKER_SOAP_EXTERNAL_PORT}:${SOAP_PORT}"
volumes:
- ${STORAGE_PATH}/data:/azerothcore/data
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH}/modules:/azerothcore/modules
restart: unless-stopped
networks:
- azerothcore
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: ${WORLD_HEALTHCHECK_INTERVAL}
timeout: ${WORLD_HEALTHCHECK_TIMEOUT}
retries: ${WORLD_HEALTHCHECK_RETRIES}
start_period: ${WORLD_HEALTHCHECK_START_PERIOD}
networks:
azerothcore:
external: true
name: ${NETWORK_NAME}

View File

@@ -0,0 +1,125 @@
# ==============================================
# AZEROTHCORE TOOLS DOCKER COMPOSE
# ==============================================
# Web interfaces and monitoring tools for AzerothCore
# This stack connects to the core AzerothCore database
services:
# PHPMyAdmin Database Management Interface
ac-phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
container_name: ac-phpmyadmin
environment:
PMA_HOST: ${PMA_HOST:-host.docker.internal}
PMA_PORT: ${PMA_PORT:-64306}
PMA_USER: ${PMA_USER:-root}
PMA_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
MYSQL_ROOT_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
PMA_ARBITRARY: ${PMA_ARBITRARY:-1}
PMA_ABSOLUTE_URI: ${PMA_ABSOLUTE_URI:-}
UPLOAD_LIMIT: ${PMA_UPLOAD_LIMIT:-300M}
MEMORY_LIMIT: ${PMA_MEMORY_LIMIT:-512M}
MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME:-600}
ports:
- "${PMA_EXTERNAL_PORT:-8081}:80"
restart: unless-stopped
networks:
- azerothcore-tools
# Keira3 Database Editor (Production Ready)
ac-keira3:
image: uprightbass360/keira3:latest
container_name: ac-keira3
restart: unless-stopped
environment:
- NODE_ENV=production
- KEIRA_PORT=8080
- KEIRA_HOST=0.0.0.0
- KEIRA_DATABASE_HOST=${KEIRA_DATABASE_HOST:-host.docker.internal}
- KEIRA_DATABASE_PORT=${KEIRA_DATABASE_PORT:-64306}
- KEIRA_DATABASE_USER=root
- KEIRA_DATABASE_PASSWORD=${DOCKER_DB_ROOT_PASSWORD:-password}
- KEIRA_DATABASE_NAME=acore_world
ports:
- "${KEIRA3_EXTERNAL_PORT:-4201}:8080"
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
healthcheck:
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || nc -z localhost 8080 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
security_opt:
- no-new-privileges:true
networks:
- azerothcore-tools
# InfluxDB for Monitoring
ac-influxdb:
image: influxdb:2.7-alpine
container_name: ac-influxdb
environment:
DOCKER_INFLUXDB_INIT_MODE: ${INFLUXDB_INIT_MODE:-setup}
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_ADMIN_USER:-acore}
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_ADMIN_PASSWORD:-acore123}
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_ORG:-azerothcore}
DOCKER_INFLUXDB_INIT_BUCKET: ${INFLUXDB_BUCKET:-metrics}
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_TOKEN:-acore-monitoring-token-12345}
INFLUXDB_HTTP_AUTH_ENABLED: ${INFLUXDB_HTTP_AUTH_ENABLED:-true}
INFLUXDB_HTTP_HTTPS_ENABLED: ${INFLUXDB_HTTP_HTTPS_ENABLED:-false}
ports:
- "${INFLUXDB_EXTERNAL_PORT:-8087}:8086"
volumes:
- ${STORAGE_PATH_TOOLS:-./volumes-tools}/azerothcore/influxdb:/var/lib/influxdb2
restart: unless-stopped
networks:
- azerothcore-tools
# Grafana Monitoring Dashboard
ac-grafana:
image: grafana/grafana:latest
container_name: ac-grafana
depends_on:
- ac-influxdb
environment:
GF_SECURITY_ADMIN_USER: ${GF_SECURITY_ADMIN_USER:-admin}
GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD:-acore123}
GF_INSTALL_PLUGINS: ${GF_INSTALL_PLUGINS:-grafana-piechart-panel}
GF_SERVER_ROOT_URL: ${GF_SERVER_ROOT_URL:-http://localhost:3001}
GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: ${GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION:-false}
GF_SECURITY_SECRET_KEY: ${GF_SECURITY_SECRET_KEY:-}
GF_USERS_ALLOW_SIGN_UP: ${GF_USERS_ALLOW_SIGN_UP:-false}
GF_USERS_ALLOW_ORG_CREATE: ${GF_USERS_ALLOW_ORG_CREATE:-false}
GF_AUTH_ANONYMOUS_ENABLED: ${GF_AUTH_ANONYMOUS_ENABLED:-false}
GF_SERVER_ENABLE_GZIP: ${GF_SERVER_ENABLE_GZIP:-true}
GF_SECURITY_COOKIE_SECURE: ${GF_SECURITY_COOKIE_SECURE:-false}
GF_SECURITY_COOKIE_SAMESITE: ${GF_SECURITY_COOKIE_SAMESITE:-lax}
ports:
- "${GF_EXTERNAL_PORT:-3001}:3000"
volumes:
- ${STORAGE_PATH_TOOLS:-./volumes-tools}/azerothcore/grafana:/var/lib/grafana
- ${STORAGE_PATH_TOOLS:-./volumes-tools}/azerothcore/grafana-config:/etc/grafana
restart: unless-stopped
networks:
- azerothcore-tools
networks:
azerothcore-tools:
driver: bridge
name: ${TOOLS_NETWORK_NAME:-azerothcore-tools}
ipam:
config:
- subnet: ${TOOLS_NETWORK_SUBNET:-172.21.0.0/16}
gateway: ${TOOLS_NETWORK_GATEWAY:-172.21.0.1}

View File

@@ -1,493 +0,0 @@
# ==============================================
# AZEROTHCORE UNIFIED DOCKER COMPOSE
# ==============================================
# Compatible with both local development and Portainer deployment
# Set DEPLOYMENT_MODE=local|portainer in .env file
services:
# Step 1: Standard MySQL database
ac-mysql:
image: mysql:8.0
container_name: ac-mysql
user: "0:0" # Run as root to handle NFS permissions
environment:
MYSQL_ROOT_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
MYSQL_ROOT_HOST: '%'
ports:
- "${DOCKER_DB_EXTERNAL_PORT:-64306}:3306"
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/mysql:/var/lib/mysql
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --max_connections=1000
- --innodb-buffer-pool-size=256M
- --innodb-log-file-size=64M
- --user=mysql
restart: unless-stopped
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${DOCKER_DB_ROOT_PASSWORD:-password}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
networks:
- azerothcore
# Step 2: Initialize databases
ac-db-init:
image: mysql:8.0
container_name: ac-db-init
depends_on:
ac-mysql:
condition: service_healthy
networks:
- azerothcore
environment:
MYSQL_PWD: ${DOCKER_DB_ROOT_PASSWORD:-password}
command:
- sh
- -c
- |
echo "Creating AzerothCore databases..."
mysql -h ac-mysql -uroot -e "
CREATE DATABASE IF NOT EXISTS acore_auth DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS acore_world DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS acore_characters DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW DATABASES;
" || true
echo "Databases created!"
restart: "no"
# Step 3: Import AzerothCore database schema and data
ac-db-import:
image: acore/ac-wotlk-db-import:14.0.0-dev
container_name: ac-db-import
depends_on:
- ac-db-init
networks:
- azerothcore
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/config:/azerothcore/env/dist/etc
environment:
AC_DATA_DIR: "/azerothcore/data"
AC_LOGS_DIR: "/azerothcore/logs"
AC_LOGIN_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "false"
AC_UPDATES_ENABLE_DATABASES: "7"
AC_UPDATES_AUTO_SETUP: "1"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
entrypoint: ["/bin/bash", "-c"]
command:
- |
echo 'Waiting for databases to be ready...'
sleep 10
echo 'Creating config file for dbimport...'
mkdir -p /azerothcore/env/dist/etc
cat > /azerothcore/env/dist/etc/dbimport.conf <<EOF
LoginDatabaseInfo = "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
WorldDatabaseInfo = "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
CharacterDatabaseInfo = "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
Updates.EnableDatabases = 7
Updates.AutoSetup = 1
EOF
echo 'Running database import...'
cd /azerothcore/env/dist/bin
./dbimport
echo 'Database import complete!'
restart: "no"
# Step 4: Auth server
ac-authserver:
image: acore/ac-wotlk-authserver:14.0.0-dev
container_name: ac-authserver
depends_on:
- ac-db-import
environment:
AC_LOGIN_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1"
AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports:
- "${DOCKER_AUTH_EXTERNAL_PORT:-3784}:3724"
restart: unless-stopped
networks:
- azerothcore
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/config:/azerothcore/env/dist/etc
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# Client Data Download Service
ac-client-data:
image: alpine:latest
container_name: ac-client-data
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/data:/azerothcore/data
working_dir: /tmp
command:
- sh
- -c
- |
apk add --no-cache curl unzip wget ca-certificates p7zip
if [ -d '/azerothcore/data/maps' ] && [ -d '/azerothcore/data/vmaps' ] && [ -d '/azerothcore/data/mmaps' ] && [ -d '/azerothcore/data/dbc' ]; then
echo '✅ Game data already exists, skipping download'
exit 0
fi
echo '🚀 Starting AzerothCore game data download...'
echo 'This will download ~15GB of data and may take 10-30 minutes'
# Get the latest release info from wowgaming/client-data
echo '📡 Fetching latest client data release info...'
LATEST_URL=$$(wget -qO- https://api.github.com/repos/wowgaming/client-data/releases/latest | grep '"browser_download_url":' | grep '\.zip' | cut -d'"' -f4 | head -1)
if [ -z "$$LATEST_URL" ]; then
echo '❌ Could not fetch latest release URL'
echo '📥 Using fallback: direct download from v16 release'
LATEST_URL='https://github.com/wowgaming/client-data/releases/download/v16/data.zip'
fi
echo "📥 Downloading client data from: $$LATEST_URL"
# Download the client data
wget -O data.zip "$$LATEST_URL" || {
echo '❌ Download failed, trying alternative method'
curl -L -o data.zip "$$LATEST_URL" || {
echo '❌ All download methods failed'
exit 1
}
}
echo '📊 Download completed, file size:'
ls -lh data.zip
echo '📂 Extracting client data (this may take 10-15 minutes)...'
unzip -q data.zip -d /azerothcore/data/ || {
echo '❌ Extraction failed'
exit 1
}
echo '🧹 Cleaning up downloaded archive...'
rm -f data.zip
echo '✅ Client data extraction complete!'
echo '📁 Verifying extracted directories:'
ls -la /azerothcore/data/
# Verify required directories exist
for dir in maps vmaps mmaps dbc; do
if [ -d "/azerothcore/data/$$dir" ]; then
echo "✅ $$dir directory: OK"
else
echo "❌ $$dir directory: MISSING"
fi
done
echo '🎉 Game data setup complete! AzerothCore worldserver can now start.'
restart: "no"
networks:
- azerothcore
# Step 5: World server with Playerbots support
ac-worldserver:
image: acore/ac-wotlk-worldserver:14.0.0-dev
container_name: ac-worldserver
stdin_open: true
tty: true
depends_on:
- ac-authserver
- ac-client-data
environment:
AC_LOGIN_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-mysql;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED:-1}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS:-40}"
# Logger configuration - Use config file defaults with proper log level
AC_LOG_LEVEL: "2"
ports:
- "${DOCKER_WORLD_EXTERNAL_PORT:-8215}:8085"
- "${DOCKER_SOAP_EXTERNAL_PORT:-7778}:7878"
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/data:/azerothcore/data
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/logs:/azerothcore/logs
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/modules:/azerothcore/modules
restart: unless-stopped
networks:
- azerothcore
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 120s
# Optional: Eluna Lua Engine
ac-eluna:
image: acore/eluna-ts:master
container_name: ac-eluna
depends_on:
- ac-worldserver
restart: unless-stopped
networks:
- azerothcore
# Module Management Service
ac-modules:
image: alpine/git:latest
container_name: ac-modules
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/modules:/modules
environment:
- MODULE_PLAYERBOTS=${MODULE_PLAYERBOTS:-1}
- MODULE_AOE_LOOT=${MODULE_AOE_LOOT:-0}
- MODULE_LEARN_SPELLS=${MODULE_LEARN_SPELLS:-0}
- MODULE_FIREWORKS=${MODULE_FIREWORKS:-0}
- MODULE_INDIVIDUAL_PROGRESSION=${MODULE_INDIVIDUAL_PROGRESSION:-0}
- DEPLOYMENT_MODE=${DEPLOYMENT_MODE:-local}
entrypoint: ["/bin/sh", "-c"]
command:
- |
echo 'Initializing module management...'
cd /modules
if [ "$DEPLOYMENT_MODE" = "portainer" ]; then
echo 'Simple module setup for Portainer deployment...'
mkdir -p mod-playerbots
echo '✅ Playerbot module directory created'
else
echo 'Advanced module setup for local development...'
# Install Playerbots if enabled
if [ "$MODULE_PLAYERBOTS" = "1" ] && [ ! -d "mod-playerbots" ]; then
echo 'Installing mod-playerbots...'
git clone https://github.com/liyunfan1223/mod-playerbots.git mod-playerbots
fi
# Install AOE Loot if enabled
if [ "$MODULE_AOE_LOOT" = "1" ] && [ ! -d "mod-aoe-loot" ]; then
echo 'Installing mod-aoe-loot...'
git clone https://github.com/azerothcore/mod-aoe-loot.git mod-aoe-loot
fi
# Install Learn Spells if enabled
if [ "$MODULE_LEARN_SPELLS" = "1" ] && [ ! -d "mod-learn-spells" ]; then
echo 'Installing mod-learn-spells...'
git clone https://github.com/azerothcore/mod-learn-spells.git mod-learn-spells
fi
# Install Fireworks on Level if enabled
if [ "$MODULE_FIREWORKS" = "1" ] && [ ! -d "mod-fireworks-on-level" ]; then
echo 'Installing mod-fireworks-on-level...'
git clone https://github.com/azerothcore/mod-fireworks-on-level.git mod-fireworks-on-level
fi
# Install Individual Progression if enabled
if [ "$MODULE_INDIVIDUAL_PROGRESSION" = "1" ] && [ ! -d "mod-individual-progression" ]; then
echo 'Installing mod-individual-progression...'
git clone https://github.com/azerothcore/mod-individual-progression.git mod-individual-progression
fi
fi
echo 'Module management complete. Keeping container alive...'
tail -f /dev/null
restart: "no"
networks:
- azerothcore
# PHPMyAdmin Database Management Interface
ac-phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
container_name: ac-phpmyadmin
depends_on:
ac-mysql:
condition: service_healthy
environment:
PMA_HOST: ${PMA_HOST:-ac-mysql}
PMA_PORT: ${PMA_PORT:-3306}
PMA_USER: ${PMA_USER:-root}
PMA_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
MYSQL_ROOT_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
PMA_ARBITRARY: ${PMA_ARBITRARY:-1}
PMA_ABSOLUTE_URI: ${PMA_ABSOLUTE_URI:-}
UPLOAD_LIMIT: ${PMA_UPLOAD_LIMIT:-300M}
MEMORY_LIMIT: ${PMA_MEMORY_LIMIT:-512M}
MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME:-600}
ports:
- "${PMA_EXTERNAL_PORT:-8081}:80"
restart: unless-stopped
networks:
- azerothcore
# Keira3 Database Editor (Production Ready)
ac-keira3:
image: uprightbass360/keira3:latest
container_name: ac-keira3
restart: unless-stopped
depends_on:
ac-mysql:
condition: service_healthy
environment:
- NODE_ENV=production
- KEIRA_PORT=8080
- KEIRA_HOST=0.0.0.0
- KEIRA_DATABASE_HOST=ac-mysql
- KEIRA_DATABASE_PORT=3306
- KEIRA_DATABASE_USER=root
- KEIRA_DATABASE_PASSWORD=${DOCKER_DB_ROOT_PASSWORD:-password}
- KEIRA_DATABASE_NAME=acore_world
ports:
- "${KEIRA3_EXTERNAL_PORT:-4201}:8080"
deploy:
resources:
limits:
memory: 512M
cpus: '0.5'
reservations:
memory: 256M
cpus: '0.25'
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
security_opt:
- no-new-privileges:true
networks:
- azerothcore
# InfluxDB for Monitoring
ac-influxdb:
image: influxdb:2.7-alpine
container_name: ac-influxdb
environment:
DOCKER_INFLUXDB_INIT_MODE: ${INFLUXDB_INIT_MODE:-setup}
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_ADMIN_USER:-acore}
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_ADMIN_PASSWORD:-acore123}
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_ORG:-azerothcore}
DOCKER_INFLUXDB_INIT_BUCKET: ${INFLUXDB_BUCKET:-metrics}
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_TOKEN:-acore-monitoring-token-12345}
INFLUXDB_HTTP_AUTH_ENABLED: ${INFLUXDB_HTTP_AUTH_ENABLED:-true}
INFLUXDB_HTTP_HTTPS_ENABLED: ${INFLUXDB_HTTP_HTTPS_ENABLED:-false}
ports:
- "${INFLUXDB_EXTERNAL_PORT:-8087}:8086"
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/influxdb:/var/lib/influxdb2
restart: unless-stopped
networks:
- azerothcore
# Grafana Monitoring Dashboard
ac-grafana:
image: grafana/grafana:latest
container_name: ac-grafana
depends_on:
- ac-influxdb
environment:
GF_SECURITY_ADMIN_USER: ${GF_SECURITY_ADMIN_USER:-admin}
GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD:-acore123}
GF_INSTALL_PLUGINS: ${GF_INSTALL_PLUGINS:-grafana-piechart-panel}
GF_SERVER_ROOT_URL: ${GF_SERVER_ROOT_URL:-http://localhost:3000}
GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: ${GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION:-false}
GF_SECURITY_SECRET_KEY: ${GF_SECURITY_SECRET_KEY:-}
GF_USERS_ALLOW_SIGN_UP: ${GF_USERS_ALLOW_SIGN_UP:-false}
GF_USERS_ALLOW_ORG_CREATE: ${GF_USERS_ALLOW_ORG_CREATE:-false}
GF_AUTH_ANONYMOUS_ENABLED: ${GF_AUTH_ANONYMOUS_ENABLED:-false}
GF_SERVER_ENABLE_GZIP: ${GF_SERVER_ENABLE_GZIP:-true}
GF_SECURITY_COOKIE_SECURE: ${GF_SECURITY_COOKIE_SECURE:-false}
GF_SECURITY_COOKIE_SAMESITE: ${GF_SECURITY_COOKIE_SAMESITE:-lax}
ports:
- "${GF_EXTERNAL_PORT:-3001}:3000"
volumes:
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/grafana:/var/lib/grafana
- ${STORAGE_PATH_CONTAINERS:-./volumes}/azerothcore/grafana-config:/etc/grafana
restart: unless-stopped
networks:
- azerothcore
# Automated Backup System
ac-backup:
image: mysql:8.0
container_name: ac-backup
depends_on:
ac-mysql:
condition: service_healthy
environment:
MYSQL_HOST: ac-mysql
MYSQL_PORT: 3306
MYSQL_USER: root
MYSQL_PASSWORD: ${DOCKER_DB_ROOT_PASSWORD:-password}
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-7}
BACKUP_CRON_SCHEDULE: ${BACKUP_CRON_SCHEDULE:-0 3 * * *}
TZ: ${TZ:-UTC}
volumes:
- ${HOST_BACKUP_PATH:-./backups}:/backups
- ${HOST_BACKUP_SCRIPTS_PATH:-./backup-scripts}:/scripts
working_dir: /scripts
command:
- /bin/bash
- -c
- |
apt-get update && apt-get install -y cron
chmod +x /scripts/*.sh 2>/dev/null || echo 'No scripts to make executable'
touch /var/log/backup.log
echo "$$BACKUP_CRON_SCHEDULE /scripts/backup.sh >> /var/log/backup.log 2>&1" | crontab -
echo "Starting backup service with schedule: $$BACKUP_CRON_SCHEDULE"
echo "Backup retention: $$BACKUP_RETENTION_DAYS days"
echo "Scripts location: /scripts"
echo "Backup location: /backups"
if [ -f "/scripts/backup.sh" ]; then
echo "Running initial backup..."
/scripts/backup.sh >> /var/log/backup.log 2>&1
else
echo "No backup script found at /scripts/backup.sh"
fi
echo "Starting cron daemon..."
/etc/init.d/cron start
tail -f /var/log/backup.log
restart: unless-stopped
networks:
- azerothcore
networks:
azerothcore:
driver: bridge
name: ${NETWORK_NAME:-azerothcore}
ipam:
config:
- subnet: ${NETWORK_SUBNET:-172.20.0.0/16}
gateway: ${NETWORK_GATEWAY:-172.20.0.1}