diff --git a/.env.example b/.env.example index 19fb464..ab24b6f 100644 --- a/.env.example +++ b/.env.example @@ -85,6 +85,33 @@ ACORE_ACCOUNT_DEFAULT_REALM_ID=-1 # 0 = Classic, 1 = TBC, 2 = WotLK. ACORE_ACCOUNT_DEFAULT_EXPANSION=2 +# ------------------------------------------------------------------------------ +# realmlist / адрес realm для клиентов +# ------------------------------------------------------------------------------ + +# ID realm в таблице `acore_auth.realmlist`. +# Должен совпадать с RealmID в worldserver.conf. +ACORE_REALMLIST_ID=1 + +# Название realm в списке серверов клиента. +ACORE_REALMLIST_NAME=MoonWell + +# Внешний адрес, который authserver отдаст клиентам. +# На VPS здесь обычно нужен публичный IP или домен сервера. +ACORE_REALMLIST_PUBLIC_ADDRESS=127.0.0.1 + +# Локальный адрес для клиентов из той же сети/LAN. +# Если не используете LAN-доступ, можно оставить 127.0.0.1. +ACORE_REALMLIST_LOCAL_ADDRESS=127.0.0.1 + +# Маска локальной сети для определения, кому отдавать localAddress. +# Для обычной домашней / VPS-сети часто подходит 255.255.255.0. +ACORE_REALMLIST_LOCAL_SUBNET_MASK=255.255.255.0 + +# Порт worldserver, который клиент должен использовать после логина. +# Обычно совпадает с DOCKER_WORLD_EXTERNAL_PORT. +ACORE_REALMLIST_PORT=8085 + # ------------------------------------------------------------------------------ # Общие флаги helper-скриптов # ------------------------------------------------------------------------------ diff --git a/start-server.sh b/start-server.sh index b630913..2951464 100644 --- a/start-server.sh +++ b/start-server.sh @@ -64,14 +64,19 @@ else docker compose up -d fi +log "synchronizing realmlist" +"$ROOT_DIR/sync-realmlist.sh" + log "current service status" docker compose ps printf '\n' +printf 'Realm: %s:%s\n' "${ACORE_REALMLIST_PUBLIC_ADDRESS:-127.0.0.1}" "${ACORE_REALMLIST_PORT:-${DOCKER_WORLD_EXTERNAL_PORT:-8085}}" printf 'World: 127.0.0.1:%s\n' "${DOCKER_WORLD_EXTERNAL_PORT:-8085}" printf 'Auth: 127.0.0.1:%s\n' "${DOCKER_AUTH_EXTERNAL_PORT:-3724}" printf 'SOAP: 127.0.0.1:%s\n' "${DOCKER_SOAP_EXTERNAL_PORT:-7878}" printf 'Account: ./create-account.sh admin your_password\n' +printf 'RealmDB: ./sync-realmlist.sh\n' printf 'Logs: docker compose logs -f ac-worldserver ac-authserver\n' if (( FOLLOW_LOGS )); then diff --git a/sync-realmlist.sh b/sync-realmlist.sh new file mode 100644 index 0000000..6a2c6e3 --- /dev/null +++ b/sync-realmlist.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +if [[ -f "$ENV_FILE" ]]; then + set -a + # shellcheck disable=SC1090 + source "$ENV_FILE" + set +a +fi + +REALM_ID="${ACORE_REALMLIST_ID:-1}" +REALM_NAME="${ACORE_REALMLIST_NAME:-MoonWell}" +REALM_PUBLIC_ADDRESS="${ACORE_REALMLIST_PUBLIC_ADDRESS:-127.0.0.1}" +REALM_LOCAL_ADDRESS="${ACORE_REALMLIST_LOCAL_ADDRESS:-127.0.0.1}" +REALM_LOCAL_SUBNET_MASK="${ACORE_REALMLIST_LOCAL_SUBNET_MASK:-255.255.255.0}" +REALM_PORT="${ACORE_REALMLIST_PORT:-${DOCKER_WORLD_EXTERNAL_PORT:-8085}}" + +usage() { + cat <&2 + exit 1 + fi +} + +sql_quote() { + local value="$1" + value="${value//\\/\\\\}" + value="${value//\'/\\\'}" + printf "'%s'" "$value" +} + +if (($# > 0)); then + case "$1" in + -h|--help) + usage + exit 0 + ;; + *) + printf 'Unknown option: %s\n\n' "$1" >&2 + usage >&2 + exit 1 + ;; + esac +fi + +require_integer "ACORE_REALMLIST_ID" "$REALM_ID" +require_integer "ACORE_REALMLIST_PORT" "$REALM_PORT" + +if [[ -z "$REALM_NAME" || -z "$REALM_PUBLIC_ADDRESS" || -z "$REALM_LOCAL_ADDRESS" || -z "$REALM_LOCAL_SUBNET_MASK" ]]; then + printf 'realmlist values must not be empty\n' >&2 + exit 1 +fi + +cd "$ROOT_DIR" + +if ! docker compose ps --status running --services | grep -qx 'ac-database'; then + printf 'ac-database is not running. Start the server first with ./start-server.sh\n' >&2 + exit 1 +fi + +SQL=$(cat < ${REALM_PUBLIC_ADDRESS}:${REALM_PORT}" + +docker compose exec -T ac-database bash -lc 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" acore_auth' <<<"$SQL" + +if docker compose ps --status running --services | grep -qx 'ac-authserver'; then + log "restarting authserver so it reloads realmlist" + docker compose restart ac-authserver >/dev/null +else + log "authserver is not running, skipped restart" +fi + +log "realmlist synced"