Files
moonwell-web/docs/restore-azerothcore-accounts.md
T
2026-10-04 20:51:37 +04:00

144 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Восстановление аккаунтов из `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.
Все команды `prod` выполняются на хосте из каталога проекта. Запускайте
Artisan через `prod exec`, чтобы он использовал окружение приложения.
Ошибка `The auth backup file is not readable` означает, что указанный путь
отсутствует либо недоступен пользователю PHP в том окружении, где выполняется
команда. Проверить копию внутри контейнера можно так:
```bash
prod exec -T --user app app sh -c 'test -r /tmp/acore_auth.sql.gz && ls -lh /tmp/acore_auth.sql.gz'
```
Предупреждение `Invalid date.timezone value ''` относится к настройке PHP,
а не к дампу. Production-образ задаёт `date.timezone=UTC`. Для разового запуска
с явной настройкой используйте `php -d date.timezone=UTC artisan ...`.
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 монтирует рабочий каталог проекта целиком, поэтому локальный дамп в корне
проекта доступен по этому пути.