Перейти к основному содержимому

Локальная разработка

Эта инструкция относится к текущей ветке master Gml.Backend. В режиме разработки Next.js проксирует запросы к API и сервису скинов. Все запросы браузера идут через http://localhost:3000.

Подготовка​

Установите Git, .NET SDK 10, Node.js 20+ и npm. Для Rider включите поддержку JavaScript/Node.js и выберите установленный Node.js в настройках проекта.

git clone --recursive https://github.com/Gml-Launcher/Gml.Backend.git
cd Gml.Backend
git submodule update --init --recursive
npm --prefix src/Gml.Web.Client ci
dotnet restore Gml.Backend.sln

Если репозиторий уже клонирован, выполните последние три команды из его корня. Для восстановления пакетов нужен доступ к настроенным NuGet-источникам. Если NuGet сообщает об отсутствующем локальном источнике из NuGet.config, подготовьте соответствующие пакеты соседнего Gml.Core или настройте доступный источник с нужными версиями пакетов.

Освободите порты 3000, 5002 и 5086 перед запуском.

Запуск в Rider​

  1. Откройте Gml.Backend.sln.
  2. Выберите сохранённую конфигурацию GML Development.
  3. Нажмите Run или Debug. Конфигурация запускает Frontend, Backend (development) и Skins (development). При Debug Rider подключает отладчики к обоим .NET-сервисам.
  4. Дождитесь готовности сервисов и откройте http://localhost:3000.

Для остановки всей конфигурации используйте Stop All. API запускается с профилем frontend, сервис скинов — с профилем http. Рабочие каталоги .NET-сервисов совпадают с каталогами их проектов.

Запуск из терминала​

На Linux/macOS из корня репозитория:

./scripts/dev.sh

Скрипт проверяет наличие инструментов, зависимостей фронтенда и свободных портов, затем запускает три сервиса. При Ctrl+C, SIGTERM или завершении любого сервиса он останавливает все запущенные им процессы. Скрипт можно вызвать из другого каталога по полному пути.

Проксирование запросов​

Next.js применяет эти правила только при npm run dev:

  • /api*, /swagger*, /ws* и точный /health передаются API на http://127.0.0.1:5002 с сохранением пути. /ws* поддерживает WebSocket.
  • /skins и /skins/* передаются сервису на http://127.0.0.1:5086 с удалением префикса /skins.
  • Остальные страницы обслуживает фронтенд.

Например, Swagger API доступен по адресу http://localhost:3000/swagger, а проверка состояния — http://localhost:3000/health. Axios и SignalR используют адрес фронтенда.

Как в Angie, до завершения настройки / перенаправляет на /mnt. После настройки /mnt и вложенные страницы перенаправляют на /. Фронтенд проверяет /api/v1/settings/checkInstalled напрямую у API: ответ 2xx означает, что настройка ещё не завершена. При ошибке связи или тайм-ауте 3 секунды главная страница остаётся доступной, а /mnt возвращает на /.

Для других адресов сервисов создайте src/Gml.Web.Client/.env.development.local:

DEV_BACKEND_URL=http://127.0.0.1:5002
DEV_SKINS_URL=http://127.0.0.1:5086

Перезапустите Next.js после изменения файла. Эти переменные читаются на сервере фронтенда и меняют только адреса назначения прокси; порты запуска .NET настраиваются в launch-профилях. NEXT_PUBLIC_BACKEND_URL задаёт подсказку в форме настройки, а запросы браузера используют текущий адрес фронтенда.

Ключ безопасности и локальные данные​

Если SECURITY_KEY не задан, в окружении Development API при первом запуске генерирует 32 случайных байта и сохраняет их как 64 шестнадцатеричных символа в database/development.key внутри каталога API. При следующих запусках используется тот же ключ. Файл исключён из Git и Docker-контекста; на Unix новый файл создаётся с правами 0600.

Непустая переменная окружения SECURITY_KEY имеет приоритет над файлом. В Production и других окружениях кроме Development ключ обязателен в окружении: при его отсутствии API завершает запуск с ошибкой. Для локального запуска вручную генерировать ключ не нужно. Сохраняйте development.key вместе с локальными данными, для которых он использовался.

При стандартном запуске из Rider или скрипта данные находятся здесь:

  • SQLite API: src/Gml.Web.Api/src/Gml.Web.Api/database/data.db.
  • Dev-ключ API: src/Gml.Web.Api/src/Gml.Web.Api/database/development.key.
  • SQLite Gml.Core: ~/GmlServer/data.db при значениях профиля PROJECT_NAME=GmlServer и пустом PROJECT_PATH. ~ обозначает домашний каталог пользователя. Если задать PROJECT_PATH, каталог проекта создаётся внутри него; имя каталога берётся из PROJECT_NAME после очистки недопустимых символов.
  • Скины и плащи: src/Gml.Web.Skin.Service/src/Gml.Web.Skin.Service/Storage.

Остановка сервисов не удаляет эти данные.