variable cleanup

This commit is contained in:
uprightbass360
2025-10-26 04:49:25 -04:00
parent 323186cce2
commit f46b88bd93
4 changed files with 492 additions and 300 deletions

View File

@@ -10,6 +10,7 @@ COMPOSE_PROJECT_NAME=acore-compose
# ===================== # =====================
STORAGE_PATH=./storage STORAGE_PATH=./storage
STORAGE_PATH_LOCAL=./local-storage STORAGE_PATH_LOCAL=./local-storage
HOST_BACKUP_PATH=./storage/backups
HOST_ZONEINFO_PATH=/usr/share/zoneinfo HOST_ZONEINFO_PATH=/usr/share/zoneinfo
TZ=UTC TZ=UTC
@@ -18,6 +19,7 @@ TZ=UTC
# ===================== # =====================
MYSQL_IMAGE=mysql:8.0 MYSQL_IMAGE=mysql:8.0
CONTAINER_MYSQL=ac-mysql CONTAINER_MYSQL=ac-mysql
MYSQL_HOST=ac-mysql
MYSQL_ROOT_PASSWORD=azerothcore123 MYSQL_ROOT_PASSWORD=azerothcore123
MYSQL_ROOT_HOST=% MYSQL_ROOT_HOST=%
MYSQL_USER=root MYSQL_USER=root
@@ -30,6 +32,8 @@ MYSQL_INNODB_BUFFER_POOL_SIZE=256M
MYSQL_INNODB_LOG_FILE_SIZE=64M MYSQL_INNODB_LOG_FILE_SIZE=64M
MYSQL_INNODB_REDO_LOG_CAPACITY=512M MYSQL_INNODB_REDO_LOG_CAPACITY=512M
MYSQL_RUNTIME_TMPFS_SIZE=8G MYSQL_RUNTIME_TMPFS_SIZE=8G
DB_WAIT_RETRIES=60
DB_WAIT_SLEEP=10
# DB names # DB names
DB_AUTH_NAME=acore_auth DB_AUTH_NAME=acore_auth
@@ -37,6 +41,13 @@ DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters DB_CHARACTERS_NAME=acore_characters
DB_PLAYERBOTS_NAME=acore_playerbots DB_PLAYERBOTS_NAME=acore_playerbots
# Container identifiers
CONTAINER_DB_IMPORT=ac-db-import
CONTAINER_DB_INIT=ac-db-init
CONTAINER_BACKUP=ac-backup
CONTAINER_MODULES=ac-modules
CONTAINER_POST_INSTALL=ac-post-install
# DB import image # DB import image
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
@@ -84,13 +95,24 @@ SOAP_PORT=7878
SERVER_ADDRESS=127.0.0.1 SERVER_ADDRESS=127.0.0.1
REALM_PORT=8215 REALM_PORT=8215
# =====================
# Backups
# =====================
BACKUP_RETENTION_DAYS=3
BACKUP_RETENTION_HOURS=6
BACKUP_DAILY_TIME=09
BACKUP_HEALTHCHECK_MAX_MINUTES=1440
BACKUP_HEALTHCHECK_GRACE_SECONDS=4500
BACKUP_HEALTHCHECK_INTERVAL=60s
BACKUP_HEALTHCHECK_TIMEOUT=30s
BACKUP_HEALTHCHECK_RETRIES=3
BACKUP_HEALTHCHECK_START_PERIOD=120s
# ===================== # =====================
# Playerbots runtime flags (used by worldserver env) # Playerbots runtime flags (used by worldserver env)
# ===================== # =====================
PLAYERBOT_ENABLED=0 PLAYERBOT_ENABLED=0
PLAYERBOT_MAX_BOTS=40 PLAYERBOT_MAX_BOTS=40
PLAYERBOT_ENABLED=0
PLAYERBOT_MAX_BOTS=1000
# ===================== # =====================
# Module toggles (0/1) # Module toggles (0/1)
@@ -116,6 +138,7 @@ MODULE_ACCOUNT_ACHIEVEMENTS=0
MODULE_AUTO_REVIVE=0 MODULE_AUTO_REVIVE=0
MODULE_GAIN_HONOR_GUARD=0 MODULE_GAIN_HONOR_GUARD=0
MODULE_ARAC=0 MODULE_ARAC=0
MODULE_ELUNA=0
# Requires optional SQL/DBC patches; leave off by default # Requires optional SQL/DBC patches; leave off by default
MODULE_TIME_IS_TIME=0 MODULE_TIME_IS_TIME=0
# Requires in-game NPC placement/config; leave off by default # Requires in-game NPC placement/config; leave off by default
@@ -169,6 +192,24 @@ AC_ELUNA_REQUIRE_PATHS=
AC_ELUNA_REQUIRE_CPATHS= AC_ELUNA_REQUIRE_CPATHS=
AC_ELUNA_AUTO_RELOAD_INTERVAL=1 AC_ELUNA_AUTO_RELOAD_INTERVAL=1
# =====================
# Health checks
# =====================
MYSQL_HEALTHCHECK_INTERVAL=20s
MYSQL_HEALTHCHECK_TIMEOUT=15s
MYSQL_HEALTHCHECK_RETRIES=25
MYSQL_HEALTHCHECK_START_PERIOD=120s
AUTH_HEALTHCHECK_INTERVAL=30s
AUTH_HEALTHCHECK_TIMEOUT=10s
AUTH_HEALTHCHECK_RETRIES=3
AUTH_HEALTHCHECK_START_PERIOD=60s
WORLD_HEALTHCHECK_INTERVAL=30s
WORLD_HEALTHCHECK_TIMEOUT=10s
WORLD_HEALTHCHECK_RETRIES=3
WORLD_HEALTHCHECK_START_PERIOD=120s
# ===================== # =====================
# Tools (phpMyAdmin / Keira3) # Tools (phpMyAdmin / Keira3)
# ===================== # =====================
@@ -197,3 +238,9 @@ NETWORK_GATEWAY=172.20.0.1
# Container user mapping # Container user mapping
# ===================== # =====================
CONTAINER_USER=0:0 CONTAINER_USER=0:0
# =====================
# Helper images
# =====================
ALPINE_GIT_IMAGE=alpine/git:latest
ALPINE_IMAGE=alpine:latest

View File

