automation tweaks

This commit is contained in:
uprightbass360
2025-10-26 19:12:56 -04:00
parent f46b88bd93
commit 39ac59d641
6 changed files with 250 additions and 263 deletions

View File

@@ -2,7 +2,9 @@
# Docker Compose will auto-load .env in the same folder as docker-compose.yml.
# Template for acore-compose profiles-based compose
# =====================
# Project name
# =====================
COMPOSE_PROJECT_NAME=acore-compose
# =====================
@@ -10,10 +12,78 @@ COMPOSE_PROJECT_NAME=acore-compose
# =====================
STORAGE_PATH=./storage
STORAGE_PATH_LOCAL=./local-storage
HOST_BACKUP_PATH=./storage/backups
BACKUP_PATH=${STORAGE_PATH}/backups
HOST_ZONEINFO_PATH=/usr/share/zoneinfo
TZ=UTC
# =====================
# Permissions & IDs
# =====================
CONTAINER_USER=0:0
PERMISSION_LOCAL_USER=0:0
PERMISSION_NFS_USER=1001:1000
DEFAULT_CUSTOM_UID=1000
DEFAULT_CUSTOM_GID=1000
# =====================
# Shared Storage Presets
# =====================
NFS_STORAGE_PATH=/nfs/azerothcore
MOUNT_STORAGE_PATH=/mnt/azerothcore-data
# =====================
# 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
# =====================
# Images
# =====================
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
# Services (Standard)
AC_AUTHSERVER_IMAGE=acore/ac-wotlk-authserver:14.0.0-dev
AC_WORLDSERVER_IMAGE=acore/ac-wotlk-worldserver:14.0.0-dev
# Services (Playerbots)
AC_AUTHSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:authserver-Playerbot
AC_WORLDSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:worldserver-Playerbot
# Services (Module Build Tags)
# Images used during module compilation and tagging
AC_AUTHSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:authserver-modules-latest
AC_WORLDSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:worldserver-modules-latest
# Client Data
AC_CLIENT_DATA_IMAGE=acore/ac-wotlk-client-data:14.0.0-dev
AC_CLIENT_DATA_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:client-data-Playerbot
# Helper images
ALPINE_GIT_IMAGE=alpine/git:latest
ALPINE_IMAGE=alpine:latest
# =====================
# Ports
# =====================
AUTH_EXTERNAL_PORT=3784
AUTH_PORT=3724
WORLD_EXTERNAL_PORT=8215
WORLD_PORT=8085
SOAP_EXTERNAL_PORT=7778
SOAP_PORT=7878
# =====================
# Networking
# =====================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# =====================
# Server address / realm
# =====================
SERVER_ADDRESS=127.0.0.1
REALM_PORT=8215
# =====================
# MySQL / Database Layer
# =====================
@@ -35,66 +105,13 @@ MYSQL_RUNTIME_TMPFS_SIZE=8G
DB_WAIT_RETRIES=60
DB_WAIT_SLEEP=10
# =====================
# DB names
# =====================
DB_AUTH_NAME=acore_auth
DB_WORLD_NAME=acore_world
DB_CHARACTERS_NAME=acore_characters
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
AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev
# =====================
# Services (Standard)
# =====================
AC_AUTHSERVER_IMAGE=acore/ac-wotlk-authserver:14.0.0-dev
AC_WORLDSERVER_IMAGE=acore/ac-wotlk-worldserver:14.0.0-dev
# =====================
# Services (Playerbots)
# =====================
AC_AUTHSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:authserver-Playerbot
AC_WORLDSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:worldserver-Playerbot
# =====================
# Services (Module Build Tags)
# =====================
# Images used during module compilation and tagging
AC_AUTHSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:authserver-modules-latest
AC_WORLDSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:worldserver-modules-latest
# =====================
# Client Data
# =====================
AC_CLIENT_DATA_IMAGE=acore/ac-wotlk-client-data:14.0.0-dev
AC_CLIENT_DATA_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:client-data-Playerbot
CLIENT_DATA_VERSION=v17
CLIENT_DATA_CACHE_PATH=${STORAGE_PATH_LOCAL:-./local-storage}/client-data-cache
CLIENT_DATA_VOLUME=ac-client-data
# =====================
# Ports
# =====================
AUTH_EXTERNAL_PORT=3784
AUTH_PORT=3724
WORLD_EXTERNAL_PORT=8215
WORLD_PORT=8085
SOAP_EXTERNAL_PORT=7778
SOAP_PORT=7878
# =====================
# Server address / realm
# =====================
SERVER_ADDRESS=127.0.0.1
REALM_PORT=8215
# =====================
# Backups
# =====================
@@ -114,6 +131,13 @@ BACKUP_HEALTHCHECK_START_PERIOD=120s
PLAYERBOT_ENABLED=0
PLAYERBOT_MAX_BOTS=40
# =====================
# Client Data Settings
# =====================
CLIENT_DATA_VERSION=v17
CLIENT_DATA_CACHE_PATH=${STORAGE_PATH_LOCAL}/client-data-cache
CLIENT_DATA_VOLUME=ac-client-data
# =====================
# Module toggles (0/1)
# =====================
@@ -178,7 +202,7 @@ MODULE_BLACK_MARKET_AUCTION_HOUSE=0
# =====================
AUTO_REBUILD_ON_DEPLOY=0
# Default AzerothCore source checkout used for module rebuilds
MODULES_REBUILD_SOURCE_PATH=${STORAGE_PATH_LOCAL:-./local-storage}/source/azerothcore
MODULES_REBUILD_SOURCE_PATH=${STORAGE_PATH_LOCAL}/source/azerothcore
# =====================
# Eluna runtime (worldserver.conf overrides)
@@ -222,25 +246,6 @@ PMA_ABSOLUTE_URI=
PMA_UPLOAD_LIMIT=300M
PMA_MEMORY_LIMIT=512M
PMA_MAX_EXECUTION_TIME=600
KEIRA3_EXTERNAL_PORT=4201
KEIRA_DATABASE_HOST=ac-mysql
KEIRA_DATABASE_PORT=3306
# =====================
# Networking
# =====================
NETWORK_NAME=azerothcore
NETWORK_SUBNET=172.20.0.0/16
NETWORK_GATEWAY=172.20.0.1
# =====================
# Container user mapping
# =====================
CONTAINER_USER=0:0
# =====================
# Helper images
# =====================
ALPINE_GIT_IMAGE=alpine/git:latest
ALPINE_IMAGE=alpine:latest

