mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 09:07:20 +00:00
refactoring and adding automations
This commit is contained in:
199
V1/docker-compose-azerothcore-database.yml
Normal file
199
V1/docker-compose-azerothcore-database.yml
Normal file
@@ -0,0 +1,199 @@
|
||||
# ==============================================
|
||||
# AZEROTHCORE DATABASE LAYER
|
||||
# ==============================================
|
||||
|
||||
services:
|
||||
# Step 1: MySQL database
|
||||
ac-mysql:
|
||||
image: ${MYSQL_IMAGE}
|
||||
container_name: ${CONTAINER_MYSQL}
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_ROOT_HOST: '${MYSQL_ROOT_HOST}'
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: no
|
||||
MYSQL_DATADIR: /var/lib/mysql-runtime
|
||||
# MySQL configuration variables for startup script
|
||||
MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET}
|
||||
MYSQL_COLLATION: ${MYSQL_COLLATION}
|
||||
MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS}
|
||||
MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE}
|
||||
MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE}
|
||||
ports:
|
||||
- "${MYSQL_EXTERNAL_PORT}:${MYSQL_PORT}"
|
||||
volumes:
|
||||
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
|
||||
- ${HOST_BACKUP_PATH}:/backups
|
||||
tmpfs:
|
||||
- /var/lib/mysql-runtime:size=2G
|
||||
command:
|
||||
- mysqld
|
||||
- --datadir=/var/lib/mysql-runtime
|
||||
- --default-authentication-plugin=mysql_native_password
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --max_connections=1000
|
||||
- --innodb-buffer-pool-size=256M
|
||||
- --innodb-log-file-size=64M
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "sh", "-c", "mysqladmin ping -h localhost -u ${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} --silent || exit 1"]
|
||||
interval: ${MYSQL_HEALTHCHECK_INTERVAL}
|
||||
timeout: ${MYSQL_HEALTHCHECK_TIMEOUT}
|
||||
retries: ${MYSQL_HEALTHCHECK_RETRIES}
|
||||
start_period: ${MYSQL_HEALTHCHECK_START_PERIOD}
|
||||
networks:
|
||||
- azerothcore
|
||||
|
||||
# Step 2: Backup service
|
||||
ac-backup:
|
||||
image: ${MYSQL_IMAGE}
|
||||
container_name: ${CONTAINER_BACKUP}
|
||||
depends_on:
|
||||
ac-db-import:
|
||||
condition: service_completed_successfully
|
||||
environment:
|
||||
MYSQL_HOST: ${CONTAINER_MYSQL}
|
||||
MYSQL_PORT: ${MYSQL_PORT}
|
||||
MYSQL_USER: ${MYSQL_USER}
|
||||
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS}
|
||||
BACKUP_RETENTION_HOURS: ${BACKUP_RETENTION_HOURS}
|
||||
BACKUP_DAILY_TIME: ${BACKUP_DAILY_TIME}
|
||||
DB_AUTH_NAME: ${DB_AUTH_NAME}
|
||||
DB_WORLD_NAME: ${DB_WORLD_NAME}
|
||||
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
|
||||
TZ: ${TZ}
|
||||
volumes:
|
||||
- ${HOST_BACKUP_PATH}:/backups
|
||||
working_dir: /tmp
|
||||
command:
|
||||
- /bin/bash
|
||||
- -c
|
||||
- |
|
||||
# Install curl for downloading backup scheduler script (handle different package managers)
|
||||
microdnf install -y curl || yum install -y curl || (apt-get update && apt-get install -y curl)
|
||||
|
||||
# Download backup scheduler script from GitHub
|
||||
echo "📥 Downloading backup scheduler script from GitHub..."
|
||||
curl -fsSL https://raw.githubusercontent.com/uprightbass360/acore-compose/main/scripts/backup-scheduler.sh -o /tmp/backup-scheduler.sh
|
||||
chmod +x /tmp/backup-scheduler.sh
|
||||
/tmp/backup-scheduler.sh
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- azerothcore
|
||||
|
||||
# Step 3: Database initialization (conditional - only runs if import fails)
|
||||
ac-db-init:
|
||||
image: ${MYSQL_IMAGE}
|
||||
container_name: ${CONTAINER_DB_INIT}
|
||||
depends_on:
|
||||
ac-db-import:
|
||||
condition: service_completed_successfully
|
||||
volumes:
|
||||
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
|
||||
- ${HOST_BACKUP_PATH}:/backups
|
||||
networks:
|
||||
- azerothcore
|
||||
environment:
|
||||
MYSQL_PWD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_HOST: ${CONTAINER_MYSQL}
|
||||
MYSQL_USER: ${MYSQL_USER}
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
DB_WAIT_RETRIES: ${DB_WAIT_RETRIES}
|
||||
DB_WAIT_SLEEP: ${DB_WAIT_SLEEP}
|
||||
DB_AUTH_NAME: ${DB_AUTH_NAME}
|
||||
DB_WORLD_NAME: ${DB_WORLD_NAME}
|
||||
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
|
||||
MYSQL_CHARACTER_SET: ${MYSQL_CHARACTER_SET}
|
||||
MYSQL_COLLATION: ${MYSQL_COLLATION}
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
# Check if databases were already restored/imported
|
||||
if [ -f "/var/lib/mysql-persistent/.restore-completed" ]; then
|
||||
echo "✅ Databases already restored from backup - init not needed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
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}', '${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 need initialization - proceeding with fresh setup"
|
||||
|
||||
# Install curl for downloading db init script
|
||||
microdnf install -y curl || yum install -y curl || (apt-get update && apt-get install -y curl)
|
||||
|
||||
# Create fresh databases only
|
||||
echo "🗄️ Creating fresh AzerothCore databases..."
|
||||
mysql -h ${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_ROOT_PASSWORD} -e "
|
||||
CREATE DATABASE IF NOT EXISTS ${DB_AUTH_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
|
||||
CREATE DATABASE IF NOT EXISTS ${DB_WORLD_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
|
||||
CREATE DATABASE IF NOT EXISTS ${DB_CHARACTERS_NAME} DEFAULT CHARACTER SET ${MYSQL_CHARACTER_SET} COLLATE ${MYSQL_COLLATION};
|
||||
SHOW DATABASES;" || {
|
||||
echo "❌ Failed to create databases"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Set marker for import to proceed
|
||||
echo "$(date): Fresh databases created - import needed" > /var/lib/mysql-persistent/.restore-failed
|
||||
echo "✅ Fresh databases created!"
|
||||
restart: "no"
|
||||
|
||||
# Step 4: Database import (one-time setup - attempts restore first)
|
||||
ac-db-import:
|
||||
image: ${AC_DB_IMPORT_IMAGE}
|
||||
container_name: ${CONTAINER_DB_IMPORT}
|
||||
user: "0:0"
|
||||
depends_on:
|
||||
ac-mysql:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- azerothcore
|
||||
volumes:
|
||||
- ${STORAGE_PATH}/config:/azerothcore/env/dist/etc
|
||||
- ${STORAGE_PATH}/logs:/azerothcore/env/dist/logs
|
||||
- ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent
|
||||
- ./scripts/db-import-conditional.sh:/tmp/db-import-conditional.sh:ro
|
||||
environment:
|
||||
AC_DATA_DIR: "/azerothcore/data"
|
||||
AC_LOGS_DIR: "/azerothcore/logs"
|
||||
AC_LOGIN_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_AUTH_NAME}"
|
||||
AC_WORLD_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_WORLD_NAME}"
|
||||
AC_CHARACTER_DATABASE_INFO: "${CONTAINER_MYSQL};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_CHARACTERS_NAME}"
|
||||
AC_CLOSE_IDLE_CONNECTIONS: "false"
|
||||
AC_UPDATES_ENABLE_DATABASES: "7"
|
||||
AC_UPDATES_AUTO_SETUP: "1"
|
||||
# Additional environment variables for conditional import
|
||||
CONTAINER_MYSQL: ${CONTAINER_MYSQL}
|
||||
MYSQL_PORT: ${MYSQL_PORT}
|
||||
MYSQL_USER: ${MYSQL_USER}
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
DB_AUTH_NAME: ${DB_AUTH_NAME}
|
||||
DB_WORLD_NAME: ${DB_WORLD_NAME}
|
||||
DB_CHARACTERS_NAME: ${DB_CHARACTERS_NAME}
|
||||
CONTAINER_USER: ${CONTAINER_USER}
|
||||
entrypoint:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
# Set ownership for config directories
|
||||
chown ${CONTAINER_USER} /azerothcore/env/dist/etc 2>/dev/null || true
|
||||
|
||||
# Use local conditional db import script
|
||||
echo "📥 Using local database import script..."
|
||||
/tmp/db-import-conditional.sh
|
||||
restart: "no"
|
||||
|
||||
networks:
|
||||
azerothcore:
|
||||
driver: bridge
|
||||
name: ${NETWORK_NAME}
|
||||
ipam:
|
||||
config:
|
||||
- subnet: ${NETWORK_SUBNET}
|
||||
gateway: ${NETWORK_GATEWAY}
|
||||
Reference in New Issue
Block a user