13 KiB
13 KiB
План: Coordinator Admin UI и Worker Setup UI
Статус: план. Текущий
/ui— демонстрационный control room (джобы, ворклоады, docs). Два новых UI решают две разные задачи и живут в разных бинарниках: админка кластера — вcoordinator, визард установки воркера — вworker-agent(для тех, кто ставит ТОЛЬКО воркер и не имеет координатора на своей машине).
1. Цель
- Coordinator Admin UI (
/ui/admin) — полноценная консоль админа распределённого кластера: система, джобы, воркеры, юзеры/роли, ворклоады, настройки, метрики. Живёт в бинарникеcoordinator. - Worker Setup UI — локальный визард в бинарнике
worker-agent(worker-agent setup→ браузер на 127.0.0.1): пошаговое подключение машины к координатору — URL/токен/ключ, рабочий каталог, проверка соединения, запуск и статус воркера. Не требует установки координатора и работает на машине, где есть только воркер.
2. Принципы
- Coordinator UI (админка кластера):
/ui/admin/*— толькоadmin, bounded read model, браузер не касается БД, оба движка (sqlite/postgres) одинаково, секреты (worker.token) только админу с подтверждением. - Worker UI (локальный визард в
worker-agent): слушает только127.0.0.1, без аутентификации (локальная машина), не требует никаких внешних сервисов; конфигурация сохраняется в JSON-файле рядом с рабочим каталогом воркера; запуск воркера — отдельным процессом (worker-agent --config <path>), который визард же может остановить. - Никаких секретов в логах и в самом UI после сохранения.
3. Coordinator Admin UI (/ui/admin)
3.1 Экран «Обзор системы» — /ui/admin
- движок БД (sqlite/postgres), версия бинарника, data dir, uptime;
- занятое место blob-хранилища (байты по артефактам) и число артефактов;
- чипы: джобы/воркеры/таски по статусам (из существующих business metrics);
- токен воркера: кнопка «Показать worker token» (admin only, подтверждение).
3.2 Экран «Джобы» — /ui/admin/jobs
- таблица: id, ворклоад, статус, владелец, создан, завершён, результат;
- фильтры: статус, ворклоад, владелец; поиск по id (частичное совпадение);
- пагинация (limit/offset), переход в существующий detail-просмотр;
- действие: cancel (существующий usecase).
3.3 Экран «Воркеры» — /ui/admin/workers
- таблица: имя, id, статус (online/busy/offline), capabilities, trust, владелец, последний heartbeat;
- переключение trust (trusted/untrusted) для воркеров — новый usecase;
- индикация «какие ворклоады умеет» (capabilities из реестра).
3.4 Экран «Юзеры и ключи» — /ui/admin/users
- список юзеров через userservice (существующий прокси
callUserserviceAuthed); - verify/unverify, promote/demote (существующие действия);
- worker-ключи юзера: просмотр (без секрета), revoke.
3.5 Экран «Ворклоады» — /ui/admin/workloads
- каталог из embedded
workloads.json(уже есть read view); - enable/disable: новая таблица
workload_settings (workload TEXT PK, enabled BOOLEAN), миграции sqlite + postgres; каталог читается с учётом оверрайдов; - параметры: схема, reduction, upload_ready, ui_elements (read-only).
3.6 Экран «Настройки» — /ui/admin/settings
- read-only конфигурация без секретов: addr, storage dir, docs dir, лимиты (max upload, attempts, quorum), lease/reaper интервалы, engine;
- подсказки: где лежат миграции, как сделать бэкап sqlite (скопировать файл).
3.7 API (все — admin, JSON)
| Метод | Путь | Назначение |
|---|---|---|
| GET | /ui/admin/api/system |
движок, версия, storage usage, counts, worker token (admin) |
| GET | /ui/admin/api/jobs |
пагинированный список с фильтрами |
| GET | /ui/admin/api/workers |
список воркеров |
| POST | /ui/admin/api/workers/{id}/trust |
переключить trust |
| GET | /ui/admin/api/users |
список юзеров (userservice) |
| GET | /ui/admin/api/workloads |
каталог + enabled |
| POST | /ui/admin/api/workloads/{name}/enabled |
enable/disable |
| GET | /ui/admin/api/settings |
конфигурация (без секретов) |
4. Worker Setup UI (в бинарнике worker-agent)
4.1 Как это выглядит
curl -fsSL .../install.sh | bash -s worker
worker-agent setup # печатает URL и открывает браузер
# → http://127.0.0.1:12700 — локальный визард, ничего устанавливать не нужно
4.2 Визард (шаги)
- Координатор: URL (например
http://192.168.1.10:8080) + способ аутентификации: токен (serve) или worker key (кластер); - Рабочий каталог: путь + имя машины (WORKER_NAME);
- Проверка: кнопка «Проверить соединение» —
GET /healthкоординатора (+ обмен ключа, если key), версии; чек-лист зависимостей (Python 3, scimesh) с командой установки; - Запуск: «Запустить воркер» — визард сохраняет
config.jsonи запускаетworker-agent --config <path>отдельным процессом.
4.3 Статусная страница (та же вкладка после запуска)
- состояние: не запущен / запущен, worker id, зарегистрирован ли;
- статистика: забрано задач, выполнено, ошибок, последний heartbeat;
- runtime: python, scimesh, capabilities (из каталога);
- кнопки: Остановить / Запустить / Открыть лог (хвост).
4.4 API визарда (локальный HTTP, 127.0.0.1)
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/status |
конфиг (без секрета), состояние, статистика |
| POST | /api/config |
сохранить конфигурацию в config.json |
| POST | /api/test |
проверка соединения с координатором |
| POST | /api/start |
запустить воркера (self --config) |
| POST | /api/stop |
остановить |
| GET | /api/logs |
хвост лога воркера |
4.5 Изменения в агенте
worker-agent setup [--port 12700] [--no-open]— локальный сервер визарда;worker-agent --config <path>— запуск демона из JSON-конфига (URL, токен или ключ, work dir, имя, task runner); env-переменные имеют приоритет;worker-agent --check [--coordinator-url URL]— пинг/health+ версии, exit 0/1 (используется визардом на шаге 3);config.jsonпо умолчанию:~/.scimesh-worker/config.json(переопределяется черезWORKER_CONFIG); секрет хранится с правами 0600.
5. Компоненты и структура кода
# Coordinator Admin UI (бинарник coordinator)
coordinator/internal/transport/http/
ui_admin.go # admin-хендлеры + admin.html
server.go # роуты /ui/admin/* (requireAdmin)
coordinator/internal/usecase/
admin.go # AdminSystem/ListJobsAdmin/ListWorkersAdmin/WorkloadSettings
ports.go # + PaginatedJobs(ctx, filter, limit, offset)
coordinator/internal/storage/{sqlite,postgres}/
ui_read_repo.go # + ListJobsPaginated, StorageStats
migrations/*.sql # + workload_settings
# Worker Setup UI (бинарник worker-agent)
coordinator/internal/agent/
setup/ # локальный визард: сервер, шаблоны, API, config.json
setup_ui.go # worker-agent setup (сервер 127.0.0.1:12700)
configfile.go # --config <path>: JSON-конфиг демона
check.go # --check: пинг /health + версии
6. Милестоуны
- M1. Admin-фундамент: экран «Система» + таблица джобов (фильтры, пагинация) + storage usage. API + шаблоны + тесты.
- M2. Admin-управление: воркеры (trust), юзеры/ключи (userservice),
ворклоады enable/disable (таблица
workload_settings+ миграции обоих движков), настройки (read-only). - M3. Worker Setup (в worker-agent):
setup-сервер с визардом (config/test/start/stop/logs),--config,--check; E2E: визард запускает реального воркера, тот регистрируется и берёт джоб. - M4. Полировка и верификация: пустые состояния, mobile, копирование, E2E в браузере (admin-флоу и setup-флоу с реальным worker-agent), обновление mkdocs/standalone.md, CI зелёный.
7. Тестирование
- Go (unit): usecase admin (memstore + sqlite), permission-тесты
(admin vs user → 403), фильтры/пагинация, enable/disable ворклоадов;
агент: визард API (config persist 0600, test без/с координатором,
start/stop),
--config,--check(с/без координатора). - Go (integration, postgres): пагинация и storage-метрики на реальной БД.
- E2E (браузер): вход админом →
/ui/adminпоказывает реальную систему; на «голой» машине:worker-agent setup→ визард → запуск → воркер регистрируется в координаторе и берёт джоб. - CI: существующие джобы + новые тесты в общем
go test -race; sqlite и postgres пути одинаково зелёные.
8. Открытые решения
- enable/disable ворклоадов: хранить в
workload_settings(миграции обоих движков); решение принято — таблица добавляется в M2. - Токен в UI: только админ, с подтверждением; в командах визарда — плейсхолдер, чтобы не светить секрет в логах истории.
worker-agent --check: без регистрации, только health + версии.- Локальный визард без аутентификации: сервер слушает только
127.0.0.1; любой локальный процесс может управлять воркером — это сознательное упрощение для одной машины. - Скоуп v1: без редактирования конфигурации координатора и без управления
миграциями из UI (это задача
setup/CLI).