Оценка текущего стека Qadam
Обновлён 1 апр. 2026 г., 12:41 · 0 комментариев
Оценка текущего стека Qadam
Паспорт документа
- Статус документа: historical snapshot
- Актуально на: 28 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при следующей крупной ревизии стека или архитектурного контура
- Область применения: зафиксированная оценка пригодности текущего стека на момент аудита
- Связанные документы:
Актуализировано на 28 марта 2026 года.
1. Краткое заключение
Текущий стек Qadam в целом подходит для всех ближайших и среднесрочных планов проекта: MVP, buyer/seller/admin core, CRM v1.0, billing, публичный каталог, seller dashboard и первые мобильные клиенты.
Главный вывод:
- ядро стека менять не нужно;
- переписывать проект на другой backend/frontend/runtime сейчас нецелесообразно;
- узкие места проекта сейчас находятся не в выборе языка или фреймворка, а в зрелости процессов, quality gates, фоновых задачах, storage и наблюдаемости.
Иными словами: проблема проекта сейчас не "не тот стек", а "стек нормальный, но экосистема вокруг него ещё не доведена до уровня следующей фазы роста".
2. Фактический стек проекта
Прикладной слой
- Frontend: Next.js 16 + React 19 + App Router
- Backend: NestJS 10 + Fastify
- Язык: TypeScript
- Репозиторионная модель: split
qadam-core+qadam-webс сохранённым workspace/DX-наследиемpnpm
Слой данных
- Основная БД: PostgreSQL
- ORM: Prisma
- Кэш и infra state: Redis (
ioredis)
Общие контракты
- Общие типы и схемы:
@repo/shared - Валидация: Zod
Frontend: состояние и UX
- Server state: TanStack Query
- i18n:
next-intl - UI/state helpers: Radix UI, React Context для catalog filters, Tailwind CSS 4, SVGR
Логирование и эксплуатация
- Логирование: Pino +
nestjs-pino - Внешний лог-транспорт: Axiom, опционально
- Production runtime на текущем сервере:
systemd+nginx+ host PostgreSQL/Redis
3. Насколько стек подходит под текущий этап
3.1. Для MVP и стабилизации
Подходит хорошо.
Почему:
- один язык на весь стек ускоряет разработку;
- разделение на
qadam-coreиqadam-webуже выполнено, но общая contract-driven модель иpnpm-экосистема всё ещё удобны для быстрой итерации; - NestJS хорошо подходит для доменного backend с кабинетами, ролями, модерацией и billing-логикой;
- Next.js хорошо подходит для публичного SEO-каталога и кабинетов в одном проекте;
- PostgreSQL и Redis более чем достаточны для текущего масштаба.
Вывод:
- для ближайших 6-12 месяцев стек менять не нужно;
- основные усилия должны идти не в rewrite, а в стабилизацию и completion существующих потоков.
3.2. Для кабинетов buyer/seller/admin
Подходит хорошо.
Почему:
- NestJS удобно держит модульную структуру
auth,buyer,seller,admin,lead,review,reference; - общие Zod-схемы между backend и frontend снижают дрейф контрактов;
- TanStack Query хорошо закрывает кабинетные сценарии с мутациями и инвалидацией данных;
- App Router и SSR позволяют держать публичную и приватную часть в одном web-приложении.
Ограничение:
- сейчас bottleneck не в стеке, а в UX-полировке, тестовом покрытии и консистентности потоков.
3.3. Для CRM v1.0
Подходит, но уже с оговорками.
CRM-функции вроде календаря, расписания, групп, клиентов, ролей и бронирований можно реализовать на текущем стеке без смены ядра.
Почему:
- PostgreSQL хорошо подходит под транзакционные данные расписания, бронирований, ролей и клиентов;
- NestJS и Prisma достаточно удобны для бизнес-правил и transactional writes;
- Next.js подходит для seller-facing CRM UI.
Что понадобится добавить:
- нормальный background jobs layer;
- более дисциплинированный domain design для расписаний, booking conflicts и audit trail;
- более сильный e2e-контур для кабинетных сценариев.
Вывод:
- для CRM стек менять не надо;
- но без слоя фоновых задач и системной тестовой дисциплины CRM начнёт быстро усложнять проект.
3.4. Для биллинга и платежей
Подходит условно.
Billing и payment flows на текущем стеке реализуемы, но требуют не смены стека, а усиления инфраструктурных практик.
Что хорошо:
- PostgreSQL подходит для инвойсов, статусов, проводок, reconciliation и audit trail;
- NestJS подходит для интеграций с платёжными шлюзами и webhook processing;
- Redis можно использовать для idempotency, rate limiting и технических блокировок.
Что обязательно нужно до внедрения платежей:
- queue/job system;
- outbox/idempotency patterns;
- error tracking и alerting;
- строгая модель финансовых статусов и неизменяемых записей.
Вывод:
- стек подходит;
- до платежей нужно дорастить инженерную зрелость, а не менять язык или фреймворк.
3.5. Для мобильного направления
Подходит.
Причины:
- backend уже живёт как API-ориентированный слой;
- TypeScript и React-экосистема естественно ведут к React Native / Expo как самому экономичному пути;
- shared contracts можно частично использовать и для mobile-клиента.
Рекомендация:
- если mobile действительно пойдёт в ближайшие этапы, не менять backend;
- в качестве мобильного стека сначала смотреть в сторону React Native / Expo, а не отдельной новой backend-архитектуры.
3.6. Для аналитики и роста
Текущее OLTP-ядро подходит только частично.
Здесь важно разделять два слоя:
- операционный контур;
- аналитический контур и витрины.
Operational stack на PostgreSQL + Prisma + NestJS подходит. Но для серьёзной аналитики, seller dashboards, cohort/funnel, PMF metrics и billing-аналитики со временем нужен отдельный аналитический контур.
Текущий EventLog и CDC-заготовки — это хороший старт, но не конечное решение.
Вывод:
- менять основной стек не нужно;
- аналитика должна развиваться как отдельная подсистема, а не как перегрузка основной PostgreSQL-базы.
4. Сильные стороны текущего стека
Единый TypeScript-контур
Это сильное решение для текущей команды и стадии продукта.
Плюсы:
- быстрее онбординг;
- меньше переключения контекста;
- проще разделять DTO, схемы и типы;
- меньше накладных расходов на MVP и ранний рост.
Next.js + NestJS
Это хорошая пара для продукта, где одновременно есть:
- публичный SEO-каталог;
- кабинетная логика;
- доменный backend с ролями и модулями;
- перспектива mobile API.
PostgreSQL + Prisma
Для текущего и среднесрочного масштаба это хороший выбор.
Плюсы:
- транзакционность;
- предсказуемость;
- простая эксплуатация;
- хорошая скорость команды;
- возможность эволюции схемы по мере роста.
Redis
Подходит как вспомогательный инфраструктурный слой.
Уже сейчас полезен для:
- refresh token storage;
- кэша;
- технических блокировок и rate limiting.
Потенциально полезен и дальше для job queues.
Split-репозитории с общим контрактным контуром
Для текущего размера команды и платформы уже более уместна не монорепо-модель, а связка двух репозиториев:
qadam-coreдля backend, Prisma, OpenAPI и канонической документации;qadam-webдля frontend и web delivery.
Сильная сторона здесь не в самом факте разделения, а в том, что контракт между ними уже формализуется через OpenAPI и shared engineering workflow.
Это упрощает:
- передачу проекта отдельной frontend-команде;
- автономную эволюцию web и backend;
- сохранение единого contract layer без runtime-сцепки репозиториев.
5. Слабые места и риски текущего стека
5.1. Слишком "свежий" frontend-инструментарий
Связка:
- Next.js 16
- React 19
- Tailwind 4
- React Compiler
- Turbopack
сама по себе рабочая, но более рискованная по сравнению с консервативным production-набором.
Вывод:
- это не повод делать rewrite;
- но это повод жёстко фиксировать версии и не обновлять frontend toolchain без реальной необходимости.
5.2. Нет полноценного web-тестового контура
Сейчас это один из самых слабых участков проекта.
Проблема:
- стек подходит, но не защищён от регрессий в UI и end-to-end потоках.
Это не проблема выбора Next.js. Это проблема незавершённой инженерной обвязки.
5.3. Отсутствует нормальный слой фоновых задач и workflow
Для следующих фаз проекта он обязателен.
Без него начнут болеть:
- уведомления;
- webhooks;
- платежи;
- биллинг;
- экспорты;
- фоновые пересчёты;
- аналитические CDC-процессы.
5.4. Локальное файловое хранение не годится для долгосрочного production
Для roadmap-портала локальное хранение допустимо. Для основного продукта, медиа и seller content в долгую это слабое место.
Нужен переход на object storage.
5.5. Наблюдаемость пока не дотягивает до следующей фазы
Pino и Axiom — хороший старт, но для CRM, billing и mobile этого недостаточно.
Нужны:
- error tracking;
- алерты;
- service-level мониторинг;
- более чёткий operational runbook;
- post-deploy smoke automation.
5.6. Конфигурационный дрейф между хостовым деплоем и Docker-деплоем
Это не flaw самого стека, но серьёзный operational risk.
Если его не убрать, команда будет спорить не о продукте, а о том, какой runtime вообще является настоящим production.
6. Нужно ли менять стек
Короткий ответ
Нет, ядро стека менять не нужно.
Не нужно менять
- TypeScript как основной язык
- split
qadam-core/qadam-web - Next.js как основную web-платформу
- NestJS как backend-платформу
- PostgreSQL как основную операционную базу данных
- Prisma как основной ORM
- Redis как инфраструктурный слой для кэша и токенов
Нужно не менять, а усилить
- тестовую инфраструктуру;
- deploy pipeline;
- background jobs;
- object storage;
- observability;
- аналитический контур.
7. Что стоит добавить в стек без переписывания ядра
Добавить в ближайший этап
- Playwright для web smoke/e2e
- error tracking уровня Sentry или аналогичного сервиса
- job queue: BullMQ как наиболее естественное продолжение при уже используемом Redis
- object storage: S3-совместимое хранилище для медиа и файлов
Добавить в среднесрочной перспективе
- outbox/idempotency patterns для billing и payments
- отдельный analytics stack или warehouse
- feature flags / release controls
- uptime и TLS monitoring
Добавлять только при реальной необходимости
- Elasticsearch / OpenSearch / Meilisearch для поиска
- workflow engine
- event bus / Kafka-подобную инфраструктуру
- микросервисы
Сейчас всё это преждевременно.
8. Что точно не стоит делать сейчас
- Не переписывать backend на Go, Java, Python или другой стек ради "масштабируемости".
- Не выносить модули в микросервисы.
- Не менять PostgreSQL на NoSQL в качестве основного transactional store.
- Не заменять Next.js только потому, что есть отдельные проблемы с hydration или CSS.
- Не вводить сложную распределённую архитектуру раньше, чем появится реальная организационная и нагрузочная потребность.
9. Практическая рекомендация по фазам
Фаза 1. Сейчас
- Оставить ядро без изменений.
- Закрыть quality gates, buyer/seller/admin core и ops drift.
Фаза 2. Перед CRM и биллингом
- Добавить job queue.
- Добавить object storage.
- Добавить web e2e/smoke.
- Усилить monitoring/error tracking.
Фаза 3. Перед ростом и аналитикой
- Развести operational и analytical контуры по-настоящему.
- Не грузить основную БД тяжёлой BI-аналитикой.
Фаза 4. Перед масштабированием mobile
- Зафиксировать API contract discipline.
- При необходимости вынести mobile-specific API-адаптации, но не переписывать backend.
10. Итоговое заключение
Текущий стек для Qadam выбран в целом правильно.
Он:
- хорошо подходит для текущего ядра продукта;
- подходит для CRM и billing без смены платформы;
- подходит для mobile как backend-основа;
- требует не смены, а инженерного усиления вокруг себя.
Если формулировать жёстко:
- rewrite не нужен;
- migration на другой стек не оправдана;
- правильная стратегия — сохранить ядро и последовательно усиливать подсистемы вокруг него.