# ============================================== # 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 - type: tmpfs target: /var/lib/mysql-runtime tmpfs: 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} 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 (one-time setup) ac-db-init: image: ${MYSQL_IMAGE} container_name: ${CONTAINER_DB_INIT} volumes: - ${STORAGE_PATH}/mysql-data:/var/lib/mysql-persistent 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 - | # Install curl for downloading db init script (handle different package managers) microdnf install -y curl || yum install -y curl || (apt-get update && apt-get install -y curl) # Download db init script from GitHub echo "📥 Downloading database initialization script from GitHub..." curl -fsSL https://raw.githubusercontent.com/uprightbass360/acore-compose/main/scripts/db-init.sh -o /tmp/db-init.sh chmod +x /tmp/db-init.sh /tmp/db-init.sh restart: "no" # Step 4: Database import (one-time setup - run after db-init) 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 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" # Use the default AzerothCore dbimport entrypoint restart: "no" networks: azerothcore: driver: bridge name: ${NETWORK_NAME} ipam: config: - subnet: ${NETWORK_SUBNET} gateway: ${NETWORK_GATEWAY}