Files
moonwell-web/README.md
T
2026-10-04 20:21:28 +04:00

160 lines
14 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.
# 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` проверено отдельно.