View File

@@ -2,9 +2,9 @@
# Export auth and character databases to ExportBackup_<timestamp>/
set -euo pipefail
MYSQL_PW="${MYSQL_ROOT_PASSWORD:-azerothcore123}"
DB_AUTH="${DB_AUTH_NAME:-acore_auth}"
DB_CHAR="${DB_CHARACTERS_NAME:-acore_characters}"
MYSQL_PW="${MYSQL_ROOT_PASSWORD}"
DB_AUTH="${DB_AUTH_NAME}"
DB_CHAR="${DB_CHARACTERS_NAME}"
usage(){
cat <<EOF

View File

@@ -3,10 +3,10 @@
set -euo pipefail
BACKUP_DIR="${1:-ImportBackup}"
MYSQL_PW="${MYSQL_ROOT_PASSWORD:-azerothcore123}"
DB_AUTH="${DB_AUTH_NAME:-acore_auth}"
DB_CHAR="${DB_CHARACTERS_NAME:-acore_characters}"
DB_WORLD="${DB_WORLD_NAME:-acore_world}"
MYSQL_PW="${MYSQL_ROOT_PASSWORD}"
DB_AUTH="${DB_AUTH_NAME}"
DB_CHAR="${DB_CHARACTERS_NAME}"
DB_WORLD="${DB_WORLD_NAME}"
COLOR_RED='\033[0;31m'
COLOR_GREEN='\033[0;32m'

View File

@@ -21,7 +21,7 @@ services:
- "${MYSQL_EXTERNAL_PORT}:${MYSQL_PORT}"
volumes:
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
- ${HOST_BACKUP_PATH}:/backups
- ${BACKUP_PATH}:/backups
- ${HOST_ZONEINFO_PATH}:/usr/share/zoneinfo:ro
tmpfs:
- /var/lib/mysql-runtime:size=${MYSQL_RUNTIME_TMPFS_SIZE}
@@ -99,7 +99,7 @@ services:
condition: service_completed_successfully
volumes:
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
- ${HOST_BACKUP_PATH}:/backups
- ${BACKUP_PATH}:/backups
networks:
- azerothcore
environment:
@@ -154,7 +154,7 @@ services:
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
TZ: ${TZ}
volumes:
- ${HOST_BACKUP_PATH}:/backups
- ${BACKUP_PATH}:/backups
- ./scripts:/tmp/scripts:ro
working_dir: /tmp
command:
@@ -575,6 +575,16 @@ services:
- MODULE_ASSISTANT=${MODULE_ASSISTANT}
- MODULE_REAGENT_BANK=${MODULE_REAGENT_BANK}
- MODULE_BLACK_MARKET_AUCTION_HOUSE=${MODULE_BLACK_MARKET_AUCTION_HOUSE}
- MODULE_CHALLENGE_MODES=${MODULE_CHALLENGE_MODES}
- MODULE_OLLAMA_CHAT=${MODULE_OLLAMA_CHAT}
- MODULE_PLAYER_BOT_LEVEL_BRACKETS=${MODULE_PLAYER_BOT_LEVEL_BRACKETS}
- MODULE_STATBOOSTER=${MODULE_STATBOOSTER}
- MODULE_DUNGEON_RESPAWN=${MODULE_DUNGEON_RESPAWN}
- MODULE_SKELETON_MODULE=${MODULE_SKELETON_MODULE}
- MODULE_BG_SLAVERYVALLEY=${MODULE_BG_SLAVERYVALLEY}
- MODULE_AZEROTHSHARD=${MODULE_AZEROTHSHARD}
- MODULE_WORGOBLIN=${MODULE_WORGOBLIN}
- MODULE_ELUNA_TS=${MODULE_ELUNA_TS}
- CONTAINER_MYSQL=${CONTAINER_MYSQL}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- DB_AUTH_NAME=${DB_AUTH_NAME}

297
setup.sh
View File

@@ -1,5 +1,6 @@
#!/bin/bash
set -e
clear
# ==============================================
# ac-compose - Interactive .env generator
@@ -42,139 +43,134 @@ get_template_value() {
echo "$value"
}
# Load constants from .env.template (required)
readonly DEFAULT_MYSQL_PASSWORD="$(get_template_value "MYSQL_ROOT_PASSWORD")"
readonly DEFAULT_REALM_PORT="$(get_template_value "WORLD_EXTERNAL_PORT")"
readonly DEFAULT_AUTH_PORT="$(get_template_value "AUTH_EXTERNAL_PORT")"
readonly DEFAULT_SOAP_PORT="$(get_template_value "SOAP_EXTERNAL_PORT")"
readonly DEFAULT_MYSQL_PORT="$(get_template_value "MYSQL_EXTERNAL_PORT")"
readonly DEFAULT_PLAYERBOT_MAX="$(get_template_value "PLAYERBOT_MAX_BOTS")"
readonly DEFAULT_LOCAL_STORAGE="$(get_template_value "STORAGE_PATH")"
declare -A TEMPLATE_VALUE_MAP=(
[DEFAULT_MYSQL_PASSWORD]=MYSQL_ROOT_PASSWORD
[DEFAULT_REALM_PORT]=WORLD_EXTERNAL_PORT
[DEFAULT_AUTH_PORT]=AUTH_EXTERNAL_PORT
[DEFAULT_SOAP_PORT]=SOAP_EXTERNAL_PORT
[DEFAULT_MYSQL_PORT]=MYSQL_EXTERNAL_PORT
[DEFAULT_PLAYERBOT_MAX]=PLAYERBOT_MAX_BOTS
[DEFAULT_LOCAL_STORAGE]=STORAGE_PATH
[DEFAULT_BACKUP_PATH]=BACKUP_PATH
[PERMISSION_LOCAL_USER]=PERMISSION_LOCAL_USER
[PERMISSION_NFS_USER]=PERMISSION_NFS_USER
[DEFAULT_CUSTOM_UID]=DEFAULT_CUSTOM_UID
[DEFAULT_CUSTOM_GID]=DEFAULT_CUSTOM_GID
[DEFAULT_LOCAL_ADDRESS]=SERVER_ADDRESS
[DEFAULT_BACKUP_DAYS]=BACKUP_RETENTION_DAYS
[DEFAULT_BACKUP_HOURS]=BACKUP_RETENTION_HOURS
[DEFAULT_BACKUP_TIME]=BACKUP_DAILY_TIME
[DEFAULT_BACKUP_HEALTHCHECK_MAX_MINUTES]=BACKUP_HEALTHCHECK_MAX_MINUTES
[DEFAULT_BACKUP_HEALTHCHECK_GRACE_SECONDS]=BACKUP_HEALTHCHECK_GRACE_SECONDS
[DEFAULT_NFS_STORAGE]=NFS_STORAGE_PATH
[DEFAULT_MOUNT_STORAGE]=MOUNT_STORAGE_PATH
[DEFAULT_MYSQL_IMAGE]=MYSQL_IMAGE
[DEFAULT_AC_DB_IMPORT_IMAGE]=AC_DB_IMPORT_IMAGE
[DEFAULT_AC_AUTHSERVER_IMAGE]=AC_AUTHSERVER_IMAGE
[DEFAULT_AC_WORLDSERVER_IMAGE]=AC_WORLDSERVER_IMAGE
[DEFAULT_AC_CLIENT_DATA_IMAGE]=AC_CLIENT_DATA_IMAGE
[DEFAULT_AUTH_IMAGE_PLAYERBOTS]=AC_AUTHSERVER_IMAGE_PLAYERBOTS
[DEFAULT_WORLD_IMAGE_PLAYERBOTS]=AC_WORLDSERVER_IMAGE_PLAYERBOTS
[DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS]=AC_CLIENT_DATA_IMAGE_PLAYERBOTS
[DEFAULT_AUTH_IMAGE_MODULES]=AC_AUTHSERVER_IMAGE_MODULES
[DEFAULT_WORLD_IMAGE_MODULES]=AC_WORLDSERVER_IMAGE_MODULES
[DEFAULT_ALPINE_GIT_IMAGE]=ALPINE_GIT_IMAGE
[DEFAULT_ALPINE_IMAGE]=ALPINE_IMAGE
[DEFAULT_DB_AUTH_NAME]=DB_AUTH_NAME
[DEFAULT_DB_WORLD_NAME]=DB_WORLD_NAME
[DEFAULT_DB_CHARACTERS_NAME]=DB_CHARACTERS_NAME
[DEFAULT_DB_PLAYERBOTS_NAME]=DB_PLAYERBOTS_NAME
[DEFAULT_CONTAINER_MYSQL]=CONTAINER_MYSQL
[DEFAULT_CONTAINER_DB_IMPORT]=CONTAINER_DB_IMPORT
[DEFAULT_CONTAINER_DB_INIT]=CONTAINER_DB_INIT
[DEFAULT_CONTAINER_BACKUP]=CONTAINER_BACKUP
[DEFAULT_CONTAINER_MODULES]=CONTAINER_MODULES
[DEFAULT_CONTAINER_POST_INSTALL]=CONTAINER_POST_INSTALL
[DEFAULT_COMPOSE_PROJECT_NAME]=COMPOSE_PROJECT_NAME
[DEFAULT_CLIENT_DATA_VOLUME]=CLIENT_DATA_VOLUME
[DEFAULT_CLIENT_DATA_CACHE_PATH]=CLIENT_DATA_CACHE_PATH
[DEFAULT_CLIENT_DATA_VERSION]=CLIENT_DATA_VERSION
[DEFAULT_NETWORK_NAME]=NETWORK_NAME
[DEFAULT_NETWORK_SUBNET]=NETWORK_SUBNET
[DEFAULT_NETWORK_GATEWAY]=NETWORK_GATEWAY
[DEFAULT_MYSQL_CHARACTER_SET]=MYSQL_CHARACTER_SET
[DEFAULT_MYSQL_COLLATION]=MYSQL_COLLATION
[DEFAULT_MYSQL_MAX_CONNECTIONS]=MYSQL_MAX_CONNECTIONS
[DEFAULT_MYSQL_INNODB_BUFFER_POOL_SIZE]=MYSQL_INNODB_BUFFER_POOL_SIZE
[DEFAULT_MYSQL_INNODB_LOG_FILE_SIZE]=MYSQL_INNODB_LOG_FILE_SIZE
[DEFAULT_MYSQL_INNODB_REDO_LOG_CAPACITY]=MYSQL_INNODB_REDO_LOG_CAPACITY
[DEFAULT_MYSQL_RUNTIME_TMPFS_SIZE]=MYSQL_RUNTIME_TMPFS_SIZE
[DEFAULT_MYSQL_HOST]=MYSQL_HOST
[DEFAULT_DB_WAIT_RETRIES]=DB_WAIT_RETRIES
[DEFAULT_DB_WAIT_SLEEP]=DB_WAIT_SLEEP
[DEFAULT_HOST_ZONEINFO_PATH]=HOST_ZONEINFO_PATH
[DEFAULT_ELUNA_SCRIPT_PATH]=AC_ELUNA_SCRIPT_PATH
[DEFAULT_PMA_EXTERNAL_PORT]=PMA_EXTERNAL_PORT
[DEFAULT_PMA_UPLOAD_LIMIT]=PMA_UPLOAD_LIMIT
[DEFAULT_PMA_MEMORY_LIMIT]=PMA_MEMORY_LIMIT
[DEFAULT_PMA_MAX_EXECUTION_TIME]=PMA_MAX_EXECUTION_TIME
[DEFAULT_KEIRA3_EXTERNAL_PORT]=KEIRA3_EXTERNAL_PORT
[DEFAULT_PMA_USER]=PMA_USER
[DEFAULT_PMA_ARBITRARY]=PMA_ARBITRARY
[DEFAULT_PMA_ABSOLUTE_URI]=PMA_ABSOLUTE_URI
[DEFAULT_AUTH_INTERNAL_PORT]=AUTH_PORT
[DEFAULT_WORLD_INTERNAL_PORT]=WORLD_PORT
[DEFAULT_SOAP_INTERNAL_PORT]=SOAP_PORT
[DEFAULT_MYSQL_INTERNAL_PORT]=MYSQL_PORT
[DEFAULT_TZ]=TZ
[DEFAULT_MYSQL_ROOT_HOST]=MYSQL_ROOT_HOST
[DEFAULT_MYSQL_USER]=MYSQL_USER
[DEFAULT_ELUNA_ENABLED]=AC_ELUNA_ENABLED
[DEFAULT_ELUNA_TRACE_BACK]=AC_ELUNA_TRACE_BACK
[DEFAULT_ELUNA_AUTO_RELOAD]=AC_ELUNA_AUTO_RELOAD
[DEFAULT_ELUNA_BYTECODE_CACHE]=AC_ELUNA_BYTECODE_CACHE
[DEFAULT_ELUNA_AUTO_RELOAD_INTERVAL]=AC_ELUNA_AUTO_RELOAD_INTERVAL
[DEFAULT_ELUNA_REQUIRE_PATHS]=AC_ELUNA_REQUIRE_PATHS
[DEFAULT_ELUNA_REQUIRE_CPATHS]=AC_ELUNA_REQUIRE_CPATHS
[DEFAULT_MODULE_ELUNA]=MODULE_ELUNA
)
# Permission schemes (hardcoded as not in template)
readonly PERMISSION_LOCAL_USER="0:0"
readonly PERMISSION_NFS_USER="1001:1000"
readonly DEFAULT_CUSTOM_UID="1000"
readonly DEFAULT_CUSTOM_GID="1000"
for __template_var in "${!TEMPLATE_VALUE_MAP[@]}"; do
__template_key="${TEMPLATE_VALUE_MAP[$__template_var]}"
__template_value="$(get_template_value "${__template_key}")"
printf -v "${__template_var}" '%s' "${__template_value}"
readonly "${__template_var}"
done
unset __template_var __template_key __template_value
# Static values
readonly DEFAULT_LOCAL_ADDRESS="$(get_template_value "SERVER_ADDRESS")"
readonly DEFAULT_FALLBACK_LAN_IP="192.168.1.100"
readonly DEFAULT_DOMAIN_PLACEHOLDER="your-domain.com"
readonly DEFAULT_BACKUP_DAYS="$(get_template_value "BACKUP_RETENTION_DAYS")"
readonly DEFAULT_BACKUP_HOURS="$(get_template_value "BACKUP_RETENTION_HOURS")"
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_MOUNT_STORAGE="/mnt/azerothcore-data"
# Docker images (from .env.template)
readonly DEFAULT_MYSQL_IMAGE="$(get_template_value "MYSQL_IMAGE")"
readonly DEFAULT_AC_DB_IMPORT_IMAGE="$(get_template_value "AC_DB_IMPORT_IMAGE")"
readonly DEFAULT_AC_AUTHSERVER_IMAGE="$(get_template_value "AC_AUTHSERVER_IMAGE")"
readonly DEFAULT_AC_WORLDSERVER_IMAGE="$(get_template_value "AC_WORLDSERVER_IMAGE")"
readonly DEFAULT_AC_CLIENT_DATA_IMAGE="$(get_template_value "AC_CLIENT_DATA_IMAGE")"
readonly DEFAULT_AUTH_IMAGE_PLAYERBOTS="$(get_template_value "AC_AUTHSERVER_IMAGE_PLAYERBOTS")"
readonly DEFAULT_WORLD_IMAGE_PLAYERBOTS="$(get_template_value "AC_WORLDSERVER_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_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
readonly DEFAULT_DB_AUTH_NAME="$(get_template_value "DB_AUTH_NAME")"
readonly DEFAULT_DB_WORLD_NAME="$(get_template_value "DB_WORLD_NAME")"
readonly DEFAULT_DB_CHARACTERS_NAME="$(get_template_value "DB_CHARACTERS_NAME")"
readonly DEFAULT_DB_PLAYERBOTS_NAME="$(get_template_value "DB_PLAYERBOTS_NAME")"
# Container names
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_CLIENT_DATA_VOLUME="$(get_template_value "CLIENT_DATA_VOLUME")"
# Version constants
readonly DEFAULT_CLIENT_DATA_VERSION="$(get_template_value "CLIENT_DATA_VERSION")"
# Network configuration
readonly DEFAULT_NETWORK_NAME="$(get_template_value "NETWORK_NAME")"
readonly DEFAULT_NETWORK_SUBNET="$(get_template_value "NETWORK_SUBNET")"
readonly DEFAULT_NETWORK_GATEWAY="$(get_template_value "NETWORK_GATEWAY")"
# MySQL configuration
readonly DEFAULT_MYSQL_CHARACTER_SET="$(get_template_value "MYSQL_CHARACTER_SET")"
readonly DEFAULT_MYSQL_COLLATION="$(get_template_value "MYSQL_COLLATION")"
readonly DEFAULT_MYSQL_MAX_CONNECTIONS="$(get_template_value "MYSQL_MAX_CONNECTIONS")"
readonly DEFAULT_MYSQL_INNODB_BUFFER_POOL_SIZE="$(get_template_value "MYSQL_INNODB_BUFFER_POOL_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_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
readonly DEFAULT_HOST_ZONEINFO_PATH="$(get_template_value "HOST_ZONEINFO_PATH")"
readonly DEFAULT_ELUNA_SCRIPT_PATH="$(get_template_value "AC_ELUNA_SCRIPT_PATH")"
# Tool configuration
readonly DEFAULT_PMA_EXTERNAL_PORT="$(get_template_value "PMA_EXTERNAL_PORT")"
readonly DEFAULT_PMA_UPLOAD_LIMIT="$(get_template_value "PMA_UPLOAD_LIMIT")"
readonly DEFAULT_PMA_MEMORY_LIMIT="$(get_template_value "PMA_MEMORY_LIMIT")"
readonly DEFAULT_PMA_MAX_EXECUTION_TIME="$(get_template_value "PMA_MAX_EXECUTION_TIME")"
readonly DEFAULT_KEIRA3_EXTERNAL_PORT="$(get_template_value "KEIRA3_EXTERNAL_PORT")"
readonly DEFAULT_PMA_USER="$(get_template_value "PMA_USER")"
readonly DEFAULT_PMA_ARBITRARY="$(get_template_value "PMA_ARBITRARY")"
readonly DEFAULT_PMA_ABSOLUTE_URI="$(get_template_value "PMA_ABSOLUTE_URI")"
# Module preset names (not in template)
readonly DEFAULT_PRESET_SUGGESTED="suggested-modules"
readonly DEFAULT_PRESET_PLAYERBOTS="playerbots-suggested-modules"
# Internal ports
readonly DEFAULT_AUTH_INTERNAL_PORT="$(get_template_value "AUTH_PORT")"
readonly DEFAULT_WORLD_INTERNAL_PORT="$(get_template_value "WORLD_PORT")"
readonly DEFAULT_SOAP_INTERNAL_PORT="$(get_template_value "SOAP_PORT")"
readonly DEFAULT_MYSQL_INTERNAL_PORT="$(get_template_value "MYSQL_PORT")"
# System configuration
readonly DEFAULT_TZ="$(get_template_value "TZ")"
readonly DEFAULT_MYSQL_ROOT_HOST="$(get_template_value "MYSQL_ROOT_HOST")"
readonly DEFAULT_MYSQL_USER="$(get_template_value "MYSQL_USER")"
# Eluna configuration
readonly DEFAULT_ELUNA_ENABLED="$(get_template_value "AC_ELUNA_ENABLED")"
readonly DEFAULT_ELUNA_TRACE_BACK="$(get_template_value "AC_ELUNA_TRACE_BACK")"
readonly DEFAULT_ELUNA_AUTO_RELOAD="$(get_template_value "AC_ELUNA_AUTO_RELOAD")"
readonly DEFAULT_ELUNA_BYTECODE_CACHE="$(get_template_value "AC_ELUNA_BYTECODE_CACHE")"
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_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")"
# Health check configuration (loaded via loop)
readonly -a HEALTHCHECK_KEYS=(
MYSQL_HEALTHCHECK_INTERVAL
MYSQL_HEALTHCHECK_TIMEOUT
MYSQL_HEALTHCHECK_RETRIES
MYSQL_HEALTHCHECK_START_PERIOD
AUTH_HEALTHCHECK_INTERVAL
AUTH_HEALTHCHECK_TIMEOUT
AUTH_HEALTHCHECK_RETRIES
AUTH_HEALTHCHECK_START_PERIOD
WORLD_HEALTHCHECK_INTERVAL
WORLD_HEALTHCHECK_TIMEOUT
WORLD_HEALTHCHECK_RETRIES
WORLD_HEALTHCHECK_START_PERIOD
BACKUP_HEALTHCHECK_INTERVAL
BACKUP_HEALTHCHECK_TIMEOUT
BACKUP_HEALTHCHECK_RETRIES
BACKUP_HEALTHCHECK_START_PERIOD
)
for __hc_key in "${HEALTHCHECK_KEYS[@]}"; do
__hc_value="$(get_template_value "${__hc_key}")"
printf -v "DEFAULT_${__hc_key}" '%s' "$__hc_value"
readonly "DEFAULT_${__hc_key}"
done
unset __hc_key __hc_value
# Route detection IP (not in template)
readonly ROUTE_DETECTION_IP="1.1.1.1"
@@ -1252,7 +1248,6 @@ fi
fi
DB_PLAYERBOTS_NAME=${DB_PLAYERBOTS_NAME:-$DEFAULT_DB_PLAYERBOTS_NAME}
local CLIENT_DATA_CACHE_PATH_VALUE="${LOCAL_STORAGE_ROOT}/client-data-cache"
HOST_ZONEINFO_PATH=${HOST_ZONEINFO_PATH:-$DEFAULT_HOST_ZONEINFO_PATH}
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}
@@ -1273,34 +1268,25 @@ fi
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}
for hc_key in "${HEALTHCHECK_KEYS[@]}"; do
default_var="DEFAULT_${hc_key}"
printf -v "$hc_key" '%s' "${!hc_key:-${!default_var}}"
done
unset hc_key default_var
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
BACKUP_PATH=${BACKUP_PATH:-$DEFAULT_BACKUP_PATH}
cat > "$ENV_OUT" <<EOF
{
cat <<EOF
# Generated by ac-compose/setup.sh
COMPOSE_PROJECT_NAME=$DEFAULT_COMPOSE_PROJECT_NAME
STORAGE_PATH=$STORAGE_PATH
STORAGE_PATH_LOCAL=$LOCAL_STORAGE_ROOT
HOST_BACKUP_PATH=$HOST_BACKUP_PATH_VALUE
BACKUP_PATH=$BACKUP_PATH
HOST_ZONEINFO_PATH=${HOST_ZONEINFO_PATH:-$DEFAULT_HOST_ZONEINFO_PATH}
TZ=$DEFAULT_TZ
# Database
MYSQL_IMAGE=$DEFAULT_MYSQL_IMAGE
CONTAINER_MYSQL=$DEFAULT_CONTAINER_MYSQL
@@ -1336,7 +1322,7 @@ AC_WORLDSERVER_IMAGE_MODULES=${AC_WORLDSERVER_IMAGE_MODULES_VALUE}
# Client data images
AC_CLIENT_DATA_IMAGE=$DEFAULT_AC_CLIENT_DATA_IMAGE
AC_CLIENT_DATA_IMAGE_PLAYERBOTS=$DEFAULT_CLIENT_DATA_IMAGE_PLAYERBOTS
CLIENT_DATA_CACHE_PATH=$CLIENT_DATA_CACHE_PATH_VALUE
CLIENT_DATA_CACHE_PATH=$DEFAULT_CLIENT_DATA_CACHE_PATH
CLIENT_DATA_VOLUME=${CLIENT_DATA_VOLUME:-$DEFAULT_CLIENT_DATA_VOLUME}
# Containers
@@ -1364,10 +1350,6 @@ BACKUP_RETENTION_HOURS=$BACKUP_RETENTION_HOURS
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
@@ -1452,18 +1434,11 @@ KEIRA_DATABASE_HOST=$DEFAULT_CONTAINER_MYSQL
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
EOF
for hc_key in "${HEALTHCHECK_KEYS[@]}"; do
printf "%s=%s\n" "$hc_key" "${!hc_key}"
done
cat <<EOF
# Networking
NETWORK_NAME=$DEFAULT_NETWORK_NAME
@@ -1474,11 +1449,13 @@ NETWORK_GATEWAY=$DEFAULT_NETWORK_GATEWAY
ALPINE_GIT_IMAGE=$DEFAULT_ALPINE_GIT_IMAGE
ALPINE_IMAGE=$DEFAULT_ALPINE_IMAGE
EOF
} > "$ENV_OUT"
local storage_abs_path="$STORAGE_PATH"
local storage_abs_path="${STORAGE_PATH:-$DEFAULT_LOCAL_STORAGE}"
if [[ "$storage_abs_path" != /* ]]; then
storage_abs_path="$(pwd)/${storage_abs_path#./}"
fi
storage_abs_path="${storage_abs_path%/}"
local host_modules_dir="${storage_abs_path}/modules"
mkdir -p "$host_modules_dir"

View File

@@ -42,7 +42,7 @@ docker info >/dev/null 2>&1 || { echo "Docker daemon unavailable" >&2; exit 1; }
read_env(){
local key="$1" value=""
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' | sed 's/[[:space:]]*#.*//' | sed 's/[[:space:]]*$//')"
fi
echo "$value"
}
@@ -172,7 +172,7 @@ print_service(){
fi
}
module_summary(){
module_summary_list(){
if [ ! -f "$ENV_FILE" ]; then
echo "MODULES: (env not found)"
return
@@ -180,23 +180,17 @@ module_summary(){
local module_vars
module_vars="$(grep -E '^MODULE_[A-Z_]+=1' "$ENV_FILE" 2>/dev/null | cut -d'=' -f1)"
if [ -n "$module_vars" ]; then
local arr=()
echo "MODULES:"
while IFS= read -r mod; do
[ -z "$mod" ] && continue
local pretty="${mod#MODULE_}"
pretty="$(echo "$pretty" | tr '[:upper:]' '[:lower:]' | tr '_' ' ')"
arr+=("$pretty")
pretty="$(echo "$pretty" | tr '[:upper:]' '[:lower:]' | tr '_' ' ' | sed 's/\b\w/\U&/g')"
printf " • %s\n" "$pretty"
done <<< "$module_vars"
local joined=""
for item in "${arr[@]}"; do
joined+="$item, "
done
joined="${joined%, }"
echo "MODULES: $joined"
else
echo "MODULES: none"
fi
echo ""
if container_running "ac-worldserver"; then
local playerbot="disabled"
local module_playerbots
@@ -209,7 +203,7 @@ module_summary(){
fi
local eluna="disabled"
[ "$ELUNA_ENABLED" = "1" ] && eluna="running"
echo "RUNTIME: playerbots $playerbot | eluna $eluna"
# echo "RUNTIME: playerbots $playerbot | eluna $eluna"
fi
}
@@ -290,8 +284,9 @@ show_realm_status_header(){
}
render_snapshot(){
show_realm_status_header
printf "\nTIME %s PROJECT %s\n\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$PROJECT_NAME"
#show_realm_status_header
printf "TIME %s PROJECT %s\n\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$PROJECT_NAME"
user_stats
printf "%-20s %-15s %-28s %s\n" "SERVICE" "CONTAINER" "STATE" "IMAGE"
printf "%-20s %-15s %-28s %s\n" "--------------------" "---------------" "----------------------------" "------------------------------"
print_service ac-mysql "MySQL"
@@ -306,10 +301,10 @@ render_snapshot(){
print_service ac-phpmyadmin "phpMyAdmin"
print_service ac-keira3 "Keira3"
echo ""
module_summary
user_stats
module_summary_list
echo ""
echo "$(ports_summary)"
echo ""
echo "$(network_summary)"
}