15 KiB
ZBrain Roadmap
Документ для Claude Code: пошаговый план реализации с критериями готовности каждого спринта. Подходит как для последовательной разработки, так и для параллельной (некоторые спринты независимы).
Принципы
- Каждый спринт заканчивается рабочей фичей, которую можно показать
- Каждый спринт мерж в
develop, вmainидут тегированные релизы - Любой Claude Code инстанс может прочитать этот файл и понять, что делать дальше
- ADR (Architecture Decision Records) пишутся в
docs/DECISIONS/для нестандартных решений
Sprint 0: Инфраструктура VM (1 вечер)
Цель: Готовая VM, на которой работает Postgres и установлен gbrain.
Задачи:
- Создать VM: 4 vCPU / 8 GB RAM / 80 GB SSD / Ubuntu 22.04 LTS
- Назначить статический IP в сети ZETIT
- Добавить DNS:
brain.zetit.local(внутренний) иbrain.zetit.ru(внешний) - Запустить
scripts/bootstrap-vm.sh - Создать Postgres пользователя
brainhubс паролем - Сгенерировать секреты для
.env(SESSION_SECRET, JWT_SECRET, TOKEN_ENCRYPTION_KEY) - Получить API ключи: OPENAI_API_KEY, ANTHROPIC_API_KEY
Критерии готовности:
systemctl status postgresqlпоказывает activesudo -u postgres psql -d brainhub -c 'SELECT * FROM pg_extension'возвращает vector, pg_trgm, pgcryptosudo -u zbrain bash -c 'PATH=$HOME/.bun/bin:$PATH bun --version'работает/etc/zbrain/.envсуществует, заполнен, права 600
Документировать: реальные параметры VM (IP, hostname, дата создания) в docs/INFRASTRUCTURE.md
Sprint 1: Первый gbrain instance (1 день)
Цель: Один работающий gbrain instance с импортированными тестовыми данными.
Задачи:
- Создать gbrain mirror в
git.zetit.ru/zuevav/gbrain-mirror - Запустить
scripts/create-brain.sh zetit "ZETIT MSP" 3001 - Импортировать тестовый корпус (например, какие-то существующие markdown файлы)
- Проверить
curl http://localhost:3001/healthили эквивалент - Прицепить локальный Claude Code напрямую к этому gbrain (без brainhub-прокси)
- Выполнить пару query и убедиться что работает
Критерии готовности:
systemctl status zbrain-gbrain-zetitпоказывает active- В БД есть страницы и эмбеддинги:
SELECT count(*) FROM pages, count(*) FROM content_chunks WHERE embedding IS NOT NULL - Claude Code успешно делает MCP запросы
Известные риски:
- gbrain v0.26 переехал на новый OAuth - возможно поломались CLI флаги. Зафиксировать рабочую версию тегом.
- FNA-прокси может блокировать какие-то OpenAI/Anthropic эндпоинты - проверить
curl --proxy ...до запуска import.
Sprint 2: Brainhub каркас + локальный auth (3-4 дня)
Цель: Работающий веб-интерфейс с login/logout, без функционала брейнов.
Задачи:
apps/api (backend)
- Express + TypeScript скелет
- Структура:
routes/,services/,middleware/,db/,lib/ - ORM выбрать: Drizzle (рекомендую за TS-first) или Prisma
- Миграции: создать таблицы
users,sessions - POST /api/auth/register (только для owner-команды, остальные через UI)
- POST /api/auth/login (email + password, bcrypt)
- POST /api/auth/logout
- GET /api/auth/me (current user)
- Session middleware (cookie + refresh token rotation)
- RBAC middleware:
requireRole('admin'),requireRole('owner')
apps/web (frontend)
- React + Vite + TypeScript + Tailwind + shadcn/ui
- Layout: sidebar + header + content
- Страницы: /login, /dashboard (заглушка), /profile
- React Router v6
- React Query для API
- Auth context + protected routes
Критерии готовности:
- На свежей БД создаётся initial owner из ENV (INITIAL_OWNER_EMAIL/PASSWORD)
- Можно войти через UI на /login
- /dashboard защищён, без auth редиректит на /login
- Cookie с session token, при logout удаляется
- Refresh token rotation работает (логин не истекает через 15 минут активной сессии)
Sprint 3: MCP Proxy + Tokens (2-3 дня)
Цель: Claude Code на любом сервере подключается через brainhub, а не напрямую к gbrain.
Задачи:
packages/mcp-proxy
- Express router, маунтится на
/mcp/:brain - Извлечение Bearer token из заголовков
- Кэш токенов в памяти (30s TTL) - не ходить в БД на каждый запрос
- Проверка: revoked, expired, IP allowlist, scope
- Резолв
:brain→localhost:PORTчерез таблицуbrains - Прокси через
http-proxy-middlewareили nativный stream - In-memory очередь для audit log + batch insert (раз в секунду)
- Throttled update
last_used_at(не чаще раза в минуту на токен)
apps/api: токены
- Таблица
access_tokens(см. docs/SECURITY.md) - POST /api/tokens (создание - возвращает plaintext token ОДИН РАЗ)
- GET /api/tokens (список с prefix, без full token)
- DELETE /api/tokens/:id (revoke - soft delete с revoked_at)
- GET /api/tokens/:id/usage (статистика)
apps/web: UI для токенов
- /tokens страница со списком
- Создание токена: имя + scope checkboxes + TTL + IP allowlist
- После создания - модалка с токеном и кнопкой copy (показывается один раз!)
- Revoke с подтверждением
Критерии готовности:
- Создал токен в UI с scope
mcp:read:zetit - Подключил Claude Code:
mcpServers.zbrain.url = http://brain.zetit.local/mcp/zetit, headerAuthorization: Bearer brain_pat_... - Запрос идёт через brainhub, в audit log записывается
- Revoke токена через UI → следующий запрос Claude Code получает 401
- При двух токенах одного scope работают оба
Sprint 4: CRUD брейнов + источники + sync (2-3 дня)
Цель: Создание новых брейнов через UI, добавление и синхронизация источников.
Задачи:
apps/api
- Таблицы
brains,sources - POST /api/brains - создание (внутренний вызов
scripts/create-brain.shили эквивалент на TS) - GET /api/brains - список со статистикой (page_count, embed_coverage)
- GET /api/brains/:id - детали
- DELETE /api/brains/:id - удаление (с подтверждением, дамп перед удалением)
- POST /api/brains/:id/sources - добавление источника (git, local_dir)
- POST /api/brains/:id/sources/:sourceId/sync - запуск sync
- GET /api/brains/:id/sources/:sourceId/sync/stream - SSE с прогрессом
- Worker queue для sync (bullmq или нативный setInterval)
- Планировщик cron-based sync (node-cron)
apps/web
- /brains страница со списком
- /brains/new форма создания
- /brains/:id - tabs: Overview, Sources, Browse, Query, Activity
- Sources tab: список с status, кнопки Sync now / Edit / Delete
- Sync с realtime прогрессом через SSE
- Подсветка статусов: green/yellow/red
Критерии готовности:
- Создать брейн
communityчерез UI → автоматически создаётся БД, запускается gbrain, регистрируется systemd unit - Добавить git source → запустить sync → видеть прогресс в реальном времени
- Расписание sync каждые 6 часов работает
- Удаление брейна делает дамп и убирает все артефакты
Важно: удаление брейна - irreversible операция, обязательно подтверждение через ввод имени брейна (как в GitHub).
Sprint 5: Dashboard + Projects + Connect (2-3 дня)
Цель: Полноценный UI с визуализацией проектов и copy-paste готовыми сниппетами.
Задачи:
apps/api
- Таблицы
projects,project_connections - CRUD endpoints для projects
- POST /api/projects/:id/connections - привязка проекта к брейну с указанием токена
- GET /api/connect/snippets/:brainId?client=claude-code|cursor|cli - генерация сниппетов
apps/web
- /dashboard - сводка: количество брейнов, total pages, active sync jobs, recent activity
- /dashboard карточки брейнов с цифрами
- /projects - таблица проектов с привязкой к брейнам
- /projects/:id - детали + кнопка "Connect new brain"
- /brains/:id/connect - страница с готовыми сниппетами:
- Claude Code JSON (для
~/.claude/mcp.jsonили.claude/mcp.jsonв проекте) - Cursor конфиг
- Bash one-liner для CLI
- QR код с готовой строкой подключения
- Claude Code JSON (для
- Copy-to-clipboard на каждом блоке
- Глобальный поиск по всем брейнам (с уважением scope)
Критерии готовности:
- Dashboard загружается за <500ms
- В Projects вижу таблицу: ZetitConnect → [zetit (write), personal (read)]
- На странице Connect - готовая JSON структура с реальным URL и токеном, копируется одним кликом
- QR-код корректно сканируется и содержит JSON
Sprint 6: OAuth + публичный контур (2-3 дня)
Цель: Авторизация через Yandex/GitHub OAuth, публичный endpoint для MCP.
Задачи:
apps/api
- Зарегистрировать OAuth приложения у Yandex и GitHub
- passport.js + passport-yandex + passport-github2
- OAuth flow: /oauth/yandex, /oauth/yandex/callback (аналогично GitHub)
- Привязка к existing user по email match (с подтверждением)
- Поддержка регистрации нового пользователя через OAuth (опционально, по INVITE_ONLY флагу)
- Отдельный Express app на 3010 порту, монтирует только /mcp и /oauth
deploy
- Получить TLS сертификат от Let's Encrypt для brain.zetit.ru
- Включить nginx public server-блок
- Проверить, что внутренний и публичный API не пересекаются (нет утечки UI на публичный)
Критерии готовности:
- Залогиниться через "Sign in with Yandex" - работает
- На публичном endpoint
https://brain.zetit.ru/api/brains→ 404 - На публичном endpoint
https://brain.zetit.ru/mcp/zetit→ работает с токеном - TLS A+ rating на SSL Labs
Sprint 7: Hardening (2-3 дня)
Цель: Production-ready: бэкапы, мониторинг, 2FA, документация.
Задачи:
- /audit страница в UI с фильтрами (actor, action, resource, date range)
- CSV export audit log
- 2FA (TOTP) опционально для каждого пользователя
- Проверить и настроить
scripts/backup.sh, добавить в cron - Тестовое восстановление из бэкапа на отдельной VM
- Prometheus endpoint /metrics: request rate, error rate, db connections, queue depth
- Health endpoint с глубокой проверкой (DB connectivity, gbrain instances)
- Alerts на падение sync, на error rate > N
- Documentation: docs/API.md, docs/SECURITY.md, docs/OPERATIONS.md
- Load test: 100 RPS на /mcp, что выдерживает
Критерии готовности:
- Восстановление из бэкапа прошло успешно
- Включил 2FA на owner аккаунте, работает
- /metrics возвращает prometheus formatted text
- Audit log имеет все важные события: brain.create, brain.delete, token.create, token.revoke, user.login, user.logout, mcp.call
После Sprint 7: миграция данных
Цель: Перенести всё что нужно в соответствующие брейны.
- Создать брейны: zetit, telerapharma, personal, community (если ещё не созданы)
- Источники для zetit: ZetitConnect docs repo, ZETIT internal wiki
- Источники для telerapharma: runbook'и Exchange/MikroTik/1C
- Источники для personal: личный markdown garden, "Хлеб и молоко" docs
- Источники для community: документы Смоленская 10
- Переключить Claude Code на всех серверах с локального чтения на gbrain через brainhub
- Удалить дублированную документацию из локальных копий (оставить только в источниках)
Дальнейшее развитие
- Импорт из Notion, Obsidian, Confluence через gbrain skills
- Webhook'и: уведомления в Slack/Telegram при критичных событиях
- API для интеграций с другими системами (1С, FortiGate logs)
- Mobile-friendly UI (адаптив или отдельная PWA)
- Multi-user collaboration на одном брейне (комментарии, suggestions)
- Версионирование промптов и skills через gbrain