@@ -1,54 +1,54 @@
name: ${COMPOSE_PROJECT_NAME:-ac-compose} name: ${COMPOSE_PROJECT_NAME}
services: services:
# ===================== # =====================
# Database Layer (db) # Database Layer (db)
# ===================== # =====================
ac-mysql: ac-mysql:
profiles: ["db"] profiles: ["db"]
image: ${MYSQL_IMAGE:-mysql:8.0} image: ${MYSQL_IMAGE}
container_name: ${CONTAINER_MYSQL:-ac-mysql} container_name: ${CONTAINER_MYSQL}
environment: environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST:-%}' MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATADIR: /var/lib/mysql-runtime MYSQL_DATADIR: /var/lib/mysql-runtime
MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET:-utf8mb4} MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET}
MYSQL_COLLATION: ${MYSQL_COLLATION:-utf8mb4_unicode_ci} MYSQL_COLLATION: ${MYSQL_COLLATION}
MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS:-1000} MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS}
MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE:-256M} MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE}
MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE:-64M} MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE}
ports: ports:
- "${MYSQL_EXTERNAL_PORT:-64306}:${MYSQL_PORT:-3306}" - "${MYSQL_EXTERNAL_PORT}:${MYSQL_PORT}"
volumes: volumes:
- ${STORAGE_PATH:-./storage}/mysql-data:/var/lib/mysql-persistent - ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
- ${HOST_BACKUP_PATH:-${STORAGE_PATH:-./storage}/backups}:/backups - ${HOST_BACKUP_PATH}:/backups
- ${HOST_ZONEINFO_PATH:-/usr/share/zoneinfo}:/usr/share/zoneinfo:ro - ${HOST_ZONEINFO_PATH}:/usr/share/zoneinfo:ro
tmpfs: tmpfs:
- /var/lib/mysql-runtime:size=${MYSQL_RUNTIME_TMPFS_SIZE:-8G} - /var/lib/mysql-runtime:size=${MYSQL_RUNTIME_TMPFS_SIZE}
command: command:
- mysqld - mysqld
- --datadir=/var/lib/mysql-runtime - --datadir=/var/lib/mysql-runtime
- --default-authentication-plugin=mysql_native_password - --default-authentication-plugin=mysql_native_password
- --character-set-server=${MYSQL_CHARACTER_SET:-utf8mb4} - --character-set-server=${MYSQL_CHARACTER_SET}
- --collation-server=${MYSQL_COLLATION:-utf8mb4_unicode_ci} - --collation-server=${MYSQL_COLLATION}
- --max_connections=${MYSQL_MAX_CONNECTIONS:-1000} - --max_connections=${MYSQL_MAX_CONNECTIONS}
- --innodb-buffer-pool-size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-256M} - --innodb-buffer-pool-size=${MYSQL_INNODB_BUFFER_POOL_SIZE}
- --innodb-log-file-size=${MYSQL_INNODB_LOG_FILE_SIZE:-64M} - --innodb-log-file-size=${MYSQL_INNODB_LOG_FILE_SIZE}
- --innodb-redo-log-capacity=${MYSQL_INNODB_REDO_LOG_CAPACITY:-512M} - --innodb-redo-log-capacity=${MYSQL_INNODB_REDO_LOG_CAPACITY}
restart: unless-stopped restart: unless-stopped
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u ${MYSQL_USER:-root} -p${MYSQL_ROOT_PASSWORD:-azerothcore123} --silent || exit 1"] test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u ${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} --silent || exit 1"]
interval: ${MYSQL_HEALTHCHECK_INTERVAL:-20s} interval: ${MYSQL_HEALTHCHECK_INTERVAL}
timeout: ${MYSQL_HEALTHCHECK_TIMEOUT:-15s} timeout: ${MYSQL_HEALTHCHECK_TIMEOUT}
retries: ${MYSQL_HEALTHCHECK_RETRIES:-25} retries: ${MYSQL_HEALTHCHECK_RETRIES}
start_period: ${MYSQL_HEALTHCHECK_START_PERIOD:-120s} start_period: ${MYSQL_HEALTHCHECK_START_PERIOD}
networks: networks:
- azerothcore - azerothcore
ac-db-import: ac-db-import:
profiles: ["db"] profiles: ["db"]
image: ${AC_DB_IMPORT_IMAGE:-acore/ac-wotlk-db-import:14.0.0-dev} image: ${AC_DB_IMPORT_IMAGE}
container_name: ${CONTAINER_DB_IMPORT:-ac-db-import} container_name: ${CONTAINER_DB_IMPORT}
user: "0:0" user: "0:0"
depends_on: depends_on:
ac-mysql: ac-mysql:
@@ -56,16 +56,16 @@ services:
networks: networks:
- azerothcore - azerothcore
volumes: volumes:
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH:-./storage}/logs:/azerothcore/logs - ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH:-./storage}/mysql-data:/var/lib/mysql-persistent - ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
- ./scripts/db-import-conditional.sh:/tmp/db-import-conditional.sh:ro - ./scripts/db-import-conditional.sh:/tmp/db-import-conditional.sh:ro
environment: environment:
AC_DATA_DIR: "/azerothcore/data" AC_DATA_DIR: "/azerothcore/data"
AC_LOGS_DIR: "/azerothcore/logs" AC_LOGS_DIR: "/azerothcore/logs"
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_WORLD_NAME:-acore_world}" AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_CHARACTERS_NAME:-acore_characters}" AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_CLOSE_IDLE_CONNECTIONS: "false" AC_CLOSE_IDLE_CONNECTIONS: "false"
AC_UPDATES_ENABLE_DATABASES: "7" AC_UPDATES_ENABLE_DATABASES: "7"
AC_UPDATES_AUTO_SETUP: "1" AC_UPDATES_AUTO_SETUP: "1"
@@ -73,62 +73,62 @@ services:
AC_LOGGER_ROOT_CONFIG: "1,Console" AC_LOGGER_ROOT_CONFIG: "1,Console"
AC_LOGGER_SERVER_CONFIG: "1,Console" AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0" AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
CONTAINER_MYSQL: ${CONTAINER_MYSQL:-ac-mysql} CONTAINER_MYSQL: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT:-3306} MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER:-root} MYSQL_USER: ${MYSQL_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
DB_AUTH_NAME: ${DB_AUTH_NAME:-acore_auth} DB_AUTH_NAME: ${DB_AUTH_NAME}
DB_WORLD_NAME: ${DB_WORLD_NAME:-acore_world} DB_WORLD_NAME: ${DB_WORLD_NAME}
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME:-acore_characters} DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
CONTAINER_USER: ${CONTAINER_USER:-0:0} CONTAINER_USER: ${CONTAINER_USER}
entrypoint: entrypoint:
- sh - sh
- -c - -c
- | - |
chown ${CONTAINER_USER:-0:0} /azerothcore/env/dist/etc 2>/dev/null || true chown ${CONTAINER_USER} /azerothcore/env/dist/etc 2>/dev/null || true
echo "📥 Using local database import script..." echo "📥 Using local database import script..."
/tmp/db-import-conditional.sh /tmp/db-import-conditional.sh
restart: "no" restart: "no"
ac-db-init: ac-db-init:
profiles: ["db"] profiles: ["db"]
image: ${MYSQL_IMAGE:-mysql:8.0} image: ${MYSQL_IMAGE}
container_name: ${CONTAINER_DB_INIT:-ac-db-init} container_name: ${CONTAINER_DB_INIT}
depends_on: depends_on:
ac-db-import: ac-db-import:
condition: service_completed_successfully condition: service_completed_successfully
volumes: volumes:
- ${STORAGE_PATH:-./storage}/mysql-data:/var/lib/mysql-persistent - ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
- ${HOST_BACKUP_PATH:-${STORAGE_PATH:-./storage}/backups}:/backups - ${HOST_BACKUP_PATH}:/backups
networks: networks:
- azerothcore - azerothcore
environment: environment:
MYSQL_PWD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_PWD: ${MYSQL_ROOT_PASSWORD}
MYSQL_HOST: ${CONTAINER_MYSQL:-ac-mysql} MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_USER: ${MYSQL_USER:-root} MYSQL_USER: ${MYSQL_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
DB_WAIT_RETRIES: ${DB_WAIT_RETRIES:-60} DB_WAIT_RETRIES: ${DB_WAIT_RETRIES}
DB_WAIT_SLEEP: ${DB_WAIT_SLEEP:-10} DB_WAIT_SLEEP: ${DB_WAIT_SLEEP}
DB_AUTH_NAME: ${DB_AUTH_NAME:-acore_auth} DB_AUTH_NAME: ${DB_AUTH_NAME}
DB_WORLD_NAME: ${DB_WORLD_NAME:-acore_world} DB_WORLD_NAME: ${DB_WORLD_NAME}
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME:-acore_characters} DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET:-utf8mb4} MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET}
MYSQL_COLLATION: ${MYSQL_COLLATION:-utf8mb4_unicode_ci} MYSQL_COLLATION: ${MYSQL_COLLATION}
command: command:
- sh - sh
- -c - -c
- | - |
if [ -f "/var/lib/mysql-persistent/.restore-completed" ]; then if [ -f "/var/lib/mysql-persistent/.restore-completed" ]; then
echo "✅ Databases already restored from backup - init not needed"; exit 0; fi echo "✅ Databases already restored from backup - init not needed"; exit 0; fi
if mysql -h ${MYSQL_HOST:-ac-mysql} -u${MYSQL_USER:-root} -p${MYSQL_ROOT_PASSWORD:-azerothcore123} -e " if mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN ('${DB_AUTH_NAME:-acore_auth}', '${DB_WORLD_NAME:-acore_world}', '${DB_CHARACTERS_NAME:-acore_characters}');" -s -N 2>/dev/null | grep -q -v '^0$'; then SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN ('${DB_AUTH_NAME}', '${DB_WORLD_NAME}', '${DB_CHARACTERS_NAME}');" -s -N 2>/dev/null | grep -q -v '^0$'; then
echo "✅ Databases already populated - init not needed"; exit 0; fi echo "✅ Databases already populated - init not needed"; exit 0; fi
echo "🔧 Creating fresh AzerothCore databases..." echo "🔧 Creating fresh AzerothCore databases..."
microdnf install -y curl || yum install -y curl || (apt-get update && apt-get install -y curl) microdnf install -y curl || yum install -y curl || (apt-get update && apt-get install -y curl)
mysql -h ${MYSQL_HOST:-ac-mysql} -u${MYSQL_USER:-root} -p${MYSQL_ROOT_PASSWORD:-azerothcore123} -e " mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "
CREATE DATABASE IF NOT EXISTS ${DB_AUTH_NAME:-acore_auth} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET:-utf8mb4} COLLATE ${MYSQL_COLLATION:-utf8mb4_unicode_ci}; 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:-acore_world} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET:-utf8mb4} COLLATE ${MYSQL_COLLATION:-utf8mb4_unicode_ci}; 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:-acore_characters} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET:-utf8mb4} COLLATE ${MYSQL_COLLATION:-utf8mb4_unicode_ci}; 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; } SHOW DATABASES;" || { echo "❌ Failed to create databases"; exit 1; }
echo "$(date): Fresh databases created - import needed" > /var/lib/mysql-persistent/.restore-failed echo "$(date): Fresh databases created - import needed" > /var/lib/mysql-persistent/.restore-failed
echo "✅ Fresh databases created!" echo "✅ Fresh databases created!"
@@ -136,25 +136,25 @@ services:
ac-backup: ac-backup:
profiles: ["db"] profiles: ["db"]
image: ${MYSQL_IMAGE:-mysql:8.0} image: ${MYSQL_IMAGE}
container_name: ${CONTAINER_BACKUP:-ac-backup} container_name: ${CONTAINER_BACKUP}
depends_on: depends_on:
ac-db-import: ac-db-import:
condition: service_completed_successfully condition: service_completed_successfully
environment: environment:
MYSQL_HOST: ${CONTAINER_MYSQL:-ac-mysql} MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT:-3306} MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER:-root} MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-3} BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS}
BACKUP_RETENTION_HOURS: ${BACKUP_RETENTION_HOURS:-6} BACKUP_RETENTION_HOURS: ${BACKUP_RETENTION_HOURS}
BACKUP_DAILY_TIME: ${BACKUP_DAILY_TIME:-09} BACKUP_DAILY_TIME: ${BACKUP_DAILY_TIME}
DB_AUTH_NAME: ${DB_AUTH_NAME:-acore_auth} DB_AUTH_NAME: ${DB_AUTH_NAME}
DB_WORLD_NAME: ${DB_WORLD_NAME:-acore_world} DB_WORLD_NAME: ${DB_WORLD_NAME}
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME:-acore_characters} DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
TZ: ${TZ:-UTC} TZ: ${TZ}
volumes: volumes:
- ${HOST_BACKUP_PATH:-${STORAGE_PATH:-./storage}/backups}:/backups - ${HOST_BACKUP_PATH}:/backups
- ./scripts:/tmp/scripts:ro - ./scripts:/tmp/scripts:ro
working_dir: /tmp working_dir: /tmp
command: command:
@@ -170,6 +170,22 @@ services:
echo "No local scheduler provided" echo "No local scheduler provided"
fi fi
restart: unless-stopped restart: unless-stopped
healthcheck:
test:
- "CMD"
- "sh"
- "-c"
- >
mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'
>/dev/null 2>&1 &&
(
find /backups -name '*.sql.gz' -mmin -${BACKUP_HEALTHCHECK_MAX_MINUTES} -print -quit >/dev/null ||
awk -v limit=${BACKUP_HEALTHCHECK_GRACE_SECONDS} 'NR==1 { exit ($1 < limit) ? 0 : 1 }' /proc/uptime
)
interval: ${BACKUP_HEALTHCHECK_INTERVAL}
timeout: ${BACKUP_HEALTHCHECK_TIMEOUT}
retries: ${BACKUP_HEALTHCHECK_RETRIES}
start_period: ${BACKUP_HEALTHCHECK_START_PERIOD}
networks: networks:
- azerothcore - azerothcore
@@ -178,17 +194,17 @@ services:
# ===================== # =====================
ac-client-data-standard: ac-client-data-standard:
profiles: ["client-data"] profiles: ["client-data"]
image: ${AC_CLIENT_DATA_IMAGE:-acore/ac-wotlk-client-data:14.0.0-dev} image: ${AC_CLIENT_DATA_IMAGE}
container_name: ac-client-data container_name: ac-client-data
user: "0:0" user: "0:0"
volumes: volumes:
- ac-client-data:/azerothcore/data - ac-client-data:/azerothcore/data
- ${CLIENT_DATA_CACHE_PATH:-${STORAGE_PATH_LOCAL:-./local-storage}/client-data-cache}:/cache - ${CLIENT_DATA_CACHE_PATH}:/cache
- ./scripts:/tmp/scripts:ro - ./scripts:/tmp/scripts:ro
working_dir: /tmp working_dir: /tmp
environment: environment:
- CONTAINER_USER=${CONTAINER_USER:-0:0} - CONTAINER_USER=${CONTAINER_USER}
- CLIENT_DATA_VERSION=${CLIENT_DATA_VERSION:-} - CLIENT_DATA_VERSION=${CLIENT_DATA_VERSION}
command: command:
- sh - sh
- -c - -c
@@ -200,7 +216,7 @@ services:
elif command -v yum >/dev/null 2>&1; then elif command -v yum >/dev/null 2>&1; then
yum install -y curl unzip wget bash ca-certificates p7zip aria2 jq yum install -y curl unzip wget bash ca-certificates p7zip aria2 jq
fi fi
mkdir -p /cache && chown ${CONTAINER_USER:-0:0} /cache /azerothcore/data 2>/dev/null || true mkdir -p /cache && chown ${CONTAINER_USER} /cache /azerothcore/data 2>/dev/null || true
if [ -f /tmp/scripts/download-client-data.sh ]; then if [ -f /tmp/scripts/download-client-data.sh ]; then
chmod +x /tmp/scripts/download-client-data.sh 2>/dev/null || true chmod +x /tmp/scripts/download-client-data.sh 2>/dev/null || true
bash /tmp/scripts/download-client-data.sh bash /tmp/scripts/download-client-data.sh
@@ -213,17 +229,17 @@ services:
ac-client-data-playerbots: ac-client-data-playerbots:
profiles: ["client-data-bots"] profiles: ["client-data-bots"]
image: ${AC_CLIENT_DATA_IMAGE_PLAYERBOTS:-uprightbass360/azerothcore-wotlk-playerbots:client-data-Playerbot} image: ${AC_CLIENT_DATA_IMAGE_PLAYERBOTS}
container_name: ac-client-data container_name: ac-client-data
user: "0:0" user: "0:0"
volumes: volumes:
- ac-client-data:/azerothcore/data - ac-client-data:/azerothcore/data
- ${CLIENT_DATA_CACHE_PATH:-${STORAGE_PATH_LOCAL:-./local-storage}/client-data-cache}:/cache - ${CLIENT_DATA_CACHE_PATH}:/cache
- ./scripts:/tmp/scripts:ro - ./scripts:/tmp/scripts:ro
working_dir: /tmp working_dir: /tmp
environment: environment:
- CONTAINER_USER=${CONTAINER_USER:-0:0} - CONTAINER_USER=${CONTAINER_USER}
- CLIENT_DATA_VERSION=${CLIENT_DATA_VERSION:-} - CLIENT_DATA_VERSION=${CLIENT_DATA_VERSION}
command: command:
- sh - sh
- -c - -c
@@ -235,7 +251,7 @@ services:
elif command -v yum >/dev/null 2>&1; then elif command -v yum >/dev/null 2>&1; then
yum install -y curl unzip wget bash ca-certificates p7zip aria2 jq yum install -y curl unzip wget bash ca-certificates p7zip aria2 jq
fi fi
mkdir -p /cache && chown ${CONTAINER_USER:-0:0} /cache /azerothcore/data 2>/dev/null || true mkdir -p /cache && chown ${CONTAINER_USER} /cache /azerothcore/data 2>/dev/null || true
if [ -f /tmp/scripts/download-client-data.sh ]; then if [ -f /tmp/scripts/download-client-data.sh ]; then
chmod +x /tmp/scripts/download-client-data.sh 2>/dev/null || true chmod +x /tmp/scripts/download-client-data.sh 2>/dev/null || true
bash /tmp/scripts/download-client-data.sh bash /tmp/scripts/download-client-data.sh
@@ -251,9 +267,9 @@ services:
# ===================== # =====================
ac-authserver-standard: ac-authserver-standard:
profiles: ["services-standard"] profiles: ["services-standard"]
image: ${AC_AUTHSERVER_IMAGE:-acore/ac-wotlk-authserver:14.0.0-dev} image: ${AC_AUTHSERVER_IMAGE}
container_name: ac-authserver container_name: ac-authserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
depends_on: depends_on:
ac-mysql: ac-mysql:
condition: service_healthy condition: service_healthy
@@ -262,7 +278,7 @@ services:
ac-db-init: ac-db-init:
condition: service_completed_successfully condition: service_completed_successfully
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1" AC_LOG_LEVEL: "1"
@@ -270,78 +286,78 @@ services:
AC_LOGGER_SERVER_CONFIG: "1,Console" AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0" AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports: ports:
- "${AUTH_EXTERNAL_PORT:-3784}:${AUTH_PORT:-3724}" - "${AUTH_EXTERNAL_PORT}:${AUTH_PORT}"
restart: unless-stopped restart: unless-stopped
networks: networks:
- azerothcore - azerothcore
volumes: volumes:
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: ${AUTH_HEALTHCHECK_INTERVAL:-30s} interval: ${AUTH_HEALTHCHECK_INTERVAL}
timeout: ${AUTH_HEALTHCHECK_TIMEOUT:-10s} timeout: ${AUTH_HEALTHCHECK_TIMEOUT}
retries: ${AUTH_HEALTHCHECK_RETRIES:-3} retries: ${AUTH_HEALTHCHECK_RETRIES}
start_period: ${AUTH_HEALTHCHECK_START_PERIOD:-60s} start_period: ${AUTH_HEALTHCHECK_START_PERIOD}
ac-worldserver-standard: ac-worldserver-standard:
profiles: ["services-standard"] profiles: ["services-standard"]
image: ${AC_WORLDSERVER_IMAGE:-acore/ac-wotlk-worldserver:14.0.0-dev} image: ${AC_WORLDSERVER_IMAGE}
container_name: ac-worldserver container_name: ac-worldserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
stdin_open: true stdin_open: true
tty: true tty: true
depends_on: depends_on:
- ac-authserver-standard - ac-authserver-standard
- ac-client-data-standard - ac-client-data-standard
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_WORLD_NAME:-acore_world}" AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_CHARACTERS_NAME:-acore_characters}" AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data" AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878" AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0" AC_PROCESS_PRIORITY: "0"
AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED:-1}" AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED}"
AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK:-1}" AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK}"
AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD:-1}" AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD}"
AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE:-1}" AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE}"
AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH:-lua_scripts}" AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH}"
AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS:-}" AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS}"
AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS:-}" AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS}"
AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL:-1}" AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL}"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED:-0}" PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS:-40}" PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS}"
AC_LOG_LEVEL: "2" AC_LOG_LEVEL: "2"
ports: ports:
- "${WORLD_EXTERNAL_PORT:-8215}:${WORLD_PORT:-8085}" - "${WORLD_EXTERNAL_PORT}:${WORLD_PORT}"
- "${SOAP_EXTERNAL_PORT:-7778}:${SOAP_PORT:-7878}" - "${SOAP_EXTERNAL_PORT}:${SOAP_PORT}"
volumes: volumes:
- ac-client-data:/azerothcore/data - ac-client-data:/azerothcore/data
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH:-./storage}/logs:/azerothcore/logs - ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH:-./storage}/modules:/azerothcore/modules - ${STORAGE_PATH}/modules:/azerothcore/modules
- ${STORAGE_PATH:-./storage}/lua_scripts:/azerothcore/lua_scripts - ${STORAGE_PATH}/lua_scripts:/azerothcore/lua_scripts
restart: unless-stopped restart: unless-stopped
networks: networks:
- azerothcore - azerothcore
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: ${WORLD_HEALTHCHECK_INTERVAL:-30s} interval: ${WORLD_HEALTHCHECK_INTERVAL}
timeout: ${WORLD_HEALTHCHECK_TIMEOUT:-10s} timeout: ${WORLD_HEALTHCHECK_TIMEOUT}
retries: ${WORLD_HEALTHCHECK_RETRIES:-3} retries: ${WORLD_HEALTHCHECK_RETRIES}
start_period: ${WORLD_HEALTHCHECK_START_PERIOD:-120s} start_period: ${WORLD_HEALTHCHECK_START_PERIOD}
# ===================== # =====================
# Services - Playerbots (services-playerbots) # Services - Playerbots (services-playerbots)
# ===================== # =====================
ac-authserver-playerbots: ac-authserver-playerbots:
profiles: ["services-playerbots"] profiles: ["services-playerbots"]
image: ${AC_AUTHSERVER_IMAGE_PLAYERBOTS:-uprightbass360/azerothcore-wotlk-playerbots:authserver-Playerbot} image: ${AC_AUTHSERVER_IMAGE_PLAYERBOTS}
container_name: ac-authserver container_name: ac-authserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
depends_on: depends_on:
ac-mysql: ac-mysql:
condition: service_healthy condition: service_healthy
@@ -350,7 +366,7 @@ services:
ac-db-init: ac-db-init:
condition: service_completed_successfully condition: service_completed_successfully
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1" AC_LOG_LEVEL: "1"
@@ -358,25 +374,25 @@ services:
AC_LOGGER_SERVER_CONFIG: "1,Console" AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0" AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports: ports:
- "${AUTH_EXTERNAL_PORT:-3784}:${AUTH_PORT:-3724}" - "${AUTH_EXTERNAL_PORT}:${AUTH_PORT}"
restart: unless-stopped restart: unless-stopped
networks: networks:
- azerothcore - azerothcore
volumes: volumes:
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: ${AUTH_HEALTHCHECK_INTERVAL:-30s} interval: ${AUTH_HEALTHCHECK_INTERVAL}
timeout: ${AUTH_HEALTHCHECK_TIMEOUT:-10s} timeout: ${AUTH_HEALTHCHECK_TIMEOUT}
retries: ${AUTH_HEALTHCHECK_RETRIES:-3} retries: ${AUTH_HEALTHCHECK_RETRIES}
start_period: ${AUTH_HEALTHCHECK_START_PERIOD:-60s} start_period: ${AUTH_HEALTHCHECK_START_PERIOD}
ac-authserver-modules: ac-authserver-modules:
profiles: ["services-modules"] profiles: ["services-modules"]
image: ${AC_AUTHSERVER_IMAGE_MODULES:-acore/ac-wotlk-authserver:modules-latest} image: ${AC_AUTHSERVER_IMAGE_MODULES}
container_name: ac-authserver container_name: ac-authserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
depends_on: depends_on:
ac-mysql: ac-mysql:
condition: service_healthy condition: service_healthy
@@ -385,7 +401,7 @@ services:
ac-db-init: ac-db-init:
condition: service_completed_successfully condition: service_completed_successfully
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_LOG_LEVEL: "1" AC_LOG_LEVEL: "1"
@@ -393,127 +409,127 @@ services:
AC_LOGGER_SERVER_CONFIG: "1,Console" AC_LOGGER_SERVER_CONFIG: "1,Console"
AC_APPENDER_CONSOLE_CONFIG: "1,2,0" AC_APPENDER_CONSOLE_CONFIG: "1,2,0"
ports: ports:
- "${AUTH_EXTERNAL_PORT:-3784}:${AUTH_PORT:-3724}" - "${AUTH_EXTERNAL_PORT}:${AUTH_PORT}"
restart: unless-stopped restart: unless-stopped
networks: networks:
- azerothcore - azerothcore
volumes: volumes:
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[a]uthserver' | grep -v grep || exit 1"]
interval: ${AUTH_HEALTHCHECK_INTERVAL:-30s} interval: ${AUTH_HEALTHCHECK_INTERVAL}
timeout: ${AUTH_HEALTHCHECK_TIMEOUT:-10s} timeout: ${AUTH_HEALTHCHECK_TIMEOUT}
retries: ${AUTH_HEALTHCHECK_RETRIES:-3} retries: ${AUTH_HEALTHCHECK_RETRIES}
start_period: ${AUTH_HEALTHCHECK_START_PERIOD:-60s} start_period: ${AUTH_HEALTHCHECK_START_PERIOD}
ac-worldserver-playerbots: ac-worldserver-playerbots:
profiles: ["services-playerbots"] profiles: ["services-playerbots"]
image: ${AC_WORLDSERVER_IMAGE_PLAYERBOTS:-uprightbass360/azerothcore-wotlk-playerbots:worldserver-Playerbot} image: ${AC_WORLDSERVER_IMAGE_PLAYERBOTS}
container_name: ac-worldserver container_name: ac-worldserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
stdin_open: true stdin_open: true
tty: true tty: true
depends_on: depends_on:
- ac-authserver-playerbots - ac-authserver-playerbots
- ac-client-data-playerbots - ac-client-data-playerbots
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_WORLD_NAME:-acore_world}" AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_CHARACTERS_NAME:-acore_characters}" AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data" AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878" AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0" AC_PROCESS_PRIORITY: "0"
AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED:-1}" AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED}"
AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK:-1}" AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK}"
AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD:-1}" AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD}"
AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE:-1}" AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE}"
AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH:-lua_scripts}" AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH}"
AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS:-}" AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS}"
AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS:-}" AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS}"
AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL:-1}" AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL}"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED:-1}" PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS:-40}" PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS}"
AC_LOG_LEVEL: "2" AC_LOG_LEVEL: "2"
ports: ports:
- "${WORLD_EXTERNAL_PORT:-8215}:${WORLD_PORT:-8085}" - "${WORLD_EXTERNAL_PORT}:${WORLD_PORT}"
- "${SOAP_EXTERNAL_PORT:-7778}:${SOAP_PORT:-7878}" - "${SOAP_EXTERNAL_PORT}:${SOAP_PORT}"
volumes: volumes:
- ac-client-data:/azerothcore/data - ac-client-data:/azerothcore/data
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH:-./storage}/logs:/azerothcore/logs - ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH:-./storage}/modules:/azerothcore/modules - ${STORAGE_PATH}/modules:/azerothcore/modules
- ${STORAGE_PATH:-./storage}/lua_scripts:/azerothcore/lua_scripts - ${STORAGE_PATH}/lua_scripts:/azerothcore/lua_scripts
restart: unless-stopped restart: unless-stopped
networks: networks:
- azerothcore - azerothcore
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: ${WORLD_HEALTHCHECK_INTERVAL:-30s} interval: ${WORLD_HEALTHCHECK_INTERVAL}
timeout: ${WORLD_HEALTHCHECK_TIMEOUT:-10s} timeout: ${WORLD_HEALTHCHECK_TIMEOUT}
retries: ${WORLD_HEALTHCHECK_RETRIES:-3} retries: ${WORLD_HEALTHCHECK_RETRIES}
start_period: ${WORLD_HEALTHCHECK_START_PERIOD:-120s} start_period: ${WORLD_HEALTHCHECK_START_PERIOD}
ac-worldserver-modules: ac-worldserver-modules:
profiles: ["services-modules"] profiles: ["services-modules"]
image: ${AC_WORLDSERVER_IMAGE_MODULES:-acore/ac-wotlk-worldserver:modules-latest} image: ${AC_WORLDSERVER_IMAGE_MODULES}
container_name: ac-worldserver container_name: ac-worldserver
user: "${CONTAINER_USER:-0:0}" user: "${CONTAINER_USER}"
stdin_open: true stdin_open: true
tty: true tty: true
depends_on: depends_on:
- ac-authserver-modules - ac-authserver-modules
- ac-client-data-standard - ac-client-data-standard
environment: environment:
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_AUTH_NAME:-acore_auth}" AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_WORLD_NAME:-acore_world}" AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL:-ac-mysql};${MYSQL_PORT:-3306};${MYSQL_USER:-root};${MYSQL_ROOT_PASSWORD:-azerothcore123};${DB_CHARACTERS_NAME:-acore_characters}" AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
AC_UPDATES_ENABLE_DATABASES: "0" AC_UPDATES_ENABLE_DATABASES: "0"
AC_BIND_IP: "0.0.0.0" AC_BIND_IP: "0.0.0.0"
AC_DATA_DIR: "/azerothcore/data" AC_DATA_DIR: "/azerothcore/data"
AC_SOAP_PORT: "7878" AC_SOAP_PORT: "7878"
AC_PROCESS_PRIORITY: "0" AC_PROCESS_PRIORITY: "0"
AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED:-1}" AC_ELUNA_ENABLED: "${AC_ELUNA_ENABLED}"
AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK:-1}" AC_ELUNA_TRACE_BACK: "${AC_ELUNA_TRACE_BACK}"
AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD:-1}" AC_ELUNA_AUTO_RELOAD: "${AC_ELUNA_AUTO_RELOAD}"
AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE:-1}" AC_ELUNA_BYTECODE_CACHE: "${AC_ELUNA_BYTECODE_CACHE}"
AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH:-lua_scripts}" AC_ELUNA_SCRIPT_PATH: "${AC_ELUNA_SCRIPT_PATH}"
AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS:-}" AC_ELUNA_REQUIRE_PATHS: "${AC_ELUNA_REQUIRE_PATHS}"
AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS:-}" AC_ELUNA_REQUIRE_CPATHS: "${AC_ELUNA_REQUIRE_CPATHS}"
AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL:-1}" AC_ELUNA_AUTO_RELOAD_INTERVAL: "${AC_ELUNA_AUTO_RELOAD_INTERVAL}"
PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED:-0}" PLAYERBOT_ENABLED: "${PLAYERBOT_ENABLED}"
PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS:-40}" PLAYERBOT_MAX_BOTS: "${PLAYERBOT_MAX_BOTS}"
AC_LOG_LEVEL: "2" AC_LOG_LEVEL: "2"
volumes: volumes:
- ac-client-data:/azerothcore/data - ac-client-data:/azerothcore/data
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ${STORAGE_PATH:-./storage}/logs:/azerothcore/logs - ${STORAGE_PATH}/logs:/azerothcore/logs
- ${STORAGE_PATH:-./storage}/modules:/azerothcore/modules - ${STORAGE_PATH}/modules:/azerothcore/modules
- ${STORAGE_PATH:-./storage}/lua_scripts:/azerothcore/lua_scripts - ${STORAGE_PATH}/lua_scripts:/azerothcore/lua_scripts
networks: networks:
- azerothcore - azerothcore
ports: ports:
- "${WORLD_EXTERNAL_PORT:-8215}:${WORLD_PORT:-8085}" - "${WORLD_EXTERNAL_PORT}:${WORLD_PORT}"
- "${SOAP_EXTERNAL_PORT:-7778}:${SOAP_PORT:-7878}" - "${SOAP_EXTERNAL_PORT}:${SOAP_PORT}"
restart: unless-stopped restart: unless-stopped
cap_add: ["SYS_NICE"] cap_add: ["SYS_NICE"]
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"] test: ["CMD", "sh", "-c", "ps aux | grep '[w]orldserver' | grep -v grep || exit 1"]
interval: ${WORLD_HEALTHCHECK_INTERVAL:-30s} interval: ${WORLD_HEALTHCHECK_INTERVAL}
timeout: ${WORLD_HEALTHCHECK_TIMEOUT:-10s} timeout: ${WORLD_HEALTHCHECK_TIMEOUT}
retries: ${WORLD_HEALTHCHECK_RETRIES:-3} retries: ${WORLD_HEALTHCHECK_RETRIES}
start_period: ${WORLD_HEALTHCHECK_START_PERIOD:-120s} start_period: ${WORLD_HEALTHCHECK_START_PERIOD}
# ===================== # =====================
# Modules & Post-install (modules) # Modules & Post-install (modules)
# ===================== # =====================
ac-modules: ac-modules:
profiles: ["modules"] profiles: ["modules"]
image: ${ALPINE_GIT_IMAGE:-alpine/git:latest} image: ${ALPINE_GIT_IMAGE}
container_name: ${CONTAINER_MODULES:-ac-modules} container_name: ${CONTAINER_MODULES}
user: "0:0" user: "0:0"
depends_on: depends_on:
ac-mysql: ac-mysql:
@@ -523,51 +539,51 @@ services:
ac-db-init: ac-db-init:
condition: service_completed_successfully condition: service_completed_successfully
volumes: volumes:
- ${STORAGE_PATH:-./storage}/modules:/modules - ${STORAGE_PATH}/modules:/modules
- ${STORAGE_PATH:-./storage}/config:/azerothcore/env/dist/etc - ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
- ./scripts:/tmp/scripts:ro - ./scripts:/tmp/scripts:ro
environment: environment:
- MODULE_PLAYERBOTS=${MODULE_PLAYERBOTS:-0} - MODULE_PLAYERBOTS=${MODULE_PLAYERBOTS}
- MODULE_AOE_LOOT=${MODULE_AOE_LOOT:-0} - MODULE_AOE_LOOT=${MODULE_AOE_LOOT}
- MODULE_LEARN_SPELLS=${MODULE_LEARN_SPELLS:-0} - MODULE_LEARN_SPELLS=${MODULE_LEARN_SPELLS}
- MODULE_FIREWORKS=${MODULE_FIREWORKS:-0} - MODULE_FIREWORKS=${MODULE_FIREWORKS}
- MODULE_INDIVIDUAL_PROGRESSION=${MODULE_INDIVIDUAL_PROGRESSION:-0} - MODULE_INDIVIDUAL_PROGRESSION=${MODULE_INDIVIDUAL_PROGRESSION}
- MODULE_AHBOT=${MODULE_AHBOT:-0} - MODULE_AHBOT=${MODULE_AHBOT}
- MODULE_AUTOBALANCE=${MODULE_AUTOBALANCE:-0} - MODULE_AUTOBALANCE=${MODULE_AUTOBALANCE}
- MODULE_TRANSMOG=${MODULE_TRANSMOG:-0} - MODULE_TRANSMOG=${MODULE_TRANSMOG}
- MODULE_NPC_BUFFER=${MODULE_NPC_BUFFER:-0} - MODULE_NPC_BUFFER=${MODULE_NPC_BUFFER}
- MODULE_DYNAMIC_XP=${MODULE_DYNAMIC_XP:-0} - MODULE_DYNAMIC_XP=${MODULE_DYNAMIC_XP}
- MODULE_SOLO_LFG=${MODULE_SOLO_LFG:-0} - MODULE_SOLO_LFG=${MODULE_SOLO_LFG}
- MODULE_1V1_ARENA=${MODULE_1V1_ARENA:-0} - MODULE_1V1_ARENA=${MODULE_1V1_ARENA}
- MODULE_PHASED_DUELS=${MODULE_PHASED_DUELS:-0} - MODULE_PHASED_DUELS=${MODULE_PHASED_DUELS}
- MODULE_BREAKING_NEWS=${MODULE_BREAKING_NEWS:-0} - MODULE_BREAKING_NEWS=${MODULE_BREAKING_NEWS}
- MODULE_BOSS_ANNOUNCER=${MODULE_BOSS_ANNOUNCER:-0} - MODULE_BOSS_ANNOUNCER=${MODULE_BOSS_ANNOUNCER}
- MODULE_ACCOUNT_ACHIEVEMENTS=${MODULE_ACCOUNT_ACHIEVEMENTS:-0} - MODULE_ACCOUNT_ACHIEVEMENTS=${MODULE_ACCOUNT_ACHIEVEMENTS}
- MODULE_AUTO_REVIVE=${MODULE_AUTO_REVIVE:-0} - MODULE_AUTO_REVIVE=${MODULE_AUTO_REVIVE}
- MODULE_GAIN_HONOR_GUARD=${MODULE_GAIN_HONOR_GUARD:-0} - MODULE_GAIN_HONOR_GUARD=${MODULE_GAIN_HONOR_GUARD}
- MODULE_ELUNA=${MODULE_ELUNA:-0} - MODULE_ELUNA=${MODULE_ELUNA}
- MODULE_ARAC=${MODULE_ARAC:-0} - MODULE_ARAC=${MODULE_ARAC}
- MODULE_TIME_IS_TIME=${MODULE_TIME_IS_TIME:-0} - MODULE_TIME_IS_TIME=${MODULE_TIME_IS_TIME}
- MODULE_POCKET_PORTAL=${MODULE_POCKET_PORTAL:-0} - MODULE_POCKET_PORTAL=${MODULE_POCKET_PORTAL}
- MODULE_RANDOM_ENCHANTS=${MODULE_RANDOM_ENCHANTS:-0} - MODULE_RANDOM_ENCHANTS=${MODULE_RANDOM_ENCHANTS}
- MODULE_SOLOCRAFT=${MODULE_SOLOCRAFT:-0} - MODULE_SOLOCRAFT=${MODULE_SOLOCRAFT}
- MODULE_PVP_TITLES=${MODULE_PVP_TITLES:-0} - MODULE_PVP_TITLES=${MODULE_PVP_TITLES}
- MODULE_NPC_BEASTMASTER=${MODULE_NPC_BEASTMASTER:-0} - MODULE_NPC_BEASTMASTER=${MODULE_NPC_BEASTMASTER}
- MODULE_NPC_ENCHANTER=${MODULE_NPC_ENCHANTER:-0} - MODULE_NPC_ENCHANTER=${MODULE_NPC_ENCHANTER}
- MODULE_INSTANCE_RESET=${MODULE_INSTANCE_RESET:-0} - MODULE_INSTANCE_RESET=${MODULE_INSTANCE_RESET}
- MODULE_LEVEL_GRANT=${MODULE_LEVEL_GRANT:-0} - MODULE_LEVEL_GRANT=${MODULE_LEVEL_GRANT}
- MODULE_ASSISTANT=${MODULE_ASSISTANT:-0} - MODULE_ASSISTANT=${MODULE_ASSISTANT}
- MODULE_REAGENT_BANK=${MODULE_REAGENT_BANK:-0} - MODULE_REAGENT_BANK=${MODULE_REAGENT_BANK}
- MODULE_BLACK_MARKET_AUCTION_HOUSE=${MODULE_BLACK_MARKET_AUCTION_HOUSE:-0} - MODULE_BLACK_MARKET_AUCTION_HOUSE=${MODULE_BLACK_MARKET_AUCTION_HOUSE}
- CONTAINER_MYSQL=${CONTAINER_MYSQL:-ac-mysql} - CONTAINER_MYSQL=${CONTAINER_MYSQL}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-azerothcore123} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- DB_AUTH_NAME=${DB_AUTH_NAME:-acore_auth} - DB_AUTH_NAME=${DB_AUTH_NAME}
- DB_WORLD_NAME=${DB_WORLD_NAME:-acore_world} - DB_WORLD_NAME=${DB_WORLD_NAME}
- DB_CHARACTERS_NAME=${DB_CHARACTERS_NAME:-acore_characters} - DB_CHARACTERS_NAME=${DB_CHARACTERS_NAME}
- DB_PLAYERBOTS_NAME=${DB_PLAYERBOTS_NAME:-acore_playerbots} - DB_PLAYERBOTS_NAME=${DB_PLAYERBOTS_NAME}
- MYSQL_CHARACTER_SET=${MYSQL_CHARACTER_SET:-utf8mb4} - MYSQL_CHARACTER_SET=${MYSQL_CHARACTER_SET}
- MYSQL_COLLATION=${MYSQL_COLLATION:-utf8mb4_unicode_ci} - MYSQL_COLLATION=${MYSQL_COLLATION}
- CONTAINER_USER=${CONTAINER_USER:-0:0} - CONTAINER_USER=${CONTAINER_USER}
entrypoint: ["/bin/sh"] entrypoint: ["/bin/sh"]
command: command:
- -c - -c
@@ -579,33 +595,33 @@ services:
ac-post-install: ac-post-install:
profiles: ["modules"] profiles: ["modules"]
image: ${ALPINE_IMAGE:-alpine:latest} image: ${ALPINE_IMAGE}
container_name: ${CONTAINER_POST_INSTALL:-ac-post-install} container_name: ${CONTAINER_POST_INSTALL}
user: "0:0" user: "0:0"
volumes: volumes:
- ${STORAGE_PATH:-./storage}/config:/azerothcore/config - ${STORAGE_PATH}/config:/azerothcore/config
- ${STORAGE_PATH:-./storage}/install-markers:/install-markers - ${STORAGE_PATH}/install-markers:/install-markers
- ./scripts:/tmp/scripts:ro - ./scripts:/tmp/scripts:ro
- /var/run/docker.sock:/var/run/docker.sock:rw - /var/run/docker.sock:/var/run/docker.sock:rw
working_dir: /tmp working_dir: /tmp
environment: environment:
MYSQL_HOST: ${CONTAINER_MYSQL:-ac-mysql} MYSQL_HOST: ${CONTAINER_MYSQL}
MYSQL_PORT: ${MYSQL_PORT:-3306} MYSQL_PORT: ${MYSQL_PORT}
MYSQL_USER: ${MYSQL_USER:-root} MYSQL_USER: ${MYSQL_USER}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
DB_AUTH_NAME: ${DB_AUTH_NAME:-acore_auth} DB_AUTH_NAME: ${DB_AUTH_NAME}
DB_WORLD_NAME: ${DB_WORLD_NAME:-acore_world} DB_WORLD_NAME: ${DB_WORLD_NAME}
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME:-acore_characters} DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
DB_PLAYERBOTS_NAME: ${DB_PLAYERBOTS_NAME:-acore_playerbots} DB_PLAYERBOTS_NAME: ${DB_PLAYERBOTS_NAME}
MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET:-utf8mb4} MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET}
MYSQL_COLLATION: ${MYSQL_COLLATION:-utf8mb4_unicode_ci} MYSQL_COLLATION: ${MYSQL_COLLATION}
STORAGE_PATH: ${STORAGE_PATH:-./storage} STORAGE_PATH: ${STORAGE_PATH}
SERVER_ADDRESS: ${SERVER_ADDRESS:-127.0.0.1} SERVER_ADDRESS: ${SERVER_ADDRESS}
REALM_PORT: ${REALM_PORT:-8215} REALM_PORT: ${REALM_PORT}
NETWORK_NAME: ${NETWORK_NAME:-azerothcore} NETWORK_NAME: ${NETWORK_NAME}
CONTAINER_AUTHSERVER: ac-authserver CONTAINER_AUTHSERVER: ac-authserver
CONTAINER_WORLDSERVER: ac-worldserver CONTAINER_WORLDSERVER: ac-worldserver
CONTAINER_USER: ${CONTAINER_USER:-0:0} CONTAINER_USER: ${CONTAINER_USER}
depends_on: depends_on:
ac-modules: ac-modules:
condition: service_completed_successfully condition: service_completed_successfully
@@ -616,7 +632,7 @@ services:
- -c - -c
- | - |
apk add --no-cache bash curl docker-cli apk add --no-cache bash curl docker-cli
chown ${CONTAINER_USER:-0:0} /azerothcore/config /install-markers 2>/dev/null || true chown ${CONTAINER_USER} /azerothcore/config /install-markers 2>/dev/null || true
echo "📥 Running local auto-post-install script..." echo "📥 Running local auto-post-install script..."
(chmod +x /tmp/scripts/auto-post-install.sh 2>/dev/null || true) && bash /tmp/scripts/auto-post-install.sh (chmod +x /tmp/scripts/auto-post-install.sh 2>/dev/null || true) && bash /tmp/scripts/auto-post-install.sh
restart: "no" restart: "no"
@@ -631,18 +647,18 @@ services:
image: phpmyadmin/phpmyadmin:latest image: phpmyadmin/phpmyadmin:latest
container_name: ac-phpmyadmin container_name: ac-phpmyadmin
environment: environment:
PMA_HOST: ${PMA_HOST:-ac-mysql} PMA_HOST: ${PMA_HOST}
PMA_PORT: ${PMA_PORT:-3306} PMA_PORT: ${PMA_PORT}
PMA_USER: ${PMA_USER:-root} PMA_USER: ${PMA_USER}
PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-azerothcore123} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
PMA_ARBITRARY: ${PMA_ARBITRARY:-1} PMA_ARBITRARY: ${PMA_ARBITRARY}
PMA_ABSOLUTE_URI: ${PMA_ABSOLUTE_URI:-} PMA_ABSOLUTE_URI: ${PMA_ABSOLUTE_URI}
UPLOAD_LIMIT: ${PMA_UPLOAD_LIMIT:-300M} UPLOAD_LIMIT: ${PMA_UPLOAD_LIMIT}
MEMORY_LIMIT: ${PMA_MEMORY_LIMIT:-512M} MEMORY_LIMIT: ${PMA_MEMORY_LIMIT}
MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME:-600} MAX_EXECUTION_TIME: ${PMA_MAX_EXECUTION_TIME}
ports: ports:
- "${PMA_EXTERNAL_PORT:-8081}:80" - "${PMA_EXTERNAL_PORT}:80"
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "curl -fsS http://localhost:80/ || exit 1"] test: ["CMD", "sh", "-c", "curl -fsS http://localhost:80/ || exit 1"]
interval: 30s interval: 30s
@@ -662,13 +678,13 @@ services:
- NODE_ENV=production - NODE_ENV=production
- KEIRA_PORT=8080 - KEIRA_PORT=8080
- KEIRA_HOST=0.0.0.0 - KEIRA_HOST=0.0.0.0
- KEIRA_DATABASE_HOST=${KEIRA_DATABASE_HOST:-ac-mysql} - KEIRA_DATABASE_HOST=${KEIRA_DATABASE_HOST}
- KEIRA_DATABASE_PORT=${KEIRA_DATABASE_PORT:-3306} - KEIRA_DATABASE_PORT=${KEIRA_DATABASE_PORT}
- KEIRA_DATABASE_USER=root - KEIRA_DATABASE_USER=root
- KEIRA_DATABASE_PASSWORD=${MYSQL_ROOT_PASSWORD:-azerothcore123} - KEIRA_DATABASE_PASSWORD=${MYSQL_ROOT_PASSWORD}
- KEIRA_DATABASE_NAME=${DB_WORLD_NAME:-acore_world} - KEIRA_DATABASE_NAME=${DB_WORLD_NAME}
ports: ports:
- "${KEIRA3_EXTERNAL_PORT:-4201}:8080" - "${KEIRA3_EXTERNAL_PORT}:8080"
healthcheck: healthcheck:
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health >/dev/null 2>&1 || nc -z localhost 8080 || exit 1"] test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health >/dev/null 2>&1 || nc -z localhost 8080 || exit 1"]
interval: 30s interval: 30s
@@ -687,14 +703,14 @@ services:
volumes: volumes:
ac-client-data: ac-client-data:
name: ${CLIENT_DATA_VOLUME:-ac-client-data} name: ${CLIENT_DATA_VOLUME}
driver: local driver: local
networks: networks:
azerothcore: azerothcore:
name: ${NETWORK_NAME:-azerothcore} name: ${NETWORK_NAME}
driver: bridge driver: bridge
ipam: ipam:
config: config:
- subnet: ${NETWORK_SUBNET:-172.20.0.0/16} - subnet: ${NETWORK_SUBNET}
gateway: ${NETWORK_GATEWAY:-172.20.0.1} gateway: ${NETWORK_GATEWAY}

