144 lines
8.8 KiB
Markdown
144 lines
8.8 KiB
Markdown
# Восстановление аккаунтов из `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 монтирует рабочий каталог проекта целиком, поэтому локальный дамп в корне
|
||
проекта доступен по этому пути.
|