Бэкенд
Go-сервис портала — слои, RBAC, Redis, обезличивание и клиент NEURO CORE.
Go-сервис — логика WEB PORTAL: держит /api/v1, проверяет
права, кэширует ответы LLM и проксирует чат на NEURO CORE.
Go на WEB PORTAL не обращается к MongoDB и Qdrant. Импорт mongo- или qdrant-драйвера в код портала — ошибка ревью. Все постоянные данные — через NEURO CORE Service.
Слои
cmd/portal/main.go // wiring: config, router, redis, neurocore client
internal/httpapi/ // handlers /api/v1, middleware (auth, rbac, ratelimit)
internal/auth/ // технический ID, сессии, RBAC-роли
internal/neurocore/ // клиент к NEURO CORE Service (/v1/chat, /v1/health)
internal/cache/ // LLM-кэш в Redis
internal/queue/ // Asynq producer (ingest:document)
internal/ws/ // WebSocket-сессии для стриминга чатаHandler тонкий: валидирует вход → зовёт service → пишет ответ. Бизнес-логика живёт в service-слое.
Обязанности
Аутентификация по техническому ID
POST /api/v1/auth/login принимает код, выдаёт серверную сессию
(httpOnly cookie). Привязка к школе и классу — обезличенная.
RBAC на каждом endpoint
Роль проверяется в middleware после WAF: школьник, учитель, школьный администратор, координатор, ИРО, Министерство, оператор, сисадмин.
Обезличивание перед NEURO CORE
Перед каждым POST /v1/chat из запроса удаляются любые ПДн. Наружу уходят
только session_id, anonymous_user_id, messages, scenario.
Кэш и очередь в Redis
Кэш ответов LLM по хэшу запроса, очередь Asynq ingest:document,
WebSocket-сессии стриминга.
Redis
| Данные | Назначение |
|---|---|
| LLM-кэш | Ответы ассистента по хэшу нормализованного запроса |
Очередь ingest:document | Producer здесь, consumer — на NEURO CORE |
| WebSocket-сессии | Активные стримы чата |
Пользователи и документы в Redis не хранятся — это MongoDB на NEURO CORE; эмбеддинги — Qdrant.
Клиент NEURO CORE
- Таймауты и retry с backoff на
/v1/chat; начатый стрим не ретраится. - Circuit breaker: NEURO CORE недоступен → портал работает без чата.
GET /v1/health— здоровье для деградации UI.- Только внутренняя сеть;
context.Contextпробрасывается до конца стрима.