Files
zuevav f4bca8449e main
2026-05-20 19:33:02 +03:00

275 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` показывает active
- `sudo -u postgres psql -d brainhub -c 'SELECT * FROM pg_extension'` возвращает vector, pg_trgm, pgcrypto
- `sudo -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`, header `Authorization: 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 код с готовой строкой подключения
- [ ] 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