Админ-панель
Что видит платформенный админ: персоны, очередь job'ов, провижениг GPU, LoRA-доска, events feed, Plan-100 control plane.
TL;DR
Админка — отдельная React 19 SPA, доступная только админ-ролу. Управляет cross-workspace ресурсами: системными персонами, рецептами промптов, LoRA-моделями, очередью job'ов, Vast.ai инстансами, провижеинг-правилами, биллингом, аудитом. Главная новая фишка — Plan-100 Control Plane Console с координатором/раннером/реконсилером и shadow-tables для cutover'а.
Обзор админки
Админка GoraGen — это операционная диспетчерская. Через неё команда платформы видит что происходит со всем продуктом одновременно: сколько GPU арендовано, какие job'ы зависли, какие пользователи тратят больше всех, какие модели работают плохо.
Шелл — AdminShell.tsx с боковой панелью и keyboard shortcuts для быстрой навигации.
Dashboard
Главный экран — KPI и live-метрики:
- Активные job'ы (по типам: video, storyboard, kling, lora_training)
- Глубина очереди и средний lead time
- Счётчик ошибок за последние 5/15/60 минут с фильтром по severity
- Текущие Vast.ai instances и их состояние (booting / ready / running / cancelling / destroyed)
Через /admin/system/workers-health мониторится heartbeat-loop из workers-контейнера — если последний heartbeat старше 60 секунд, на dashboard загорается алерт «workers down».
Пользователи
/admin/users — браузер пользователей. По клику на user_id — детали: workspace, история генераций, баланс кредитов, daily-spend профиль, plan, IP'шники последних логинов.
Админ может:
- Изменить план пользователя (Free → Starter → Pro)
- Добавить/списать кредиты руками
- Заимперсонэйтить (cookie с флагом
impersonated_by=:admin_id) — для разбора жалоб «у меня не работает X»
Все эти действия пишутся в domain_events и видны в compliance для аудита.
Personas / Presets / Workflows
Три отдельных раздела CRUD для контентного «backbone» платформы:
/personas— системные персонажи. Каждая имеет lookbook (12+ кадров), пресеты (камера, фон, освещение), список LoRA-моделей./presets— библиотека шаблонов промптов и движений камеры./workflows— шаблоны ComfyUI-графов. Шаблон может быть привязан к модели (WAN, Hunyuan, LTX) и использоваться рендером.
Tasks
/admin/tasks — консоль job-очереди. Четыре вкладки: queued / live / recent / failed.
По клику на конкретный job — полные детали: workspace, user, instance, входные параметры, лог выполнения, прогрессовые WS-сообщения, оценка Gemini, итоговая стоимость. Если фейл — стек-трейс с Sentry-event-id.
Из live можно отменить (graceful — даём текущей итерации завершиться, не запускаем следующую). Из failed можно перезапустить (новый job с теми же параметрами).
Instances
/admin/instances — Vast.ai instance browser. Каждый instance:
- offer_id, image, region, цена $/час
- состояние (booting / ready / running / cancelling / destroyed)
- текущий job (если есть)
- стоимость с начала запуска
- кнопки terminate / SSH-connect / re-init
Все ручные операции с инстансами теперь идут через Control Plane (см. ниже), а не как раньше — прямой вызов Vast API.
LoRA dashboard
/admin/lora — кросс-workspace вид всех LoRA-тренировок. Для каждой:
- статус (preparing / captioning / training / validating / done / failed)
- прогресс в процентах, ETA
- ссылка на validation-grid (превью результата)
- стоимость, длительность
Админ может убить зависшую тренировку, перезапустить failed-задачу, посмотреть лог kohya_ss.
System
/admin/system — техническая часть админки, разделена на под-вкладки:
audit— лог админских действийhealth— расширенная health-страница (Phase 9): workers heartbeat, DB latency, disk usage, queue depthprovisioning— правила авто-провижеинга (когда платформа сама арендует новый instance, когда тушит)spend— финансовая сводка по GPU-часам и API-вызовам Anthropic / Gemini / Klingevents— Phase 9 domain events feed (append-only, last 1000 событий) с JSON-модалкой для каждого
Plan-100 Control Plane Console
/admin/system/control-plane — отдельная страница для управления координированной системой провижеинга.
Это переход с прямой работы с Vast API на оркестрационную модель, где между админкой и Vast стоят три loop'а:
- Coordinator — читает
instance_requests(заявки на провижеинг), проверяет parallel-limits, velocity-guard, инсертитprovision_attempts. - Runner — берёт claimed attempts, вызывает
scripts/vast_provision.ensure_instance(...), применяет terminal reducer. - Reconciler — раз в N секунд сканирует stale leases, force-terminates застрявшие в
cancelling, освобождает destroyed instances.
Все три — leader-elected через provision_leader таблицу. Если контейнер с лидером умирает, второй (если есть) перехватывает лидерство через 60 секунд.
На странице:
- Live-статус трёх loop'ов (running / lost / draining)
- Метрики observability: 7 чисел (active requests, queued attempts, success rate, etc.)
- Кнопка Pause — emergency-флаг, который останавливает все три loop'а через 30 секунд
- Кнопка Resume — снимает emergency-pause
Под капотом — 5 cutover-флагов с TTL-кэшем 60 секунд: workflow_spawn, auto_provisioner, parallel_limits, provisioning_cutover_admin_rule_action, provisioning_emergency_pause. Можно flip'нуть отдельно — например, отключить auto-provisioner, оставив остальные.
Settings
/admin/settings — системные настройки, рантайм-тюнируемые:
- maintenance_mode — глобальный 503 для не-админов
- prices — стоимости генерации (per-shot, per-second, per-LoRA-train)
- retention — сроки хранения видео, событий, идемпотентных ключей
Изменение настройки сразу видно всем worker'ам через polling раз в 60 секунд.
Events feed
Phase 9 ввёл append-only domain_events. Каждое значимое событие в платформе (новый user, новый job, фейл провижеинга, апгрейд плана) пишется отдельной строкой с типом, актором, payload-JSON.
В админке /admin/system/events — реактивная лента с фильтрами по типу события, актору, диапазону дат. Двойной клик — модалка с pretty-printed JSON.
Это даёт две вещи: forensic-аудит (что произошло за последние сутки) и event-source для интеграций (выкладка событий в external webhooks через webhook_dispatcher).