110
setup.sh
View File

@@ -58,12 +58,14 @@ readonly DEFAULT_CUSTOM_UID="1000"
readonly DEFAULT_CUSTOM_GID="1000" readonly DEFAULT_CUSTOM_GID="1000"
# Static values # Static values
readonly DEFAULT_LOCAL_ADDRESS="127.0.0.1" readonly DEFAULT_LOCAL_ADDRESS="$(get_template_value "SERVER_ADDRESS")"
readonly DEFAULT_FALLBACK_LAN_IP="192.168.1.100" readonly DEFAULT_FALLBACK_LAN_IP="192.168.1.100"
readonly DEFAULT_DOMAIN_PLACEHOLDER="your-domain.com" readonly DEFAULT_DOMAIN_PLACEHOLDER="your-domain.com"
readonly DEFAULT_BACKUP_DAYS="3" readonly DEFAULT_BACKUP_DAYS="$(get_template_value "BACKUP_RETENTION_DAYS")"
readonly DEFAULT_BACKUP_HOURS="6" readonly DEFAULT_BACKUP_HOURS="$(get_template_value "BACKUP_RETENTION_HOURS")"
readonly DEFAULT_BACKUP_TIME="09" readonly DEFAULT_BACKUP_TIME="$(get_template_value "BACKUP_DAILY_TIME")"
readonly DEFAULT_BACKUP_HEALTHCHECK_MAX_MINUTES="$(get_template_value "BACKUP_HEALTHCHECK_MAX_MINUTES")"
readonly DEFAULT_BACKUP_HEALTHCHECK_GRACE_SECONDS="$(get_template_value "BACKUP_HEALTHCHECK_GRACE_SECONDS")"
readonly DEFAULT_NFS_STORAGE="/nfs/azerothcore" readonly DEFAULT_NFS_STORAGE="/nfs/azerothcore"
readonly DEFAULT_MOUNT_STORAGE="/mnt/azerothcore-data" readonly DEFAULT_MOUNT_STORAGE="/mnt/azerothcore-data"
@@ -78,6 +80,8 @@ readonly DEFAULT_WORLD_IMAGE_PLAYERBOTS="$(get_template_value "AC_WORLDSERVER_IM
readonly DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS="$(get_template_value "AC_CLIENT_DATA_IMAGE_PLAYERBOTS")" readonly DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS="$(get_template_value "AC_CLIENT_DATA_IMAGE_PLAYERBOTS")"
readonly DEFAULT_AUTH_IMAGE_MODULES="$(get_template_value "AC_AUTHSERVER_IMAGE_MODULES")" readonly DEFAULT_AUTH_IMAGE_MODULES="$(get_template_value "AC_AUTHSERVER_IMAGE_MODULES")"
readonly DEFAULT_WORLD_IMAGE_MODULES="$(get_template_value "AC_WORLDSERVER_IMAGE_MODULES")" readonly DEFAULT_WORLD_IMAGE_MODULES="$(get_template_value "AC_WORLDSERVER_IMAGE_MODULES")"
readonly DEFAULT_ALPINE_GIT_IMAGE="$(get_template_value "ALPINE_GIT_IMAGE")"
readonly DEFAULT_ALPINE_IMAGE="$(get_template_value "ALPINE_IMAGE")"
# Database names # Database names
readonly DEFAULT_DB_AUTH_NAME="$(get_template_value "DB_AUTH_NAME")" readonly DEFAULT_DB_AUTH_NAME="$(get_template_value "DB_AUTH_NAME")"
@@ -87,6 +91,11 @@ readonly DEFAULT_DB_PLAYERBOTS_NAME="$(get_template_value "DB_PLAYERBOTS_NAME")"
# Container names # Container names
readonly DEFAULT_CONTAINER_MYSQL="$(get_template_value "CONTAINER_MYSQL")" readonly DEFAULT_CONTAINER_MYSQL="$(get_template_value "CONTAINER_MYSQL")"
readonly DEFAULT_CONTAINER_DB_IMPORT="$(get_template_value "CONTAINER_DB_IMPORT")"
readonly DEFAULT_CONTAINER_DB_INIT="$(get_template_value "CONTAINER_DB_INIT")"
readonly DEFAULT_CONTAINER_BACKUP="$(get_template_value "CONTAINER_BACKUP")"
readonly DEFAULT_CONTAINER_MODULES="$(get_template_value "CONTAINER_MODULES")"
readonly DEFAULT_CONTAINER_POST_INSTALL="$(get_template_value "CONTAINER_POST_INSTALL")"
readonly DEFAULT_COMPOSE_PROJECT_NAME="$(get_template_value "COMPOSE_PROJECT_NAME")" readonly DEFAULT_COMPOSE_PROJECT_NAME="$(get_template_value "COMPOSE_PROJECT_NAME")"
readonly DEFAULT_CLIENT_DATA_VOLUME="$(get_template_value "CLIENT_DATA_VOLUME")" readonly DEFAULT_CLIENT_DATA_VOLUME="$(get_template_value "CLIENT_DATA_VOLUME")"
@@ -106,6 +115,9 @@ readonly DEFAULT_MYSQL_INNODB_BUFFER_POOL_SIZE="$(get_template_value "MYSQL_INNO
readonly DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE="$(get_template_value "MYSQL_INNODB_LOG_FILE_SIZE")" readonly DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE="$(get_template_value "MYSQL_INNODB_LOG_FILE_SIZE")"
readonly DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY="$(get_template_value "MYSQL_INNODB_REDO_LOG_CAPACITY")" readonly DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY="$(get_template_value "MYSQL_INNODB_REDO_LOG_CAPACITY")"
readonly DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE="$(get_template_value "MYSQL_RUNTIME_TMPFS_SIZE")" readonly DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE="$(get_template_value "MYSQL_RUNTIME_TMPFS_SIZE")"
readonly DEFAULT_MYSQL_HOST="$(get_template_value "MYSQL_HOST")"
readonly DEFAULT_DB_WAIT_RETRIES="$(get_template_value "DB_WAIT_RETRIES")"
readonly DEFAULT_DB_WAIT_SLEEP="$(get_template_value "DB_WAIT_SLEEP")"
# Paths # Paths
readonly DEFAULT_HOST_ZONEINFO_PATH="$(get_template_value "HOST_ZONEINFO_PATH")" readonly DEFAULT_HOST_ZONEINFO_PATH="$(get_template_value "HOST_ZONEINFO_PATH")"
@@ -144,6 +156,25 @@ readonly DEFAULT_ELUNA_BYTECODE_CACHE="$(get_template_value "AC_ELUNA_BYTECODE_C
readonly DEFAULT_ELUNA_AUTO_RELOAD_INTERVAL="$(get_template_value "AC_ELUNA_AUTO_RELOAD_INTERVAL")" readonly DEFAULT_ELUNA_AUTO_RELOAD_INTERVAL="$(get_template_value "AC_ELUNA_AUTO_RELOAD_INTERVAL")"
readonly DEFAULT_ELUNA_REQUIRE_PATHS="$(get_template_value "AC_ELUNA_REQUIRE_PATHS")" readonly DEFAULT_ELUNA_REQUIRE_PATHS="$(get_template_value "AC_ELUNA_REQUIRE_PATHS")"
readonly DEFAULT_ELUNA_REQUIRE_CPATHS="$(get_template_value "AC_ELUNA_REQUIRE_CPATHS")" readonly DEFAULT_ELUNA_REQUIRE_CPATHS="$(get_template_value "AC_ELUNA_REQUIRE_CPATHS")"
readonly DEFAULT_MODULE_ELUNA="$(get_template_value "MODULE_ELUNA")"
# Health check configuration
readonly DEFAULT_MYSQL_HEALTHCHECK_INTERVAL="$(get_template_value "MYSQL_HEALTHCHECK_INTERVAL")"
readonly DEFAULT_MYSQL_HEALTHCHECK_TIMEOUT="$(get_template_value "MYSQL_HEALTHCHECK_TIMEOUT")"
readonly DEFAULT_MYSQL_HEALTHCHECK_RETRIES="$(get_template_value "MYSQL_HEALTHCHECK_RETRIES")"
readonly DEFAULT_MYSQL_HEALTHCHECK_START_PERIOD="$(get_template_value "MYSQL_HEALTHCHECK_START_PERIOD")"
readonly DEFAULT_AUTH_HEALTHCHECK_INTERVAL="$(get_template_value "AUTH_HEALTHCHECK_INTERVAL")"
readonly DEFAULT_AUTH_HEALTHCHECK_TIMEOUT="$(get_template_value "AUTH_HEALTHCHECK_TIMEOUT")"
readonly DEFAULT_AUTH_HEALTHCHECK_RETRIES="$(get_template_value "AUTH_HEALTHCHECK_RETRIES")"
readonly DEFAULT_AUTH_HEALTHCHECK_START_PERIOD="$(get_template_value "AUTH_HEALTHCHECK_START_PERIOD")"
readonly DEFAULT_WORLD_HEALTHCHECK_INTERVAL="$(get_template_value "WORLD_HEALTHCHECK_INTERVAL")"
readonly DEFAULT_WORLD_HEALTHCHECK_TIMEOUT="$(get_template_value "WORLD_HEALTHCHECK_TIMEOUT")"
readonly DEFAULT_WORLD_HEALTHCHECK_RETRIES="$(get_template_value "WORLD_HEALTHCHECK_RETRIES")"
readonly DEFAULT_WORLD_HEALTHCHECK_START_PERIOD="$(get_template_value "WORLD_HEALTHCHECK_START_PERIOD")"
readonly DEFAULT_BACKUP_HEALTHCHECK_INTERVAL="$(get_template_value "BACKUP_HEALTHCHECK_INTERVAL")"
readonly DEFAULT_BACKUP_HEALTHCHECK_TIMEOUT="$(get_template_value "BACKUP_HEALTHCHECK_TIMEOUT")"
readonly DEFAULT_BACKUP_HEALTHCHECK_RETRIES="$(get_template_value "BACKUP_HEALTHCHECK_RETRIES")"
readonly DEFAULT_BACKUP_HEALTHCHECK_START_PERIOD="$(get_template_value "BACKUP_HEALTHCHECK_START_PERIOD")"
# Route detection IP (not in template) # Route detection IP (not in template)
readonly ROUTE_DETECTION_IP="1.1.1.1" readonly ROUTE_DETECTION_IP="1.1.1.1"
@@ -252,6 +283,7 @@ KNOWN_MODULE_VARS=(
MODULE_AUTO_REVIVE MODULE_AUTO_REVIVE
MODULE_GAIN_HONOR_GUARD MODULE_GAIN_HONOR_GUARD
MODULE_ARAC MODULE_ARAC
MODULE_ELUNA
MODULE_TIME_IS_TIME MODULE_TIME_IS_TIME
MODULE_POCKET_PORTAL MODULE_POCKET_PORTAL
MODULE_RANDOM_ENCHANTS MODULE_RANDOM_ENCHANTS
@@ -878,7 +910,7 @@ fi
MODULE_1V1_ARENA=0 MODULE_PHASED_DUELS=0 MODULE_BREAKING_NEWS=0 MODULE_BOSS_ANNOUNCER=0 MODULE_ACCOUNT_ACHIEVEMENTS=0 \ MODULE_1V1_ARENA=0 MODULE_PHASED_DUELS=0 MODULE_BREAKING_NEWS=0 MODULE_BOSS_ANNOUNCER=0 MODULE_ACCOUNT_ACHIEVEMENTS=0 \
MODULE_AUTO_REVIVE=0 MODULE_GAIN_HONOR_GUARD=0 MODULE_TIME_IS_TIME=0 MODULE_POCKET_PORTAL=0 \ MODULE_AUTO_REVIVE=0 MODULE_GAIN_HONOR_GUARD=0 MODULE_TIME_IS_TIME=0 MODULE_POCKET_PORTAL=0 \
MODULE_RANDOM_ENCHANTS=0 MODULE_SOLOCRAFT=0 MODULE_PVP_TITLES=0 MODULE_NPC_BEASTMASTER=0 MODULE_NPC_ENCHANTER=0 \ MODULE_RANDOM_ENCHANTS=0 MODULE_SOLOCRAFT=0 MODULE_PVP_TITLES=0 MODULE_NPC_BEASTMASTER=0 MODULE_NPC_ENCHANTER=0 \
MODULE_INSTANCE_RESET=0 MODULE_LEVEL_GRANT=0 MODULE_ASSISTANT=0 MODULE_REAGENT_BANK=0 MODULE_BLACK_MARKET_AUCTION_HOUSE=0 MODULE_ARAC=0 \ MODULE_INSTANCE_RESET=0 MODULE_LEVEL_GRANT=0 MODULE_ASSISTANT=0 MODULE_REAGENT_BANK=0 MODULE_BLACK_MARKET_AUCTION_HOUSE=0 MODULE_ARAC=0 MODULE_ELUNA=0 \
MODULE_CHALLENGE_MODES=0 MODULE_OLLAMA_CHAT=0 MODULE_SKELETON_MODULE=0 MODULE_BG_SLAVERYVALLEY=0 MODULE_ELUNA_TS=0 \ MODULE_CHALLENGE_MODES=0 MODULE_OLLAMA_CHAT=0 MODULE_SKELETON_MODULE=0 MODULE_BG_SLAVERYVALLEY=0 MODULE_ELUNA_TS=0 \
MODULE_PLAYER_BOT_LEVEL_BRACKETS=0 MODULE_STATBOOSTER=0 MODULE_DUNGEON_RESPAWN=0 MODULE_AZEROTHSHARD=0 MODULE_WORGOBLIN=0 MODULE_PLAYER_BOT_LEVEL_BRACKETS=0 MODULE_STATBOOSTER=0 MODULE_DUNGEON_RESPAWN=0 MODULE_AZEROTHSHARD=0 MODULE_WORGOBLIN=0
local AC_AUTHSERVER_IMAGE_PLAYERBOTS_VALUE="$DEFAULT_AUTH_IMAGE_PLAYERBOTS" local AC_AUTHSERVER_IMAGE_PLAYERBOTS_VALUE="$DEFAULT_AUTH_IMAGE_PLAYERBOTS"
@@ -1225,6 +1257,38 @@ fi
MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY} MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY}
MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE} MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE}
CLIENT_DATA_VOLUME=${CLIENT_DATA_VOLUME:-$DEFAULT_CLIENT_DATA_VOLUME} CLIENT_DATA_VOLUME=${CLIENT_DATA_VOLUME:-$DEFAULT_CLIENT_DATA_VOLUME}
BACKUP_HEALTHCHECK_MAX_MINUTES=${BACKUP_HEALTHCHECK_MAX_MINUTES:-$DEFAULT_BACKUP_HEALTHCHECK_MAX_MINUTES}
BACKUP_HEALTHCHECK_GRACE_SECONDS=${BACKUP_HEALTHCHECK_GRACE_SECONDS:-$DEFAULT_BACKUP_HEALTHCHECK_GRACE_SECONDS}
DB_WAIT_RETRIES=${DB_WAIT_RETRIES:-$DEFAULT_DB_WAIT_RETRIES}
DB_WAIT_SLEEP=${DB_WAIT_SLEEP:-$DEFAULT_DB_WAIT_SLEEP}
MYSQL_HEALTHCHECK_INTERVAL=${MYSQL_HEALTHCHECK_INTERVAL:-$DEFAULT_MYSQL_HEALTHCHECK_INTERVAL}
MYSQL_HEALTHCHECK_TIMEOUT=${MYSQL_HEALTHCHECK_TIMEOUT:-$DEFAULT_MYSQL_HEALTHCHECK_TIMEOUT}
MYSQL_HEALTHCHECK_RETRIES=${MYSQL_HEALTHCHECK_RETRIES:-$DEFAULT_MYSQL_HEALTHCHECK_RETRIES}
MYSQL_HEALTHCHECK_START_PERIOD=${MYSQL_HEALTHCHECK_START_PERIOD:-$DEFAULT_MYSQL_HEALTHCHECK_START_PERIOD}
AUTH_HEALTHCHECK_INTERVAL=${AUTH_HEALTHCHECK_INTERVAL:-$DEFAULT_AUTH_HEALTHCHECK_INTERVAL}
AUTH_HEALTHCHECK_TIMEOUT=${AUTH_HEALTHCHECK_TIMEOUT:-$DEFAULT_AUTH_HEALTHCHECK_TIMEOUT}
AUTH_HEALTHCHECK_RETRIES=${AUTH_HEALTHCHECK_RETRIES:-$DEFAULT_AUTH_HEALTHCHECK_RETRIES}
AUTH_HEALTHCHECK_START_PERIOD=${AUTH_HEALTHCHECK_START_PERIOD:-$DEFAULT_AUTH_HEALTHCHECK_START_PERIOD}
WORLD_HEALTHCHECK_INTERVAL=${WORLD_HEALTHCHECK_INTERVAL:-$DEFAULT_WORLD_HEALTHCHECK_INTERVAL}
WORLD_HEALTHCHECK_TIMEOUT=${WORLD_HEALTHCHECK_TIMEOUT:-$DEFAULT_WORLD_HEALTHCHECK_TIMEOUT}
WORLD_HEALTHCHECK_RETRIES=${WORLD_HEALTHCHECK_RETRIES:-$DEFAULT_WORLD_HEALTHCHECK_RETRIES}
WORLD_HEALTHCHECK_START_PERIOD=${WORLD_HEALTHCHECK_START_PERIOD:-$DEFAULT_WORLD_HEALTHCHECK_START_PERIOD}
BACKUP_HEALTHCHECK_INTERVAL=${BACKUP_HEALTHCHECK_INTERVAL:-$DEFAULT_BACKUP_HEALTHCHECK_INTERVAL}
BACKUP_HEALTHCHECK_TIMEOUT=${BACKUP_HEALTHCHECK_TIMEOUT:-$DEFAULT_BACKUP_HEALTHCHECK_TIMEOUT}
BACKUP_HEALTHCHECK_RETRIES=${BACKUP_HEALTHCHECK_RETRIES:-$DEFAULT_BACKUP_HEALTHCHECK_RETRIES}
BACKUP_HEALTHCHECK_START_PERIOD=${BACKUP_HEALTHCHECK_START_PERIOD:-$DEFAULT_BACKUP_HEALTHCHECK_START_PERIOD}
MODULE_ELUNA=${MODULE_ELUNA:-$DEFAULT_MODULE_ELUNA}
local HOST_BACKUP_PATH_VALUE_INPUT="${HOST_BACKUP_PATH:-}"
local storage_base="${STORAGE_PATH%/}"
[ -z "$storage_base" ] && storage_base="/"
local HOST_BACKUP_PATH_VALUE
if [ -n "$HOST_BACKUP_PATH_VALUE_INPUT" ]; then
HOST_BACKUP_PATH_VALUE="$HOST_BACKUP_PATH_VALUE_INPUT"
elif [ "$storage_base" = "/" ]; then
HOST_BACKUP_PATH_VALUE="/backups"
else
HOST_BACKUP_PATH_VALUE="${storage_base}/backups"
fi
cat > "$ENV_OUT" <<EOF cat > "$ENV_OUT" <<EOF
# Generated by ac-compose/setup.sh # Generated by ac-compose/setup.sh
@@ -1233,6 +1297,7 @@ COMPOSE_PROJECT_NAME=$DEFAULT_COMPOSE_PROJECT_NAME
STORAGE_PATH=$STORAGE_PATH STORAGE_PATH=$STORAGE_PATH
STORAGE_PATH_LOCAL=$LOCAL_STORAGE_ROOT STORAGE_PATH_LOCAL=$LOCAL_STORAGE_ROOT
HOST_BACKUP_PATH=$HOST_BACKUP_PATH_VALUE
HOST_ZONEINFO_PATH=${HOST_ZONEINFO_PATH:-$DEFAULT_HOST_ZONEINFO_PATH} HOST_ZONEINFO_PATH=${HOST_ZONEINFO_PATH:-$DEFAULT_HOST_ZONEINFO_PATH}
TZ=$DEFAULT_TZ TZ=$DEFAULT_TZ
@@ -1251,6 +1316,9 @@ MYSQL_INNODB_BUFFER_POOL_SIZE=$DEFAULT_MYSQL_INNODB_BUFFER_POOL_SIZE
MYSQL_INNODB_LOG_FILE_SIZE=$DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE MYSQL_INNODB_LOG_FILE_SIZE=$DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE
MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY} MYSQL_INNODB_REDO_LOG_CAPACITY=${MYSQL_INNODB_REDO_LOG_CAPACITY:-$DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY}
MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE} MYSQL_RUNTIME_TMPFS_SIZE=${MYSQL_RUNTIME_TMPFS_SIZE:-$DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE}
MYSQL_HOST=$DEFAULT_MYSQL_HOST
DB_WAIT_RETRIES=$DB_WAIT_RETRIES
DB_WAIT_SLEEP=$DB_WAIT_SLEEP
DB_AUTH_NAME=$DEFAULT_DB_AUTH_NAME DB_AUTH_NAME=$DEFAULT_DB_AUTH_NAME
DB_WORLD_NAME=$DEFAULT_DB_WORLD_NAME DB_WORLD_NAME=$DEFAULT_DB_WORLD_NAME
DB_CHARACTERS_NAME=$DEFAULT_DB_CHARACTERS_NAME DB_CHARACTERS_NAME=$DEFAULT_DB_CHARACTERS_NAME
@@ -1271,6 +1339,13 @@ AC_CLIENT_DATA_IMAGE_PLAYERBOTS=$DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS
CLIENT_DATA_CACHE_PATH=$CLIENT_DATA_CACHE_PATH_VALUE CLIENT_DATA_CACHE_PATH=$CLIENT_DATA_CACHE_PATH_VALUE
CLIENT_DATA_VOLUME=${CLIENT_DATA_VOLUME:-$DEFAULT_CLIENT_DATA_VOLUME} CLIENT_DATA_VOLUME=${CLIENT_DATA_VOLUME:-$DEFAULT_CLIENT_DATA_VOLUME}
# Containers
CONTAINER_DB_IMPORT=$DEFAULT_CONTAINER_DB_IMPORT
CONTAINER_DB_INIT=$DEFAULT_CONTAINER_DB_INIT
CONTAINER_BACKUP=$DEFAULT_CONTAINER_BACKUP
CONTAINER_MODULES=$DEFAULT_CONTAINER_MODULES
CONTAINER_POST_INSTALL=$DEFAULT_CONTAINER_POST_INSTALL
# Ports # Ports
AUTH_EXTERNAL_PORT=$AUTH_EXTERNAL_PORT AUTH_EXTERNAL_PORT=$AUTH_EXTERNAL_PORT
AUTH_PORT=$DEFAULT_AUTH_INTERNAL_PORT AUTH_PORT=$DEFAULT_AUTH_INTERNAL_PORT
@@ -1287,6 +1362,12 @@ REALM_PORT=$REALM_PORT
BACKUP_RETENTION_DAYS=$BACKUP_RETENTION_DAYS BACKUP_RETENTION_DAYS=$BACKUP_RETENTION_DAYS
BACKUP_RETENTION_HOURS=$BACKUP_RETENTION_HOURS BACKUP_RETENTION_HOURS=$BACKUP_RETENTION_HOURS
BACKUP_DAILY_TIME=$BACKUP_DAILY_TIME BACKUP_DAILY_TIME=$BACKUP_DAILY_TIME
BACKUP_HEALTHCHECK_MAX_MINUTES=$BACKUP_HEALTHCHECK_MAX_MINUTES
BACKUP_HEALTHCHECK_GRACE_SECONDS=$BACKUP_HEALTHCHECK_GRACE_SECONDS
BACKUP_HEALTHCHECK_INTERVAL=$BACKUP_HEALTHCHECK_INTERVAL
BACKUP_HEALTHCHECK_TIMEOUT=$BACKUP_HEALTHCHECK_TIMEOUT
BACKUP_HEALTHCHECK_RETRIES=$BACKUP_HEALTHCHECK_RETRIES
BACKUP_HEALTHCHECK_START_PERIOD=$BACKUP_HEALTHCHECK_START_PERIOD
# Container user # Container user
CONTAINER_USER=$CONTAINER_USER CONTAINER_USER=$CONTAINER_USER
@@ -1311,6 +1392,7 @@ MODULE_ACCOUNT_ACHIEVEMENTS=$MODULE_ACCOUNT_ACHIEVEMENTS
MODULE_AUTO_REVIVE=$MODULE_AUTO_REVIVE MODULE_AUTO_REVIVE=$MODULE_AUTO_REVIVE
MODULE_GAIN_HONOR_GUARD=$MODULE_GAIN_HONOR_GUARD MODULE_GAIN_HONOR_GUARD=$MODULE_GAIN_HONOR_GUARD
MODULE_ARAC=$MODULE_ARAC MODULE_ARAC=$MODULE_ARAC
MODULE_ELUNA=$MODULE_ELUNA
MODULE_TIME_IS_TIME=$MODULE_TIME_IS_TIME MODULE_TIME_IS_TIME=$MODULE_TIME_IS_TIME
MODULE_POCKET_PORTAL=$MODULE_POCKET_PORTAL MODULE_POCKET_PORTAL=$MODULE_POCKET_PORTAL
MODULE_RANDOM_ENCHANTS=$MODULE_RANDOM_ENCHANTS MODULE_RANDOM_ENCHANTS=$MODULE_RANDOM_ENCHANTS
@@ -1369,10 +1451,28 @@ KEIRA3_EXTERNAL_PORT=$DEFAULT_KEIRA3_EXTERNAL_PORT
KEIRA_DATABASE_HOST=$DEFAULT_CONTAINER_MYSQL KEIRA_DATABASE_HOST=$DEFAULT_CONTAINER_MYSQL
KEIRA_DATABASE_PORT=$DEFAULT_MYSQL_INTERNAL_PORT KEIRA_DATABASE_PORT=$DEFAULT_MYSQL_INTERNAL_PORT
# Health checks
MYSQL_HEALTHCHECK_INTERVAL=$MYSQL_HEALTHCHECK_INTERVAL
MYSQL_HEALTHCHECK_TIMEOUT=$MYSQL_HEALTHCHECK_TIMEOUT
MYSQL_HEALTHCHECK_RETRIES=$MYSQL_HEALTHCHECK_RETRIES
MYSQL_HEALTHCHECK_START_PERIOD=$MYSQL_HEALTHCHECK_START_PERIOD
AUTH_HEALTHCHECK_INTERVAL=$AUTH_HEALTHCHECK_INTERVAL
AUTH_HEALTHCHECK_TIMEOUT=$AUTH_HEALTHCHECK_TIMEOUT
AUTH_HEALTHCHECK_RETRIES=$AUTH_HEALTHCHECK_RETRIES
AUTH_HEALTHCHECK_START_PERIOD=$AUTH_HEALTHCHECK_START_PERIOD
WORLD_HEALTHCHECK_INTERVAL=$WORLD_HEALTHCHECK_INTERVAL
WORLD_HEALTHCHECK_TIMEOUT=$WORLD_HEALTHCHECK_TIMEOUT
WORLD_HEALTHCHECK_RETRIES=$WORLD_HEALTHCHECK_RETRIES
WORLD_HEALTHCHECK_START_PERIOD=$WORLD_HEALTHCHECK_START_PERIOD
# Networking # Networking
NETWORK_NAME=$DEFAULT_NETWORK_NAME NETWORK_NAME=$DEFAULT_NETWORK_NAME
NETWORK_SUBNET=$DEFAULT_NETWORK_SUBNET NETWORK_SUBNET=$DEFAULT_NETWORK_SUBNET
NETWORK_GATEWAY=$DEFAULT_NETWORK_GATEWAY NETWORK_GATEWAY=$DEFAULT_NETWORK_GATEWAY
# Helper images
ALPINE_GIT_IMAGE=$DEFAULT_ALPINE_GIT_IMAGE
ALPINE_IMAGE=$DEFAULT_ALPINE_IMAGE
EOF EOF
local storage_abs_path="$STORAGE_PATH" local storage_abs_path="$STORAGE_PATH"

