vmangos
This commit is contained in:
@@ -1,160 +1,64 @@
|
||||
# Moonwell Web
|
||||
# MoonWell Web
|
||||
|
||||
Laravel 12-приложение с WoW-лендингом и публичной регистрацией игрового аккаунта напрямую в auth-базу AzerothCore.
|
||||
Laravel 12 сайт для World of Warcraft 1.12.1 на vMaNGOS (`/home/sindo/core`). Игровые аккаунты и права хранятся в базе `realmd`, персонажи — в `characters`. Сайт хранит свои данные в отдельной базе Laravel.
|
||||
|
||||
## Что уже сделано
|
||||
## Подключение к локальному vMaNGOS
|
||||
|
||||
- Развёрнут Laravel `v12.12.1` со свежим `laravel/framework v12.x`.
|
||||
- Главная страница оформлена в тёмной cinematic-стилистике с компоновкой, вдохновлённой официальным сайтом WoW.
|
||||
- Форма регистрации создаёт аккаунт напрямую в `acore_auth` через отдельное соединение `azerothcore_auth`.
|
||||
- При регистрации заполняются таблицы `account`, `realmcharacters` и `account_access`.
|
||||
- Регистрация возможна только по инвайт-коду, который хранится в базе сайта.
|
||||
- Добавлены личный кабинет и админка поверх игровых аккаунтов из auth-базы.
|
||||
- В кабинете доступны смена пароля, список персонажей и ссылка на клиент игры из S3.
|
||||
- В админке доступны просмотр всех аккаунтов, их персонажей, смена `gmlevel` и выпуск инвайт-кодов.
|
||||
- В админке доступны новости для логин-экрана WoW 3.3.5a с публичным `SERVERALERT`-фидом для клиента.
|
||||
- Проект подготовлен под Laravel Sail: приложение работает в контейнере, а AzerothCore auth DB берётся с хоста через `host.docker.internal:3306`.
|
||||
Локальный стенд ядра описан в `/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` сайта уже настроен на этот стенд.
|
||||
|
||||
## Как запускать через Sail
|
||||
```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`. В продакшене настройте `VMANGOS_DOCKER_NETWORK=vmangos_default` и учётные данные продакшен-БД vMaNGOS. Контейнер приложения присоединяется к указанной сети автоматически.
|
||||
|
||||
## Запуск сайта
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
./vendor/bin/sail up -d
|
||||
./vendor/bin/sail composer install
|
||||
./vendor/bin/sail artisan key:generate
|
||||
./vendor/bin/sail artisan migrate
|
||||
./vendor/bin/sail artisan migrate --force
|
||||
npm ci
|
||||
npm run build
|
||||
```
|
||||
|
||||
Сайт будет доступен на `http://localhost:8080`.
|
||||
Сайт доступен на `http://localhost:8080`, если `APP_PORT=8080`. В Laravel остаются отдельные настройки `DB_*` для данных сайта. После смены `.env` выполните `./vendor/bin/sail artisan config:clear`. Скрипты продакшен-деплоя находятся в `scripts/deploy-production.sh` и `scripts/deploy-ubuntu.sh`.
|
||||
|
||||
## Почта техподдержки
|
||||
## Игровые функции
|
||||
|
||||
Для собственного ящика `support@moon-well.online` подготовлен лёгкий
|
||||
Stalwart-сервер с SMTP/IMAP, TLS, DKIM и антиспамом. Инструкция по первому
|
||||
запуску, DNS и подключению Laravel находится в
|
||||
[`docs/mail-server.md`](docs/mail-server.md).
|
||||
- Регистрация создаёт случайный постоянный игровой пароль в `account.s`/`account.v`, SRP-данные пароля сайта в `site_credentials`, запись в `realmcharacters` для каждого реалма и доступ в `account_access`.
|
||||
- Вход на сайт и через API лаунчера сверяет пароль с `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` допускает вход в игру только с активным билетом.
|
||||
|
||||
## Деплой на Ubuntu
|
||||
|
||||
Скрипт деплоя лежит в `scripts/deploy-ubuntu.sh`. Он рассчитан на сервер, где уже установлены:
|
||||
|
||||
- `docker`
|
||||
- `docker compose`
|
||||
|
||||
Перед первым запуском проверь `.env`:
|
||||
|
||||
- `APP_URL`
|
||||
- `APP_PORT`
|
||||
- `FORWARD_DB_PORT`
|
||||
- `AZEROTHCORE_AUTH_DB_HOST`
|
||||
- `AZEROTHCORE_AUTH_DB_PORT`
|
||||
- `AZEROTHCORE_AUTH_DB_DATABASE`
|
||||
- `AZEROTHCORE_AUTH_DB_USERNAME`
|
||||
- `AZEROTHCORE_AUTH_DB_PASSWORD`
|
||||
|
||||
Запуск:
|
||||
Для импорта аккаунтов прежнего сайта из AzerothCore настройте `LEGACY_AUTH_DB_*`, затем выполните:
|
||||
|
||||
```bash
|
||||
chmod +x scripts/deploy-ubuntu.sh
|
||||
./scripts/deploy-ubuntu.sh
|
||||
./vendor/bin/sail artisan migrate --force
|
||||
./vendor/bin/sail artisan vmangos:import-web-accounts --dry-run
|
||||
./vendor/bin/sail artisan vmangos:import-web-accounts
|
||||
```
|
||||
|
||||
Что делает скрипт:
|
||||
Команда переносит веб-верификаторы без знания исходных паролей, создаёт игровые аккаунты со случайными паролями и при повторном запуске пропускает уже перенесённых пользователей. При первом импорте она отзывает прежние API-токены и сессии сайта, поскольку прежние ID аккаунтов могут указывать на другого пользователя. Аккаунты `RNDBOT` пропускаются; для их переноса есть `--include-bots`. Перед запуском `realmd` примените миграцию `/home/sindo/core/sql/migrations/20261003120000_logon.sql` к `realmd` и пересоберите ядро.
|
||||
|
||||
- создаёт `.env` из `.env.example`, если файла ещё нет;
|
||||
- собирает контейнер приложения;
|
||||
- ставит production-зависимости Composer;
|
||||
- генерирует `APP_KEY`, если он пустой;
|
||||
- поднимает контейнеры;
|
||||
- ждёт готовности MySQL;
|
||||
- выполняет `php artisan migrate --force`;
|
||||
- прогревает `config`, `route` и `view` кэш.
|
||||
Магазин по-прежнему использует отдельную базу `store` через `STORE_DB_*`. Эти таблицы не входят в vMaNGOS. Игровая валюта сайта хранится в дополнительных таблицах `realmd` после миграции Laravel; для работы внутри игры нужна отдельная интеграция ядра с API из [`docs/game-balance-integration.md`](docs/game-balance-integration.md).
|
||||
|
||||
Полезные флаги:
|
||||
|
||||
```bash
|
||||
./scripts/deploy-ubuntu.sh --skip-build
|
||||
./scripts/deploy-ubuntu.sh --skip-cache
|
||||
```
|
||||
|
||||
## Production без Sail
|
||||
|
||||
Для production используется отдельный стек `compose.prod.yaml`:
|
||||
|
||||
- `web` — непривилегированный nginx со статикой;
|
||||
- `app` — PHP-FPM с кодом и Composer-зависимостями внутри образа;
|
||||
- `mysql` — постоянная база на томе `sail-mysql`.
|
||||
|
||||
Node.js, Playwright, Xdebug, dev-зависимости Composer и bind-mount исходного кода в production-образы не входят.
|
||||
|
||||
```bash
|
||||
chmod +x scripts/deploy-production.sh
|
||||
./scripts/deploy-production.sh
|
||||
```
|
||||
|
||||
Скрипт сначала собирает и проверяет новый PHP-FPM, выполняет миграции и прогрев кэша, а затем переключает порт с legacy Sail-контейнера на production nginx. Если HTTP-проверка не проходит, legacy-контейнер запускается обратно.
|
||||
|
||||
## Как это связано с AzerothCore
|
||||
|
||||
По умолчанию Sail-контейнер подключается к auth-базе core-сервера так:
|
||||
|
||||
- хост: `host.docker.internal`
|
||||
- порт: `3306`
|
||||
- база: `acore_auth`
|
||||
- пользователь: `root`
|
||||
- пароль: `password`
|
||||
|
||||
Это рассчитано на вашу docker-сборку из `/home/sindo/moonwell-core`, где MySQL опубликован наружу на порт `3306`.
|
||||
|
||||
## Важные переменные
|
||||
|
||||
Основные настройки лежат в `.env.example`:
|
||||
|
||||
- `APP_PORT=8080`
|
||||
- `FORWARD_DB_PORT=3307`
|
||||
- `DB_HOST=mysql`
|
||||
- `AZEROTHCORE_AUTH_DB_HOST=host.docker.internal`
|
||||
- `AZEROTHCORE_AUTH_DB_PORT=3306`
|
||||
- `AZEROTHCORE_AUTH_DB_DATABASE=acore_auth`
|
||||
- `AZEROTHCORE_AUTH_DB_USERNAME=root`
|
||||
- `AZEROTHCORE_AUTH_DB_PASSWORD=password`
|
||||
- `AZEROTHCORE_CHARACTERS_DB_DATABASE=acore_characters`
|
||||
- `MOONWELL_ADMIN_MIN_GMLEVEL=3`
|
||||
- `MOONWELL_BOT_ACCOUNT_PREFIX=RNDBOT`
|
||||
- `MOONWELL_CLIENT_OBJECT_KEY="World of Warcraft.zip"`
|
||||
- `AWS_ENDPOINT=https://storage.yandexcloud.net`
|
||||
- `AWS_BUCKET=warcraft-client`
|
||||
|
||||
## Архитектура
|
||||
|
||||
- `compose.yaml` — Sail-окружение с `laravel.test` и локальным MySQL для самого сайта.
|
||||
- `config/database.php` — отдельное соединение `azerothcore_auth`.
|
||||
- `config/moonwell.php` — настройки realm/landing и регистрации.
|
||||
- `app/Auth/AzerothCoreUserProvider.php` — Laravel-auth поверх игровых аккаунтов.
|
||||
- `app/Services/AzerothCoreAccountService.php` — работа с аккаунтами, персонажами, паролями и `gmlevel`.
|
||||
- `app/Services/GameClientDownloadService.php` — генерация ссылки на клиент из S3.
|
||||
- `app/Services/LoginScreenNewsService.php` — сборка plain-text фида для логин-экрана WoW.
|
||||
- `app/Services/AzerothCoreAccountRegistrar.php` — SRP6-совместимое создание учётной записи AzerothCore.
|
||||
- `app/Http/Controllers/LandingController.php` — данные лендинга и обработка формы.
|
||||
|
||||
## Новости логин-экрана WoW
|
||||
|
||||
- Админский раздел: `/admin/login-screen-news`
|
||||
- Публичный фид для клиента: `/launcher/login-news.txt`
|
||||
- Сайт сам добавляет префикс `SERVERALERT:` и склеивает опубликованные записи по `sort_order`.
|
||||
Перед выдачей клиента загрузите архив 1.12.1 в S3 и укажите его ключ в `MOONWELL_CLIENT_OBJECT_KEY`. Для обновлений лаунчера разместите файлы под `MOONWELL_LAUNCHER_BASE_PATH` и новый манифест по ключу `MOONWELL_LAUNCHER_MANIFEST_KEY`. Старые файлы клиента 3.3.5a для vMaNGOS не подходят.
|
||||
|
||||
## Проверка
|
||||
|
||||
Вне Sail я уже проверил:
|
||||
|
||||
- рендер лендинга по HTTP;
|
||||
- компиляцию Blade;
|
||||
- маршруты;
|
||||
- ручную валидацию `POST /register`;
|
||||
- совпадение SRP6 verifier с формулой AzerothCore.
|
||||
|
||||
Для полноценного `php artisan test` внутри контейнера используйте:
|
||||
|
||||
```bash
|
||||
./vendor/bin/sail artisan test
|
||||
npm run build
|
||||
```
|
||||
|
||||
Тесты включают контрольный SRP6-вектор из `src/shared/Crypto/InitializeCrypto.cpp` ядра vMaNGOS, регистрацию, авторизацию, смену пароля, права и чтение персонажей. Локальное подключение к запущенным `realmd` и `characters` проверено отдельно.
|
||||
|
||||
Reference in New Issue
Block a user