This commit is contained in:
2026-10-03 14:33:08 +04:00
parent 6a73d760c4
commit 93a9442e1c
67 changed files with 941 additions and 698 deletions
+20 -12
View File
@@ -74,9 +74,17 @@ dump_remote_database() {
local port="$4"
local username="$5"
local password="$6"
local network=host
log "Создаю дамп AzerothCore ${database}"
docker run --rm --network host \
if [[ "$host" == host.docker.internal ]]; then
host=127.0.0.1
elif [[ "$host" == db ]]; then
network="$(env_value VMANGOS_DOCKER_NETWORK)"
network="${network:-vmangos_default}"
fi
log "Создаю дамп vMaNGOS ${database}"
docker run --rm --network "$network" \
--env MYSQL_PWD="$password" \
mysql:8.4 \
mysqldump \
@@ -125,7 +133,7 @@ main() {
fi
local timestamp object_prefix web_database
local acore_host acore_port acore_username acore_password acore_databases
local vmangos_host vmangos_port vmangos_username vmangos_password vmangos_databases
local database filename
local -a databases=() files=()
@@ -134,15 +142,15 @@ main() {
object_prefix="${object_prefix:-backups/databases}"
object_prefix="${object_prefix%/}/$(date -u '+%Y/%m/%d')/${timestamp}"
web_database="$(env_value DB_DATABASE)"
acore_host="$(env_value AZEROTHCORE_AUTH_DB_HOST)"
acore_port="$(env_value AZEROTHCORE_AUTH_DB_PORT)"
acore_username="$(env_value AZEROTHCORE_AUTH_DB_USERNAME)"
acore_password="$(env_value AZEROTHCORE_AUTH_DB_PASSWORD)"
acore_databases="$(env_value DATABASE_BACKUP_ACORE_DATABASES)"
acore_databases="${acore_databases:-acore_auth acore_characters acore_world acore_playerbots store}"
vmangos_host="$(env_value VMANGOS_AUTH_DB_HOST)"
vmangos_port="$(env_value VMANGOS_AUTH_DB_PORT)"
vmangos_username="$(env_value VMANGOS_AUTH_DB_USERNAME)"
vmangos_password="$(env_value VMANGOS_AUTH_DB_PASSWORD)"
vmangos_databases="$(env_value DATABASE_BACKUP_VMANGOS_DATABASES)"
vmangos_databases="${vmangos_databases:-realmd characters mangos logs}"
[[ -n "$web_database" ]] || fail 'DB_DATABASE не задан'
[[ -n "$acore_host" && -n "$acore_port" && -n "$acore_username" ]] || fail 'Не настроено подключение к AzerothCore'
[[ -n "$vmangos_host" && -n "$vmangos_port" && -n "$vmangos_username" ]] || fail 'Не настроено подключение к vMaNGOS'
validate_database_name "$web_database"
RUN_DIR="${BACKUP_WORK_DIR}/${timestamp}"
@@ -154,10 +162,10 @@ main() {
databases+=("$web_database")
files+=("$filename")
for database in $acore_databases; do
for database in $vmangos_databases; do
validate_database_name "$database"
filename="${database}.sql.gz"
dump_remote_database "$database" "${RUN_DIR}/${filename}" "$acore_host" "$acore_port" "$acore_username" "$acore_password"
dump_remote_database "$database" "${RUN_DIR}/${filename}" "$vmangos_host" "$vmangos_port" "$vmangos_username" "$vmangos_password"
databases+=("$database")
files+=("$filename")
done
+22 -15
View File
@@ -17,8 +17,8 @@ usage() {
Опции:
--env=PATH путь к .env (по умолчанию ./.env)
--target=NAME какая БД: app (laravel), auth (acore_auth),
characters (acore_characters), all (по умолчанию для export)
--target=NAME какая БД: app (laravel), auth (realmd),
characters (characters), all (по умолчанию для export)
--out=DIR куда писать дампы (по умолчанию storage/backups)
--gzip сжимать дамп gzip-ом (по умолчанию включено для export)
--no-gzip не сжимать
@@ -37,7 +37,7 @@ usage() {
Примеры:
./scripts/db-backup.sh export
./scripts/db-backup.sh export --target=auth --out=/tmp
./scripts/db-backup.sh import /tmp/acore_auth_2026-04-26.sql.gz --target=auth
./scripts/db-backup.sh import /tmp/realmd_2026-04-26.sql.gz --target=auth
./scripts/db-backup.sh import dump.sql.gz --target=app --create-db --force
EOF
}
@@ -87,18 +87,18 @@ load_target() {
fi
;;
auth)
DB_HOST="$(env_get AZEROTHCORE_AUTH_DB_HOST "$ENV_FILE")"
DB_PORT="$(env_get AZEROTHCORE_AUTH_DB_PORT "$ENV_FILE")"
DB_NAME="$(env_get AZEROTHCORE_AUTH_DB_DATABASE "$ENV_FILE")"
DB_USER="$(env_get AZEROTHCORE_AUTH_DB_USERNAME "$ENV_FILE")"
DB_PASS="$(env_get AZEROTHCORE_AUTH_DB_PASSWORD "$ENV_FILE")"
DB_HOST="$(env_get VMANGOS_AUTH_DB_HOST "$ENV_FILE")"
DB_PORT="$(env_get VMANGOS_AUTH_DB_PORT "$ENV_FILE")"
DB_NAME="$(env_get VMANGOS_AUTH_DB_DATABASE "$ENV_FILE")"
DB_USER="$(env_get VMANGOS_AUTH_DB_USERNAME "$ENV_FILE")"
DB_PASS="$(env_get VMANGOS_AUTH_DB_PASSWORD "$ENV_FILE")"
;;
characters)
DB_HOST="$(env_get AZEROTHCORE_CHARACTERS_DB_HOST "$ENV_FILE")"
DB_PORT="$(env_get AZEROTHCORE_CHARACTERS_DB_PORT "$ENV_FILE")"
DB_NAME="$(env_get AZEROTHCORE_CHARACTERS_DB_DATABASE "$ENV_FILE")"
DB_USER="$(env_get AZEROTHCORE_CHARACTERS_DB_USERNAME "$ENV_FILE")"
DB_PASS="$(env_get AZEROTHCORE_CHARACTERS_DB_PASSWORD "$ENV_FILE")"
DB_HOST="$(env_get VMANGOS_CHARACTERS_DB_HOST "$ENV_FILE")"
DB_PORT="$(env_get VMANGOS_CHARACTERS_DB_PORT "$ENV_FILE")"
DB_NAME="$(env_get VMANGOS_CHARACTERS_DB_DATABASE "$ENV_FILE")"
DB_USER="$(env_get VMANGOS_CHARACTERS_DB_USERNAME "$ENV_FILE")"
DB_PASS="$(env_get VMANGOS_CHARACTERS_DB_PASSWORD "$ENV_FILE")"
;;
*)
err "Неизвестная цель: $target"; exit 2;;
@@ -131,7 +131,7 @@ have_native_mysql() {
run_mysql_tool() {
local tool="$1"; shift
if have_native_mysql; then
if have_native_mysql && [[ "$DB_HOST" != db ]]; then
local defaults
defaults="$(mktemp)"
chmod 600 "$defaults"
@@ -179,7 +179,14 @@ run_mysql_tool() {
pwd_value="$DB_PASS"
fi
docker run --rm -i \
local -a network_args=()
if [[ "$DB_HOST" == db ]]; then
local vmangos_network
vmangos_network="$(env_get VMANGOS_DOCKER_NETWORK "$ENV_FILE")"
network_args=(--network "${vmangos_network:-vmangos-local_default}")
fi
docker run --rm -i "${network_args[@]}" \
--add-host=host.docker.internal:host-gateway \
-e MYSQL_PWD="$pwd_value" \
"$MYSQL_CLIENT_IMAGE" \
+2 -2
View File
@@ -31,7 +31,7 @@ usage() {
Требования:
- Ubuntu с установленными Docker Engine и Docker Compose Plugin
- настроенный .env с корректными значениями APP_URL и AZEROTHCORE_AUTH_DB_*
- настроенный .env с корректными значениями APP_URL и VMANGOS_AUTH_DB_*
EOF
}
@@ -122,7 +122,7 @@ prepare_env() {
set_env_value "APP_DEBUG" "false"
log "Создан ${ENV_FILE} из .env.example"
log "Проверь APP_URL и AZEROTHCORE_AUTH_DB_* перед публичным запуском"
log "Проверь APP_URL и VMANGOS_AUTH_DB_* перед публичным запуском"
}
prepare_directories() {