Qadam Platform — архитектурные решения
Обновлён 1 апр. 2026 г., 12:41 · 0 комментариев
Qadam Platform — архитектурные решения
Паспорт документа
- Статус документа: working spec
- Актуально на: 28 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении платформенной архитектуры, roadmap или статуса реализации
- Область применения: канонические платформенные spec-документы для текущего ядра Qadam
- Связанные документы:
ADR-001: Хранение JWT в httpOnly cookies
Контекст
Токены в localStorage создают лишний XSS-риск и усложняют безопасную серверную работу в Next.js.
Решение
Access token и refresh token хранятся в httpOnly cookies.
Последствия
- Frontend не читает токены напрямую.
- Проверка авторизации идёт через
GET /auth/me. - Нужна корректная настройка cookies, CORS и SSR.
ADR-002: Refresh token rotation с jti
Контекст
Простой долгоживущий refresh token плохо защищает от повторного использования и кражи.
Решение
Refresh token содержит jti. Активные jti хранятся в Redis. При refresh токен одноразово потребляется, а семейство токенов может быть отозвано при подозрении на reuse.
Последствия
- Нужна инфраструктура хранения в Redis.
- Старые refresh token без
jtiдолжны считаться устаревшими после соответствующего деплоя. - Unit-тесты auth-слоя должны учитывать новую модель.
ADR-003: Next.js App Router и SSR как базовая модель для публичных страниц
Контекст
Каталог, карточки айтемов и публичные страницы продавцов должны быть пригодны для SEO и быстро отдаваться из сервера.
Решение
Использовать Next.js App Router, Server Components и SSR как основную модель для публичной части.
Последствия
- Данные для публичных страниц грузятся на сервере.
- Client Components используются только там, где действительно нужна интерактивность.
- Нужно следить за корректной hydration-моделью и сериализацией.
ADR-004: Общие схемы в packages/shared
Контекст
Валидация не должна расходиться между frontend и backend.
Решение
Общие DTO и Zod-схемы живут в packages/shared.
Последствия
- Один источник истины для валидации.
- Backend и frontend используют одинаковые контракты.
- Изменение поля начинается с общей схемы, а не с локальных DTO.
ADR-005: Канонический production deploy на текущем сервере — host runtime, а не Docker runtime
Контекст
В репозитории есть Docker-контур, но фактический production на текущем сервере запущен через systemd, nginx, PostgreSQL и Redis на хосте.
Решение
До отдельного пересмотра канонической считается именно host-level модель деплоя.
Последствия
- Источником истины по эксплуатации становится
docs/operations/deployment-runbook.md. - Docker-скрипты считаются legacy и требуют ревизии перед любым использованием в production.
- Любые изменения инфраструктуры должны сначала отражаться в хостовом runbook.
ADR-006: Отдельный защищённый портал документации на поддомене
Контекст
Команде нужен быстрый доступ к roadmap, требованиям, текущему состоянию и markdown-документам прямо с сервера.
Решение
Поднять qadam-roadmap.2fab.app, закрыть его basic auth, вынести runtime в отдельный standalone docs-service и читать канонические markdown-документы из qadam-core/docs с поддержкой переходов в связанные specs и docs/Agents.
Последствия
- Команда работает с живыми файлами, а не с экспортами или копиями.
- Портал можно использовать как внутреннюю рабочую поверхность для документации.
- Требуется отдельное сопровождение basic auth, upload/delete/comment механики, отдельного runtime/unit и TLS.