View File

@@ -40,25 +40,22 @@ command -v docker >/dev/null 2>&1 || { echo "Docker CLI not found" >&2; exit 1;
docker info >/dev/null 2>&1 || { echo "Docker daemon unavailable" >&2; exit 1; } docker info >/dev/null 2>&1 || { echo "Docker daemon unavailable" >&2; exit 1; }
read_env(){ read_env(){
local key="$1" default="$2" value local key="$1" value=""
if [ -f "$ENV_FILE" ]; then if [ -f "$ENV_FILE" ]; then
value="$(grep -E "^${key}=" "$ENV_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2- | tr -d '\r')" value="$(grep -E "^${key}=" "$ENV_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2- | tr -d '\r')"
fi fi
if [ -z "$value" ]; then
value="$default"
fi
echo "$value" echo "$value"
} }
PROJECT_NAME="$(read_env COMPOSE_PROJECT_NAME ac-compose)" PROJECT_NAME="$(read_env COMPOSE_PROJECT_NAME)"
NETWORK_NAME="$(read_env NETWORK_NAME azerothcore)" NETWORK_NAME="$(read_env NETWORK_NAME)"
AUTH_PORT="$(read_env AUTH_EXTERNAL_PORT 3784)" AUTH_PORT="$(read_env AUTH_EXTERNAL_PORT)"
WORLD_PORT="$(read_env WORLD_EXTERNAL_PORT 8215)" WORLD_PORT="$(read_env WORLD_EXTERNAL_PORT)"
SOAP_PORT="$(read_env SOAP_EXTERNAL_PORT 7778)" SOAP_PORT="$(read_env SOAP_EXTERNAL_PORT)"
MYSQL_PORT="$(read_env MYSQL_EXTERNAL_PORT 64306)" MYSQL_PORT="$(read_env MYSQL_EXTERNAL_PORT)"
PMA_PORT="$(read_env PMA_EXTERNAL_PORT 8081)" PMA_PORT="$(read_env PMA_EXTERNAL_PORT)"
KEIRA_PORT="$(read_env KEIRA3_EXTERNAL_PORT 4201)" KEIRA_PORT="$(read_env KEIRA3_EXTERNAL_PORT)"
ELUNA_ENABLED="$(read_env AC_ELUNA_ENABLED 1)" ELUNA_ENABLED="$(read_env AC_ELUNA_ENABLED)"
container_exists(){ container_exists(){
docker ps -a --format '{{.Names}}' | grep -qx "$1" docker ps -a --format '{{.Names}}' | grep -qx "$1"
@@ -68,6 +65,15 @@ container_running(){
docker ps --format '{{.Names}}' | grep -qx "$1" docker ps --format '{{.Names}}' | grep -qx "$1"
} }
is_one_shot(){
case "$1" in
ac-db-import|ac-db-init|ac-modules|ac-post-install|ac-client-data|ac-client-data-playerbots)
return 0;;
*)
return 1;;
esac
}
format_state(){ format_state(){
local status="$1" health="$2" started="$3" exit_code="$4" local status="$1" health="$2" started="$3" exit_code="$4"
local started_fmt local started_fmt
@@ -144,7 +150,17 @@ print_service(){
exit_code="$(docker inspect --format='{{.State.ExitCode}}' "$container" 2>/dev/null || echo "?")" exit_code="$(docker inspect --format='{{.State.ExitCode}}' "$container" 2>/dev/null || echo "?")"
image="$(docker inspect --format='{{.Config.Image}}' "$container" 2>/dev/null || echo "-")" image="$(docker inspect --format='{{.Config.Image}}' "$container" 2>/dev/null || echo "-")"
local state_info colour text local state_info colour text
state_info="$(format_state "$status" "$health" "$started" "$exit_code")" if [ "$status" = "exited" ] && is_one_shot "$container"; then
local finished
finished="$(docker inspect --format='{{.State.FinishedAt}}' "$container" 2>/dev/null | cut -c12-19 2>/dev/null || echo "--:--:--")"
if [ "$exit_code" = "0" ]; then
state_info="${GREEN}|○ completed (at $finished)"
else
state_info="${RED}|○ failed (code $exit_code)"
fi
else
state_info="$(format_state "$status" "$health" "$started" "$exit_code")"
fi
colour="${state_info%%|*}" colour="${state_info%%|*}"
text="${state_info#*|}" text="${state_info#*|}"
printf "%-20s %-15s %b%-30s%b %s\n" "$label" "$container" "$colour" "$text" "$NC" "$(short_image "$image")" printf "%-20s %-15s %b%-30s%b %s\n" "$label" "$container" "$colour" "$text" "$NC" "$(short_image "$image")"
@@ -184,7 +200,7 @@ module_summary(){
if container_running "ac-worldserver"; then if container_running "ac-worldserver"; then
local playerbot="disabled" local playerbot="disabled"
local module_playerbots local module_playerbots
module_playerbots="$(read_env MODULE_PLAYERBOTS 0)" module_playerbots="$(read_env MODULE_PLAYERBOTS)"
if [ "$module_playerbots" = "1" ]; then if [ "$module_playerbots" = "1" ]; then
playerbot="enabled" playerbot="enabled"
if docker inspect --format='{{.State.Status}}' ac-worldserver 2>/dev/null | grep -q "running"; then if docker inspect --format='{{.State.Status}}' ac-worldserver 2>/dev/null | grep -q "running"; then
@@ -204,9 +220,14 @@ user_stats(){
fi fi
local mysql_pw db_auth db_characters local mysql_pw db_auth db_characters
mysql_pw="$(read_env MYSQL_ROOT_PASSWORD azerothcore123)" mysql_pw="$(read_env MYSQL_ROOT_PASSWORD)"
db_auth="$(read_env DB_AUTH_NAME acore_auth)" db_auth="$(read_env DB_AUTH_NAME)"
db_characters="$(read_env DB_CHARACTERS_NAME acore_characters)" db_characters="$(read_env DB_CHARACTERS_NAME)"
if [ -z "$mysql_pw" ] || [ -z "$db_auth" ] || [ -z "$db_characters" ]; then
printf "USERS: %sMissing MySQL configuration in .env%s\n" "$YELLOW" "$NC"
return
fi
local exec_mysql local exec_mysql
exec_mysql(){ exec_mysql(){
@@ -239,6 +260,10 @@ ports_summary(){
for i in "${!names[@]}"; do for i in "${!names[@]}"; do
local svc="${names[$i]}" local svc="${names[$i]}"
local port="${ports[$i]}" local port="${ports[$i]}"
if [ -z "$port" ]; then
printf " %-10s %-6s %b○%b not set\n" "$svc" "--" "$YELLOW" "$NC"
continue
fi
if timeout 1 bash -c "</dev/tcp/127.0.0.1/${port}" >/dev/null 2>&1; then if timeout 1 bash -c "</dev/tcp/127.0.0.1/${port}" >/dev/null 2>&1; then
printf " %-10s %-6s %b●%b reachable\n" "$svc" "$port" "$GREEN" "$NC" printf " %-10s %-6s %b●%b reachable\n" "$svc" "$port" "$GREEN" "$NC"
else else
@@ -248,6 +273,10 @@ ports_summary(){
} }
network_summary(){ network_summary(){
if [ -z "$NETWORK_NAME" ]; then
echo "DOCKER NET: not set"
return
fi
if docker network ls --format '{{.Name}}' | grep -qx "$NETWORK_NAME"; then if docker network ls --format '{{.Name}}' | grep -qx "$NETWORK_NAME"; then
echo "DOCKER NET: $NETWORK_NAME" echo "DOCKER NET: $NETWORK_NAME"
else else