mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 00:58:34 +00:00
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:
352
.env
352
.env
@@ -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
174
.env-core
Normal 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
98
.env-database
Normal 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
98
.env-database-local
Normal 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
51
.env-optional
Normal 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
89
.env-services
Normal 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
89
.env-tools
Normal 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
152
DEPLOYMENT_GUIDE.md
Normal 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
178
STAGED_DEPLOYMENT_GUIDE.md
Normal 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
190
UNUSED_ENV_VARIABLES.md
Normal 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
|
||||
525
docker-compose-azerothcore-core.yml
Normal file
525
docker-compose-azerothcore-core.yml
Normal 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}
|
||||
266
docker-compose-azerothcore-database.yml
Normal file
266
docker-compose-azerothcore-database.yml
Normal 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}
|
||||
86
docker-compose-azerothcore-optional.yml
Normal file
86
docker-compose-azerothcore-optional.yml
Normal 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}
|
||||
249
docker-compose-azerothcore-services.yml
Normal file
249
docker-compose-azerothcore-services.yml
Normal 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}
|
||||
125
docker-compose-azerothcore-tools.yml
Normal file
125
docker-compose-azerothcore-tools.yml
Normal 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}
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user