Перейти к основному содержимому
Версия: 1.0.4

QMAdmin

Веб-панель для администраторов экосистемы QM. Все действия выполняются через HTTP API QMServer (QMSERVER_API_URL при сборке; в compose часто из QMSERVER_PUBLIC_URL).

Исходники и релизы: репозиторий QMAdmin на GitHub — README / README_EN, CHANGELOG / CHANGELOG_EN, install.sh, образ ghcr.io/<owner>/qmadmin.

Основные возможности

  • Учётные записи облака: вход, регистрация (те же пользователи, что у QMWeb)
  • Роли: обычный пользователь и администратор (доступ к /api/v1/admin/* и PATCH настроек)
  • Модули (GET/PATCH /api/v1/admin/modules): в QMServer CloudQMBilling, Dedicated, Minecraft, Counter-Strike 1.6 (по умолчанию выключены). В QMServer FreeDedicated, Minecraft, Counter-Strike 1.6 (без QMBilling). Removed auth stack в списке модулей не числится: в Cloud он включается как интеграция (см. ниже); во Free встроенного Removed auth stack нет.
  • Интеграции (GET/PATCH /api/v1/admin/integrations): QMLauncher и QMWeb — в обеих сборках; в Cloud дополнительно Removed auth stack (встроенный OAuth на стороне QMServer). По умолчанию выключены; определяют доступность публичных API для лаунчера, сайта и (в Cloud) входа через Removed auth stack.
  • Профиль и привязка Ely.by (OAuth через QMServer)
  • Пользователи облака: список, выдача премиума и др. (GET/PATCH /admin/users)
  • Профили игровых серверов (Minecraft, CS 1.6, …): сам раздел доступен при включённых модулях соответствующих игр; список, бейдж Premium (is_premium), включение/выключение (для Minecraft — видимость в лаунчере), удаление через диалог: только запись в QMServer или с опцией удалить файлы и процессы на хосте (очередь remove_instance для dedicated); для не-Minecraft дополнительно опция удалить общий SteamCMD. Колонка статус установки агента (очередь provision/install). При Cloud — работа с данными синхронизации для профилей с данными на QMServer
  • Профиль игрового сервера (карточка): для Minecraft на выделенном хосте — блок управления процессом JVM: запуск / остановка / перезапуск через run.sh на машине (очередь команд обрабатывает QMClient в режиме -supervise), опционально живой лог (опрос хвоста .qmclient/console.log). Это не то же самое, что «Вкл/Выкл» профиля в QMServer — последнее только скрывает сервер из лаунчера.
  • Выделенные серверы: учёт хостов (имя, IP, ОС, рабочий каталог), зашифрованный конверт для QMClient (открытый токен в JSON не отдаётся), готовая команда установки на Linux (curl + systemd; таймер, скан и supervise включаются автоматически); обновление QMClient на хосте — отдельная карточка на странице хоста (команды curl … --upgrade и sudo qmclient -upgrade), если агент уже зарегистрирован; обнаружение установок в work_dir после скана агента, привязка к профилям в QMServer или добавление игрового профиля; редактирование (клик по строке) и удаление (ссылка на выделенный хост с игровых профилей снимается)
  • Игровые аккаунты (ники): создание, редактирование, привязка Microsoft/Mojang (PATCH /game-accounts/:id/link), просмотр инвентаря из API при наличии UI
  • Моды и пресеты: загрузка, метаданные, зависимости, resourcepacks/shaderpacks — маршруты /servers/:id/mods, mod-presets, и т.д.
  • Новости: создание и редактирование (/news)
  • Настройки сервиса:
    • провайдеры скинов;
    • реферальная программа;
    • синхронизация инвентаря (вкл/выкл, генерация API-ключа для QXSync, coming soon; приём POST на QMServer — только при модуле Minecraft и интеграции QMWeb);
    • ключ CurseForge для каталога модов;
    • MSA Client ID для QMLauncher

Подробные пути и методы: раздел QMServer и Swagger на https://api.qx-dev.ru. Агент на машине: QMClient.

Готовая команда установки QMClient: curl на URL install.sh (релиз GitHub) и bash -s -- с --dedicated-id, --envelope; --api-url в тексте не показывается, если собранный QMSERVER_API_URL (см. src/lib/api.ts) совпадает с публичным значением по умолчанию (https://api.qx-dev.ru/api/v1, см. QMCLIENT_DEFAULT_PUBLIC_API_BASE в src/lib/qmclient-install.ts). Иначе подставляется свой API. Базовый owner/repo и тег для этих URL задаются в src/lib/qmclient-install.ts и при сборке через VITE_QMCLIENT_GITHUB_REPO / VITE_QMCLIENT_RELEASE_TAG. Выполнение от root, нужен systemd. Скрипт сам включает qmclient.timer и qmclient-supervise.service (см. QMClient).

Обновление агента без перевыпуска конверта: на странице выделенного хоста копируются команды install.sh --upgrade и sudo qmclient -upgrade (репозиторий и тег совпадают с настройками сборки панели: VITE_QMCLIENT_*).

Домен

admin.qx-dev.ru (или ваш инсталляционный URL).

Сборка

cd QMAdmin
npm install # или npm ci — для воспроизводимой сборки по lockfile
npm run build

Продакшен: npm run build запускает tsc и vite build в режиме production (минификация JS/CSS, без sourcemap в dist/). В Dockerfile используется npm ci и NODE_ENV=production.

CI, образ GHCR и релизы статики

В репозитории QMAdmin (или в монорепозитории — workflow .github/workflows/build-qmadmin-image.yml) на push в main и на теги v*:

  • публикация образа ghcr.io/<owner>/qmadmin (linux/amd64): теги latest (main), digest по коммиту, по semver для git-тегов;
  • GitHub Release с архивом статики qmadmin-*-dist.tar.gz и файлом .sha256 (на main — prerelease с тегом вида v<version>-<sha>; на семвер-тег v* — обычный релиз).

QMSERVER_API_URL задаётся в workflow как переменная окружения при npm run build и как build-arg в Docker — совпадает с тем, что попадёт в бандл и в образ.

Скрипт install.sh

Отдельный сервер под Linux x86_64 без сборки из исходников: в репозитории mindevis/QMAdmin есть install.sh (raw):

РежимЧто делает
--native (от root)Берёт qmadmin-*-dist.tar.gz из GitHub Releases, распаковывает в /opt/qmadmin/html, подключает фрагмент nginx из deploy/nginx/qmadmin-site.conf (нужен установленный nginx).
--dockerПроверяет curl, Docker, Compose; тянет ghcr.io/mindevis/qmadmin:latest, создаёт каталог с docker-compose.yml (по умолчанию ~/qmadmin, см. DOCKER_INSTALL_DIR).
curl -fsSL https://raw.githubusercontent.com/mindevis/QMAdmin/main/install.sh | sudo bash -s -- --native
curl -fsSL https://raw.githubusercontent.com/mindevis/QMAdmin/main/install.sh | bash -s -- --docker

Опционально: QMADMIN_RELEASE_TAG, QMADMIN_GITHUB_REPO, QMADMIN_GHCR_IMAGE, GITHUB_TOKEN / GH_TOKEN для приватных репозиториев. Справка: install.sh --help.

Образ Docker собран с фиксированным QMSERVER_API_URL на этапе CI; другой URL API — своя сборка образа с --build-arg QMSERVER_API_URL=....

Сообщения коммитов

В корне репозитория QMAdmin лежит commit-template.txt (Conventional Commits, как в QMServer). Подключение: git config commit.template commit-template.txt.

Переменные окружения

ПеременнаяОписание
QMSERVER_API_URLБазовый URL API QMServer (вшивается при сборке Vite), например https://api.qx-dev.ru/api/v1 или http://qmserver:8080/api/v1 в Docker-сети
VITE_QMCLIENT_GITHUB_REPO(Необязательно) owner/repo для URL установки/обновления QMClient (шаблоны в qmclient-install.ts ориентированы на раздачу с GitHub; своё зеркало — отдельная настройка в коде)
VITE_QMCLIENT_RELEASE_TAG(Необязательно) тег или latest для подстановки в URL скрипта и подсказок по обновлению

Префикс QMSERVER_ для URL API выбран осознанно (не только VITE_*). В Vite задано envPrefix: ['VITE_', 'QMSERVER_'], иначе переменная не попала бы в клиентский бандл.

При деплое через compose в QMSERVER_API_URL обычно подставляют ${QMSERVER_PUBLIC_URL}/api/v1 (см. docker-compose.cloud.yaml).