14 KiB
MoonWell Web
Laravel 12 сайт для World of Warcraft 1.12.1 на vMaNGOS (/home/sindo/core). Игровые аккаунты и права хранятся в базе realmd, персонажи — в characters. Сайт хранит свои данные в отдельной базе Laravel.
Настройка индексации, подтверждение домена и отправка sitemap описаны в инструкции SEO для Яндекса и Google.
Подключение к локальному vMaNGOS
Локальный стенд ядра описан в /home/sindo/core/deploy/local/README.md. Сначала запустите его. Контейнер сайта подключается к сети vmangos-local_default и обращается к MariaDB как db:3306. Пароль пользователя vmangos находится в /home/sindo/core/deploy/local/secrets/db_password; скопируйте его в VMANGOS_AUTH_DB_PASSWORD и VMANGOS_CHARACTERS_DB_PASSWORD своего .env. Текущий локальный .env сайта уже настроен на этот стенд.
VMANGOS_DOCKER_NETWORK=vmangos-local_default
VMANGOS_AUTH_DB_HOST=db
VMANGOS_AUTH_DB_PORT=3306
VMANGOS_AUTH_DB_DATABASE=realmd
VMANGOS_AUTH_DB_USERNAME=vmangos
VMANGOS_CHARACTERS_DB_HOST=db
VMANGOS_CHARACTERS_DB_PORT=3306
VMANGOS_CHARACTERS_DB_DATABASE=characters
VMANGOS_CHARACTERS_DB_USERNAME=vmangos
MOONWELL_CLIENT_VERSION=1.12.1
Для PHP, запущенного прямо на хосте, укажите 127.0.0.1:13306 вместо db:3306.
Production с удалённым ядром
Для соединения через SSH используйте пошаговую инструкцию
и compose.prod.ssh-tunnel.yaml.
compose.prod.yaml подключает приложение только к сети веба sail.
Внешняя Docker-сеть vMaNGOS не требуется. VMANGOS_DOCKER_NETWORK
в .env не влияет на этот режим; DB_* остаются настройками MySQL самого сайта.
Production Compose читает .env, а не .env.production.
Укажите доступный из контейнера приложения адрес и порт MariaDB ядра (прямое соединение, VPN или туннель), базы и учётные данные:
VMANGOS_AUTH_DB_HOST=CORE_DB_HOST
VMANGOS_AUTH_DB_PORT=CORE_DB_PORT
VMANGOS_AUTH_DB_DATABASE=realmd
VMANGOS_AUTH_DB_USERNAME=WEB_DB_USER
VMANGOS_AUTH_DB_PASSWORD=WEB_DB_PASSWORD
VMANGOS_CHARACTERS_DB_HOST=CORE_DB_HOST
VMANGOS_CHARACTERS_DB_PORT=CORE_DB_PORT
VMANGOS_CHARACTERS_DB_DATABASE=characters
VMANGOS_CHARACTERS_DB_USERNAME=WEB_DB_USER
VMANGOS_CHARACTERS_DB_PASSWORD=WEB_DB_PASSWORD
MOONWELL_REALM_STATUS_HOST=CORE_GAME_HOST
Замените значения-заполнители своими. Порт игрового сервера 3724 не является
портом MariaDB. Адрес db используется только внутри сети Docker ядра;
127.0.0.1 внутри контейнера приложения означает сам контейнер.
Если заданы VMANGOS_AUTH_DB_URL или VMANGOS_CHARACTERS_DB_URL,
обновите их либо удалите, чтобы Laravel использовал отдельные *_DB_* значения.
Учётной записи БД и сетевому доступу должны быть разрешены соединения с веб-сервера.
После изменения .env пересоздайте контейнеры и обновите кеш:
docker compose -f compose.prod.yaml up -d --no-deps --force-recreate app web
docker compose -f compose.prod.yaml exec -T --user app app php artisan config:cache
Проверка обеих БД из контейнера (только SELECT 1, без изменения аккаунтов):
docker compose -f compose.prod.yaml exec -T --user app app php artisan tinker --execute='foreach (["vmangos_auth", "vmangos_characters"] as $name) { DB::connection($name)->select("SELECT 1"); echo $name." OK\n"; }'
Для production-ядра на том же Docker-хосте добавьте
-f compose.prod.local-core.yaml во все production-команды Compose,
укажите VMANGOS_DOCKER_NETWORK=vmangos_default (либо фактическую сеть ядра)
и адрес БД db:3306. В локальном Sail compose.yaml подключение к сети
vmangos-local_default сохранено.
Запуск сайта
./vendor/bin/sail up -d
./vendor/bin/sail artisan migrate --force
npm ci
npm run build
Сайт доступен на http://localhost:8080, если APP_PORT=8080. В Laravel остаются отдельные настройки DB_* для данных сайта. После смены .env выполните ./vendor/bin/sail artisan config:clear. Скрипты продакшен-деплоя находятся в scripts/deploy-production.sh и scripts/deploy-ubuntu.sh.
Игровые функции
Манифест нового Rust-клиента публикуется инструментом moonwell-deploy из
moonwell-client-core. Файлы лежат в
World of Warcraft 1.12.1/releases/<buildHash>/, активный манифест —
manifest-1.12.1.json. Для этих значений задайте
MOONWELL_LAUNCHER_BASE_PATH="World of Warcraft 1.12.1" и
MOONWELL_LAUNCHER_MANIFEST_KEY=manifest-1.12.1.json в .env, затем очистите кеш
конфигурации. Учётные данные AWS_* должны указывать на то же хранилище, что
сборщик. Секреты не передаются лаунчеру.
GET /api/launcher/download/{path} разрешает путь только из активного манифеста
и подписывает его objectKey в пределах настроенного префикса. Старый манифест
без objectKey продолжает использовать <base-path>/<path>. Новый манифест
переключается после загрузки всех объектов; старые релизы остаются в S3 для
докачивания и отката. Публикации запускаются последовательно. Windows и macOS
нуждаются в отдельных наборах файлов и настройках манифеста: выбор ОС API пока
не выполняет.
- Регистрация сохраняет пользователя и хеш пароля в
web.users, создаёт случайный постоянный игровой пароль вaccount.s/account.v, связьsite_credentials.web_user_id, запись вrealmcharactersдля каждого реалма и доступ вaccount_access. - Вход на сайт и через API лаунчера проверяет хеш
web.users.passwordдля связанного пользователя. Смена пароля в кабинете обновляетweb.users.password, сохраняя игровой пароль. Для аккаунтов, импортированных предыдущей версией, до связывания сweb.usersподдерживаются уже сохранённые данныеsite_credentials; отдельная старая база для этого не нужна. - Админка меняет уровень доступа в
account_access. Для чтения персонажей используетсяcharacters.played_time_total. - Список реалмов берётся из
realmd.realmlist; доступность определяется проверкой игрового TCP-порта. - Игровой клиент: 1.12.1, build 5875. Лаунчер получает одноразовый билет через
POST /api/launcher/game-ticketс Bearer-токеном и{"client_build":5875}и передаёт возвращённыеaccountиticketклиенту как логин и пароль. Билет действителен не более 60 секунд; новый билет отзывает предыдущий. Модифицированныйrealmdиз/home/sindo/coreдопускает вход в игру только с активным билетом.
Источник импорта — таблица users основной базы сайта (DB_*; используйте фактическое DB_DATABASE, например moonwell-web). Логин берётся из users.name, email — из users.email. Подключение к старой базе AzerothCore не требуется. Перед импортом сделайте резервную копию основной базы сайта и realmd. Если поддержка ticket ещё не установлена, примените /home/sindo/core/sql/migrations/20261003120000_logon.sql к realmd и пересоберите ядро. Затем выполните:
./vendor/bin/sail artisan config:clear
./vendor/bin/sail artisan migrate --force
./vendor/bin/sail artisan vmangos:import-web-accounts --dry-run
./vendor/bin/sail artisan vmangos:import-web-accounts
./vendor/bin/sail artisan config:cache
Команда не меняет web.users.password: создаёт игровые аккаунты со случайными паролями и сохраняет связь по ID веб-пользователя. При повторном запуске уже связанные пользователи пропускаются. Имена должны содержать 3–16 латинских букв или цифр; конфликты имён и email требуют исправления до импорта. Существующий игровой аккаунт с тем же именем и совместимым email связывается с веб-пользователем, его игровому паролю задаётся новое случайное значение; игровые права сохраняются. Новые аккаунты получают VMANGOS_ACCOUNT_GMLEVEL (по умолчанию 0). При первом импорте команда отзывает прежние API-токены и сессии сайта, поскольку прежние ID аккаунтов могут указывать на другого пользователя. Аккаунты RNDBOT пропускаются; для их переноса есть --include-bots.
Если users в веб-дампе пустая, а прежние аккаунты хранились в AzerothCore,
используйте php artisan vmangos:import-azerothcore-accounts /путь/acore_auth.sql.gz --dry-run,
затем повторите без --dry-run. Команда создаёт веб-пользователей, сохраняет
возможность входа прежним паролем и создаёт связанные аккаунты vMaNGOS.
При первом успешном входе старый SRP заменяется Laravel-хешем.
Инструкция для production и описание переноса.
Для отображения даты регистрации и последнего входа в vMaNGOS задайте часовой пояс IANA в .env, например:
VMANGOS_TIMEZONE=Europe/Samara
По умолчанию используется UTC. Подключения к БД vMaNGOS читают и записывают время в UTC; настройка меняет отображение дат в кабинете и админке. Срок действия launcher_ticket всегда рассчитывается в UTC. После изменения выполните php artisan config:cache (или ./vendor/bin/sail artisan config:cache для Sail). Настройка не меняет часовой пояс ОС ядра и код зоны реалма realmlist.timezone.
Магазин по-прежнему использует отдельную базу store через STORE_DB_*. Эти таблицы не входят в vMaNGOS. Игровая валюта сайта хранится в дополнительных таблицах realmd после миграции Laravel; для работы внутри игры нужна отдельная интеграция ядра с API из docs/game-balance-integration.md.
Кнопка «Скачать лаунчер» использует MOONWELL_CLIENT_OBJECT_KEY: укажите
moonwell_launcher_setup.exe, чтобы выдавать Windows-установщик из S3.
После изменения выполните php artisan config:clear или пересоберите кеш
конфигурации production-приложения. Для обновлений самого лаунчера служит
подписанный /appcast.xml; он ссылается на установщик в каталоге
moonwell_launcher/releases/<version>/. Игровые файлы и их манифест используют
отдельные MOONWELL_LAUNCHER_BASE_PATH и MOONWELL_LAUNCHER_MANIFEST_KEY, как
описано выше. Старые файлы клиента 3.3.5a для vMaNGOS не подходят.
Проверка
./vendor/bin/sail artisan test
npm run build
Тесты включают контрольный SRP6-вектор из src/shared/Crypto/InitializeCrypto.cpp ядра vMaNGOS, регистрацию, авторизацию, смену пароля, права и чтение персонажей. Локальное подключение к запущенным realmd и characters проверено отдельно.