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