2026-10-04 14:33:33 +04:00
2026-10-04 13:02:12 +04:00
2026-10-04 13:02:12 +04:00
2026-10-04 13:36:43 +04:00
fix
2026-10-04 14:33:33 +04:00
2026-08-03 00:24:06 +04:00
ico
2026-07-26 03:18:36 +04:00
wip
2026-08-17 20:25:40 +04:00
fix
2026-10-04 14:33:33 +04:00
2026-04-26 16:09:08 +04:00
fix
2026-10-04 14:33:33 +04:00
…
fix
2026-10-04 14:33:33 +04:00
2026-10-04 13:36:43 +04:00
2026-10-03 14:33:08 +04:00
2026-10-03 14:33:08 +04:00
2026-10-04 13:36:43 +04:00

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 сайта уже настроен на этот стенд.

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=web). Логин берётся из users.name, email — из users.email. Подключение к старой базе AzerothCore не требуется. Перед импортом сделайте резервную копию web и 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.

Для отображения даты регистрации и последнего входа в 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 проверено отдельно.

S
Description
Веб-приложение MoonWell
Readme 6.1 MiB
Languages
PHP 70.1%
JavaScript 10.1%
Vue 6.7%
CSS 5.4%
Blade 4.9%
Other 2.8%