160 lines
14 KiB
Markdown
160 lines
14 KiB
Markdown
# MoonWell Web
|
||
|
||
Laravel 12 сайт для World of Warcraft 1.12.1 на vMaNGOS (`/home/sindo/core`). Игровые аккаунты и права хранятся в базе `realmd`, персонажи — в `characters`. Сайт хранит свои данные в отдельной базе Laravel.
|
||
|
||
## Подключение к локальному 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` сайта уже настроен на этот стенд.
|
||
|
||
```dotenv
|
||
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 используйте [пошаговую инструкцию](docs/ssh-core-tunnel.md)
|
||
и `compose.prod.ssh-tunnel.yaml`.
|
||
|
||
`compose.prod.yaml` подключает приложение только к сети веба `sail`.
|
||
Внешняя Docker-сеть vMaNGOS не требуется. `VMANGOS_DOCKER_NETWORK`
|
||
в `.env` не влияет на этот режим; `DB_*` остаются настройками MySQL самого сайта.
|
||
Production Compose читает `.env`, а не `.env.production`.
|
||
|
||
Укажите доступный из контейнера приложения адрес и порт MariaDB ядра
|
||
(прямое соединение, VPN или туннель), базы и учётные данные:
|
||
|
||
```dotenv
|
||
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` пересоздайте контейнеры и обновите кеш:
|
||
|
||
```bash
|
||
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`, без изменения аккаунтов):
|
||
|
||
```bash
|
||
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` сохранено.
|
||
|
||
|
||
## Запуск сайта
|
||
|
||
```bash
|
||
./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` и пересоберите ядро. Затем выполните:
|
||
|
||
```bash
|
||
./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 и описание переноса](docs/restore-azerothcore-accounts.md).
|
||
|
||
Для отображения даты регистрации и последнего входа в vMaNGOS задайте часовой пояс IANA в `.env`, например:
|
||
|
||
```dotenv
|
||
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`](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 не подходят.
|
||
|
||
## Проверка
|
||
|
||
```bash
|
||
./vendor/bin/sail artisan test
|
||
npm run build
|
||
```
|
||
|
||
Тесты включают контрольный SRP6-вектор из `src/shared/Crypto/InitializeCrypto.cpp` ядра vMaNGOS, регистрацию, авторизацию, смену пароля, права и чтение персонажей. Локальное подключение к запущенным `realmd` и `characters` проверено отдельно.
|