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 Cloud — QMBilling, Dedicated, Minecraft, Counter-Strike 1.6 (по умолчанию выключены). В QMServer Free — Dedicated, 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 скрипта и подсказок по обновлению |
VITE_LEGACY_ENV_ | (Cloud, PKCE) Точный redirect_uri для OAuth2 Removed auth stack; по умолчанию https://<origin>/ (корень SPA). Должен входить в LEGACY_ENV_ на QMServer. |
Префикс QMSERVER_ для URL API выбран осознанно (не только VITE_*). В Vite задано envPrefix: ['VITE_', 'QMSERVER_'], иначе переменная не попала бы в клиентский бандл.
Вход через Removed auth stack (Cloud)
- PKCE — hash-маршрут
#/oauth/legacy-auth(отдельная форма), затем обмен кода на токен на стороне приложения. - Прямой вход — отдельная кнопка, вызов API модуля без редиректа OAuth.
См. QMServer — Removed auth stack OAuth2 PKCE.
При деплое через compose в QMSERVER_API_URL обычно подставляют ${QMSERVER_PUBLIC_URL}/api/v1 (см. docker-compose.cloud.yaml).