restore acore_auth

This commit is contained in:
2026-10-04 20:21:28 +04:00
parent b9f2a6da1e
commit 88af380cab
12 changed files with 887 additions and 6 deletions
+129
View File
@@ -0,0 +1,129 @@
# Восстановление аккаунтов из `acore_auth.sql.gz`
Если в восстановленной базе сайта `users` пустая, а старый сайт создавал
пользователей в `acore_auth.account`, импортируйте аккаунты из резервной копии
авторизации AzerothCore. Команда читает обычный SQL-дамп `mysqldump` или gzip
напрямую. Подключение к старому серверу БД не требуется.
## Что переносится
- Логин и прежний пароль для сайта и лаунчера. Исходные `salt`/`verifier`
временно сохраняются в `users.password` в формате `acsrp1:…`. При первом
успешном входе они заменяются Laravel-хешем введённого пароля.
- Новый игровой аккаунт vMaNGOS со случайным техническим паролем и связью
`site_credentials.web_user_id`. Вход в игру выполняется через `launcher_ticket`.
- Дата регистрации, email, `locked`, `last_ip`. Новые игровые аккаунты получают
максимальный `gmlevel` из старого `account_access` для настроенного
`VMANGOS_ACCOUNT_REALM_ID`. Права уже существующих игровых аккаунтов сохраняются.
AzerothCore проверял пароль без учёта регистра. После первого успешного входа
на сайт или в лаунчер пароль становится чувствительным к регистру: используйте
то написание, с которым выполнен этот вход.
При пустом, повторяющемся или уже занятом email веб-пользователь создаётся
с `email=NULL`; исходный контакт остаётся в `realmd.account.email`. Если
`account.email` пуст, используется `reg_mail`. Для обычной новой регистрации
email по-прежнему обязателен.
Персонажи, баны, магазин и игровые балансы из этого дампа не переносятся.
`RNDBOT` пропускаются; `--include-bots` включает их. Имена должны содержать
3–16 латинских букв или цифр.
## Production
Выполняйте в каталоге проекта сайта, где лежат `.env`, `compose.prod.yaml`
и `acore_auth.sql.gz`.
1. Сделайте резервные копии текущей основной базы сайта (`DB_DATABASE`, в данном
развёртывании `moonwell-web`) и vMaNGOS `realmd`.
2. Доставьте обновлённый код на сервер и пересоберите контейнеры:
```bash
./scripts/deploy-production.sh
```
Если используется SSH-туннель к ядру, можно указать
`./scripts/deploy-production.sh --ssh-tunnel`. Скрипт сам включает этот режим
при `VMANGOS_AUTH_DB_HOST=core-db-tunnel`. Он также выполняет миграции,
включая разрешение пустого email в `users`.
3. Задайте функцию для команд Compose:
```bash
prod() { docker compose -f compose.prod.yaml "$@"; }
```
Для SSH-туннеля используйте **вместо неё**:
```bash
prod() { docker compose -f compose.prod.yaml -f compose.prod.ssh-tunnel.yaml "$@"; }
```
4. Проверьте gzip и скопируйте дамп в PHP-контейнер:
```bash
gzip -t acore_auth.sql.gz
prod cp acore_auth.sql.gz app:/tmp/acore_auth.sql.gz
prod exec -T --user root app sh -c 'chown app:app /tmp/acore_auth.sql.gz && chmod 600 /tmp/acore_auth.sql.gz'
```
Файл из корня проекта на хосте сам по себе не виден внутри production
контейнера. Дампы исключены из Docker-образа и Git.
5. Выполните проверку без записи:
```bash
prod exec -T --user app app php artisan vmangos:import-azerothcore-accounts /tmp/acore_auth.sql.gz --dry-run
```
Ожидаемый результат: `Created: N; linked: N; already imported: N; bots skipped: N.`
`Created` — новые игровые аккаунты, `linked` — существующие игровые аккаунты,
для которых будет создан веб-пользователь. При конфликтах команда выводит
причину и завершается с ошибкой до начала записи. Если имя исходной базы
отличается от `acore_auth`, добавьте `--database=ИМЯ_ИСХОДНОЙ_БАЗЫ`.
6. На время записи приостановите вход и регистрацию на сайте:
```bash
prod exec -T --user app app php artisan down
prod exec -T --user app app php artisan vmangos:import-azerothcore-accounts /tmp/acore_auth.sql.gz
```
После завершения включите сайт и удалите копию дампа из контейнера:
```bash
prod exec -T --user app app php artisan up
prod exec -T --user app app rm /tmp/acore_auth.sql.gz
```
Если импорт завершился ошибкой, сохраните вывод для диагностики; `artisan up`
возвращает сайт из режима обслуживания. Конфликты проверяются заранее,
но две базы на разных серверах не имеют общей транзакции: при сбое соединения
во время записи проверьте обе базы перед повторным запуском.
7. Войдите на сайт прежним логином и паролем. После первого входа пользователя
поле `users.password` станет обычным Laravel-хешем.
## Повторный запуск
Уже связанные с существующим веб-пользователем игровые аккаунты пропускаются.
Команда сохраняет их текущие пароли и права. Она не заменяет пароль существующего
несвязанного веб-пользователя: такой конфликт нужно разрешить отдельно.
При создании связей отзываются прежние API-токены и сессии сайта. При связывании
существующего игрового аккаунта меняется его технический игровой пароль,
очищаются `sessionkey` и активный `launcher_ticket`.
Отдельно запускать `vmangos:import-web-accounts` после этой команды не нужно:
веб-пользователи и связи с vMaNGOS уже созданы.
## Локальная проверка
```bash
./vendor/bin/sail artisan migrate --force
./vendor/bin/sail artisan vmangos:import-azerothcore-accounts /var/www/html/acore_auth.sql.gz --dry-run
./vendor/bin/sail artisan vmangos:import-azerothcore-accounts /var/www/html/acore_auth.sql.gz
```
Sail монтирует рабочий каталог проекта целиком, поэтому локальный дамп в корне
проекта доступен по этому пути.