Архитектура

Модульная архитектура с горизонтальным масштабированием

Платформа построена на современном стеке Next.js 16 + PostgreSQL с выделенными сервисами для платёжного шлюза, уведомлений и realtime-обновлений. Архитектура оптимизирована под быстрый MVP (1-3 мес) с последующим горизонтальным масштабированием без переписывания ядра.

client layer
Веб-приложение
Next.js 16 - SSR - PWA
Telegram-бот
Уведомления, поиск, заявки
WhatsApp Business
Канал для C2C-организаторов
api gateway
Next.js API Routes - REST + tRPC - NextAuth.js (JWT, OAuth) - Rate limiting - CORS - WAF
service layer
service-01
Reestr
Карточки сделок, статусы
service-02
Pricing
Лесенка, динамика цены
service-03
Escrow
Заморозка, возвраты, выплаты
service-04
Arbitrage
Споры, решения, репутация
data layer
PostgreSQL 16
Основная БД, транзакции
Redis
Кэш, сессии, очереди
S3-совместимое
Фото, документы, чеки
ClickHouse
Аналитика, события (post-MVP)
external integrations
СБП (НСПК)
Эквайринг (Тинькофф / Сбер)
ОФД (Платформа ОФД)
Честный ЗНАК
СДЭК / Boxberry
ЕГАИС (при необходимости)
Telegram Bot API
DaData (адреса, ИНН)

Жизненный цикл сделки

  1. 01Создание закупки (поставщик или пул покупателей)
  2. 02Сбор участников и заморозка средств в escrow
  3. 03Достижение минимального порога -> фиксация цены
  4. 04Уведомление поставщика -> запуск исполнения
  5. 05Логистика и доставочные узлы
  6. 06Подтверждение получения -> выпуск средств из escrow
  7. 07Арбитраж (при споре) -> рейтинг участников

Принципы проектирования

  • ->Modular monolith на MVP. Единое Next.js приложение с чёткими модулями - проще деплой, ниже когнитивная нагрузка.
  • ->Готовность к микросервисам. Каждый сервисный модуль изолирован по данным - при росте можно вынести в отдельный процесс без рефакторинга.
  • ->Event-driven коммуникация. Ключевые события (сделка завершена, escrow заморожен) публикуются в очередь для подписчиков.
  • ->Внешние интеграции за фасадом. Платёжные и логистические провайдеры скрыты за интерфейсами - замена СБП на ЮKassa не требует изменений в ядре.
  • ->Безопасность по умолчанию. Все ПДн - в РФ, шифрование at-rest + in-transit, аудит-лог транзакций.
Roadmap - MVP за 1-3 месяца

Глубокий план реализации: от Discovery до Pilot

План построен по 2-недельным спринтам. Жёсткий приоритет - запуск MVP B2C+C2C к концу 8-й недели, пилот в одном городе (нед 9-12), добавление B2B и C2B модулей - фаза 3 (мес 4-6). Все сроки валидированы под команду из 5 человек.

0
Discovery - Недели 1-2

Подготовка инфраструктуры и валидация гипотез

Юр. оформление, выбор стека, привлечение первых партнёров, исследование пользователей.

2 нед
5 человек - 800K руб.
Цели фазы
  • -Зарегистрировать юр.лицо (ООО, УСН 6%)
  • -Открыть счёт в банке-партнёре для escrow
  • -Подать заявку в реестр операторов ПДн
  • -20 customer development интервью
  • -3 LOI от потенциальных поставщиков
Задачи (2-нед спринт)
  • -Спринт 1: Setting up - repo, CI/CD, дизайн-система, брендбук
  • -Спринт 2: Research - CustDev, конкуренты, юр. модель
  • -Спринт 2: Архитектурный документ + ER-схема БД
  • -Спринт 2: Прототип UI в Figma (10 экранов)
Deliverables
  • Зарегистрированное ООО + счёт
  • Git-репозиторий с CI/CD
  • PRD v1.0 + архитектурный документ
  • Figma-прототип
  • 3 подписанных LOI
KPI выхода: 3 LOI, 20 интервью, юр.готовность 100%
Риски: Долгая регистрация ООО, банк-отказ
Митигация: Параллельно подать в 2 банка, купить готовое ООО
1
MVP - Недели 3-8

Запуск B2C + C2C - минимально жизнеспособный продукт

Базовый движок закупок, escrow, СБП-платежи, 2 пилотных категории товаров, Telegram-бот.

6 нед
5 человек - 3.0M руб.
Цели фазы
  • -Запустить 50 первых закупок
  • -500 регистраций покупателей
  • -5 активных поставщиков
  • -Оборот 1.5M руб. за период
  • -Конверсия visit->register >= 12%
Спринты
  • -Нед 3-4: Auth, профили, карточка закупки, реестр
  • -Нед 5-6: Лесенка цен, escrow, СБП, чеки 54-ФЗ
  • -Нед 7: Telegram-бот, уведомления, дашборд поставщика
  • -Нед 8: Баг-фикс, нагрузочное тестирование, soft launch
Deliverables
  • Production-сайт rodnoy.site
  • Telegram-бот @rodnoy_bot
  • 5 категорий товаров (food, fashion, kids, electronics, home)
  • Юр.документы: оферта, политика ПДн, согласие
  • Admin-панель модерации
KPI выхода: 50 сделок, NPS >= 30, retention D7 >= 25%
Риски: Срыв сроков escrow-интеграции, низкий initial-трафик
Митигация: MVP escrow на базе ЮKassa, реферальная программа
2
Pilot - Недели 9-12

Пилот в одном городе и расширение категорий

Фокус на Москву + СПб, логистическое партнёрство с СДЭК, запуск C2C-сегмента, первые B2B-тесты.

4 нед
5 человек + маркетинг - 2.5M руб.
Цели фазы
  • -3000 регистраций (Мск + СПб)
  • -200 активных сделок/мес
  • -20 поставщиков, 3 из них B2B-тесты
  • -Запуск 5 организаторов C2C
  • -GMV 8M руб. за пилот
Спринты
  • -Нед 9-10: Логистика (СДЭК API), C2C-модуль, рейтинг
  • -Нед 11: Performance-маркетинг, реферальная программа
  • -Нед 12: Аналитический дашборд, retention-механики, hard launch
Deliverables
  • Полная интеграция с СДЭК
  • C2C-модуль с организаторами
  • Система рейтингов и арбитража
  • Метрики-дашборд (Mixpanel/Amplitude)
  • Первый B2B-пилот (HoReCa)
KPI выхода: GMV 8M, CAC < 800руб., payback < 6 мес
Риски: Логистические сбои, низкий retention
Митигация: 2 логистических партнёра, кэшбэк-программа
3
Scale - Месяцы 4-6

B2B + C2B модули и федеральное масштабирование

Запуск B2B-кооперации и C2B-агрегации спроса, выход в 10 городов, мобильное приложение.

3 мес
8 человек - 9.0M руб.
Цели фазы
  • -20K активных покупателей
  • -200 поставщиков (из них 30 B2B)
  • -Запуск в 10 городах
  • -GMV 60M руб. за квартал
  • -Мобильное приложение iOS+Android
Ключевые работы
  • -B2B-модуль: корпоративные профили, ЭДО, отсрочки
  • -C2B-модуль: RFQ, тендеры поставщиков
  • -React Native приложение
  • -Выделение сервиса escrow в микросервис
  • -ML-рекомендации товаров и поставщиков
Deliverables
  • Полноценная 4-модельная платформа
  • Мобильное приложение в App Store / Google Play
  • 10 городов присутствия
  • Интеграция с 1С для B2B-клиентов
  • Series A readiness pack
KPI выхода: GMV 20M/мес, breakeven по unit-econ
Риски: Кассовый разрыв при масштабировании
Митигация: Раунд pre-A на 30M руб. после пилота
МЕСЯЦ 1
Discovery + MVP start
Спринты 1-4
МЕСЯЦ 2
MVP завершение
Спринты 5-8 - soft launch
МЕСЯЦ 3
Пилот Мск+СПб
Спринты 9-12 - hard launch
МЕСЯЦ 4-6
B2B + C2B + масштабирование
Федеральный запуск
Технологический стек

Современный fullstack с прицелом на масштабирование

Стек выбран с учётом трёх факторов: скорость вывода MVP (1-3 мес), доступность специалистов в РФ, долгосрочная поддержка и масштабируемость. Все компоненты - open-source или с российскими альтернативами.

frontend

Next.js 16

  • - App Router, RSC
  • - TypeScript 5
  • - Tailwind CSS 4
  • - shadcn/ui + Radix
  • - TanStack Query
  • - Zustand
backend

Node.js + Next API

  • - Next.js API Routes
  • - tRPC / REST
  • - Prisma ORM
  • - NextAuth.js v4
  • - Zod-валидация
  • - BullMQ (очереди)
data

PostgreSQL 16

  • - Primary БД
  • - Prisma migrations
  • - Redis (кэш, сессии)
  • - S3-совместимое (фото)
  • - ClickHouse (аналитика)
  • - Бэкапы в S3
realtime

Socket.io

  • - Live-обновления сделок
  • - Чат между сторонами
  • - Уведомления в реальном времени
  • - WebSocket gateway
  • - Redis adapter (scale)
payments

СБП + Эквайринг

  • - СБП (НСПК)
  • - ЮKassa / Тинькофф
  • - Онлайн-касса 54-ФЗ
  • - ОФД (Платформа ОФД)
  • - Чеки в автоматическом режиме
infra

Docker + nginx

  • - Docker Compose
  • - nginx reverse-proxy
  • - Let's Encrypt (SSL)
  • - VPS на Timeweb/Yandex Cloud
  • - GitHub Actions CI/CD
  • - Sentry (errors)
messaging

Telegram + Email

  • - Telegram Bot API
  • - WhatsApp Business (post-MVP)
  • - Postmark / Yandex 360
  • - Push-уведомления (PWA)
  • - SMS-провайдер РФ
analytics

Метрики и аналитика

  • - PostHog (self-hosted)
  • - Yandex Metrica
  • - Custom dashboards
  • - Audit log (каждое действие)
  • - A/B-тестирование

Инфраструктура MVP (1 VPS)

# MVP на одном VPS (8 vCPU / 16 GB / 200 GB SSD, ~6000руб./мес)
+- nginx 80/443 (SSL, статика)
+- Node.js 3000 (Next.js app)
+- Node.js 3001 (Socket.io mini-service)
+- PostgreSQL 5432 (данные)
+- Redis 6379 (кэш, очереди)
\- MinIO 9000 (S3-совместимое хранилище)

# Pilot (мес 3): 2 VPS - app+БД разделение
# Scale (мес 6): Yandex Managed PostgreSQL + k8s
Технический дизайн - для разработчиков

ER-схема БД, API-контракты, state machine и модули кода

Полная техническая спецификация для команды разработки: структура базы данных с полями и связями, REST API endpoint'ы с входами/выходами, диаграмма состояний сделки, ролевая модель авторизации и структура директорий кода. Документ достаточен для начала разработки без дополнительных уточнений.

Часть A

Ролевая модель авторизации

Роль Описание Права Назначается
guest Неавторизованный посетитель Просмотр публичных страниц, каталога пулов, чтение FAQ. Не может участвовать в сделках. По умолчанию
buyer Физлицо-покупатель Участие в пулах, оплата, отслеживание сделок, отзывы, реферальные ссылки После регистрации + верификации email/телефона
buyer_b2b Юрлицо-покупатель Права buyer + корпоративный профиль, ЭДО, отгрузка на склад, копии документов После загрузки ИНН/ОГРН + проверки Контур.Фокус
supplier Поставщик (юрлицо или ИП) Создание карточек товаров, пулов, управление сделками, просмотр выплат, загрузка документов После верификации: ИНН, ОГРН, банк. реквизиты, договор оферты
organizer Организатор C2C (ИП или самозанятый) Создание пулов от своего имени, приёмка партий, выдача участникам, комиссия организатора После верификации: ИНН, статус ИП/самозанятого, адрес ПВЗ
moderator Модератор платформы Проверка поставщиков, модерация карточек, разрешение споров, блокировки Назначается администратором платформы
admin Администратор платформы Полный доступ: пользователи, выплаты, настройки, финансовые отчёты, audit log Назначается другим администратором, 2FA обязательно
Часть B

ER-схема базы данных

Основные таблицы (12 шт.)

users
id UUID PK
email VARCHAR(255) UNIQUE
phone VARCHAR(20) UNIQUE
password_hash VARCHAR(255)
role ENUM(guest,buyer,buyer_b2b,supplier,organizer,moderator,admin)
first_name VARCHAR(100)
last_name VARCHAR(100)
city VARCHAR(100)
avatar_url VARCHAR(500)
is_verified BOOLEAN DEFAULT false
is_blocked BOOLEAN DEFAULT false
rating DECIMAL(3,2) DEFAULT 0
created_at TIMESTAMP
updated_at TIMESTAMP
companies
id UUID PK
user_id UUID FK -> users.id
name VARCHAR(255)
inn VARCHAR(12) UNIQUE
ogrn VARCHAR(15)
kpp VARCHAR(9)
legal_address TEXT
bank_account VARCHAR(20)
bik VARCHAR(9)
verification_status ENUM(pending,verified,rejected)
verified_at TIMESTAMP
documents JSONB (массив URL)
products
id UUID PK
supplier_id UUID FK -> users.id
category_id UUID FK -> categories.id
name VARCHAR(500)
description TEXT
sku VARCHAR(100)
barcode VARCHAR(50) (для Честного ЗНАКа)
images JSONB (массив URL)
weight_kg DECIMAL(8,3)
dimensions JSONB {l,w,h}
is_active BOOLEAN DEFAULT true
pools * (главная таблица)
id UUID PK
product_id UUID FK -> products.id
supplier_id UUID FK -> users.id
organizer_id UUID FK -> users.id NULL
variant ENUM(local,federal,mixed,multipool,preorder,cross_b2b,cascade,tender)
status ENUM(draft,collecting,threshold_met,confirmed,in_progress,delivered,closed,cancelled,refunded)
min_participants INTEGER
max_participants INTEGER
current_participants INTEGER DEFAULT 0
min_volume INTEGER
current_volume INTEGER DEFAULT 0
price_tiers JSONB [{min_qty, price}]
retail_price DECIMAL(10,2)
current_price DECIMAL(10,2)
starts_at TIMESTAMP
collects_until TIMESTAMP
delivery_window JSONB {from, to}
cities JSONB [массив строк]
delivery_type ENUM(cdek,boxberry,pickup_organizer,pickup_warehouse,supplier_own)
commission_rate DECIMAL(4,2)
pool_participants
id UUID PK
pool_id UUID FK -> pools.id
user_id UUID FK -> users.id
quantity INTEGER
unit_price DECIMAL(10,2) (на момент входа)
final_price DECIMAL(10,2) (после каскада)
delivery_city VARCHAR(100)
delivery_address TEXT
pickup_point_id UUID FK -> pickup_points.id
status ENUM(joined,paid,delivered,confirmed,refunded,disputed)
joined_at TIMESTAMP
payments
id UUID PK
participant_id UUID FK -> pool_participants.id
amount DECIMAL(10,2)
method ENUM(sbp,card,acquiring)
provider ENUM(yookassa,tinkoff,sbp_nspk)
provider_payment_id VARCHAR(255)
escrow_transaction_id UUID FK -> escrow_transactions.id
status ENUM(pending,completed,failed,refunded)
receipt_url VARCHAR(500) (54-ФЗ чек)
created_at TIMESTAMP
escrow_transactions *
id UUID PK
pool_id UUID FK -> pools.id
buyer_id UUID FK -> users.id
amount DECIMAL(10,2)
status ENUM(frozen,released,refunded,disputed)
bank_account VARCHAR(20) (Модульбанк/Тинькофф)
frozen_at TIMESTAMP
released_at TIMESTAMP
release_trigger ENUM(delivery_confirmed,auto_after_14d,arbitration)
supplier_payout_id UUID FK -> payouts.id
payouts
id UUID PK
pool_id UUID FK -> pools.id
supplier_id UUID FK -> users.id
gross_amount DECIMAL(10,2)
platform_fee DECIMAL(10,2)
organizer_fee DECIMAL(10,2)
payment_processor_fee DECIMAL(10,2)
net_amount DECIMAL(10,2)
status ENUM(pending,completed,failed)
scheduled_at TIMESTAMP (T+1)
completed_at TIMESTAMP
upf_url VARCHAR(500) (УПД для юрлиц)
shipments
id UUID PK
participant_id UUID FK -> pool_participants.id
carrier ENUM(cdek,boxberry,pochta,pickup,supplier)
tracking_number VARCHAR(100)
status ENUM(created,in_transit,at_pickup,delivered,returned)
pickup_point_id UUID FK -> pickup_points.id
carrier_api_response JSONB
shipped_at TIMESTAMP
delivered_at TIMESTAMP
disputes
id UUID PK
participant_id UUID FK -> pool_participants.id
opened_by UUID FK -> users.id
reason ENUM(not_delivered,damaged,wrong_item,not_as_described,supplier_no_response,other)
description TEXT
evidence JSONB [массив URL фото/документов]
status ENUM(open,under_review,resolved_buyer,resolved_supplier,escalated)
moderator_id UUID FK -> users.id
resolution TEXT
sla_deadline TIMESTAMP (24h / 72h)
created_at TIMESTAMP
resolved_at TIMESTAMP
notifications
id UUID PK
user_id UUID FK -> users.id
channel ENUM(telegram,email,sms,push)
type VARCHAR(50) (pool_joined, threshold_met, etc.)
title VARCHAR(255)
body TEXT
data JSONB (контекст)
status ENUM(queued,sent,delivered,failed)
sent_at TIMESTAMP
audit_log
id BIGSERIAL PK
actor_id UUID FK -> users.id
action VARCHAR(100) (pool.create, payment.refund, etc.)
entity_type VARCHAR(50)
entity_id UUID
old_value JSONB
new_value JSONB
ip_address INET
user_agent TEXT
created_at TIMESTAMP
Связи между таблицами
users 1-N companies (юрлицо может иметь филиалы)
users (supplier) 1-N products
products 1-N pools (мультипулы - несколько пулов на товар)
pools 1-N pool_participants
pool_participants 1-1 payments
payments 1-1 escrow_transactions
pools 1-N payouts (поставщику + организатору)
pool_participants 1-1 shipments
pool_participants 1-N disputes
users 1-N notifications
users 1-N audit_log (все действия)
Часть C

State Machine сделки (pools.status)

9 статусов + переходы

1
draft
Черновик. Пул создан поставщиком/организатором, но не опубликован.
-> publish()
2
collecting
Сбор участников. Пул опубликован, покупатели присоединяются и платят в escrow.
-> reach_threshold() / cancel()
3
threshold_met
Порог достигнут. Минимальный объём/участники набраны, сделка авто-подтверждается.
-> confirm() (через 1ч)
4
confirmed
Сделка подтверждена. Поставщик получает уведомление, готовит партию к отгрузке.
-> ship() / cancel()
5
in_progress
В доставке. Партия отгружена через СДЭК/Boxberry/организатора, трекинг активен.
-> deliver()
6
delivered
Доставлено. Покупатель получил товар в ПВЗ/курьером. 14 дней на подтверждение или спор.
-> confirm_receipt() / open_dispute() / auto_confirm(14d)
7
closed ✓
Закрыта. Покупатель подтвердил получение (или авто-подтверждение через 14 дней). Escrow выпускается поставщику.
-> release_escrow() -> payout()
8
cancelled
Отменена. Порог не достигнут за collects_until, или поставщик отменил. Инициируется возврат.
-> refund_all()
9
refunded
Возврат выполнен. Все участники получили деньги обратно из escrow, сделка закрыта.
-> финал
Важно: переходы между статусами защищены ролевой моделью. Например, confirm() может вызвать только система (по таймеру), а cancel() - поставщик или модератор. Все переходы пишутся в audit_log.
Часть D

API-контракты (REST endpoints)

Основные endpoint'ы (28 шт.)

Метод Путь Роль Описание Вход -> Выход
POST/api/auth/registerguestРегистрация{email,phone,password} -> {user,token}
POST/api/auth/loginguestВход{email,password} -> {user,token}
POST/api/auth/verify-phoneguestSMS-верификация{phone,code} -> {verified:bool}
GET/api/productsguest+Каталог товаров?category=&page= -> {items[],total}
POST/api/productssupplierСоздать товар{name,price,...} -> {product}
GET/api/poolsguest+Список пулов?city=&status=&variant= -> {items[]}
GET/api/pools/:idguest+Карточка пула-> {pool,participants[],tier}
POST/api/poolssupplier/organizerСоздать пул{product_id,variant,...} -> {pool}
POST/api/pools/:id/joinbuyer+Присоединиться к пулу{quantity,delivery} -> {participant,payment_url}
PATCH/api/pools/:id/cancelsupplier/moderatorОтменить пул{reason} -> {pool.status:cancelled}
POST/api/payments/sbpbuyer+Оплата через СБП{participant_id} -> {qr_url,payment_id}
POST/api/payments/cardbuyer+Оплата картой{participant_id} -> {confirmation_url}
POST/api/payments/webhookproviderWebhook от платёжного шлюза{event,data} -> 200 OK
GET/api/shipments/:id/trackbuyer+Трекинг отправления-> {status,history[]}
POST/api/shipments/:id/confirmbuyer+Подтвердить получение-> {pool.status:closed, payout_scheduled}
POST/api/disputesbuyer+Открыть спор{participant_id,reason,evidence[]} -> {dispute}
PATCH/api/disputes/:id/resolvemoderatorРазрешить спор{resolution,winner} -> {dispute,payout}
GET/api/suppliers/dashboardsupplierДашборд поставщика-> {pools[],payouts[],stats}
GET/api/buyers/dashboardbuyer+Дашборд покупателя-> {pools[],shipments[],disputes[]}
GET/api/admin/usersadminСписок пользователей?role=&status= -> {items[]}
PATCH/api/admin/users/:id/blockmoderator/adminЗаблокировать{reason} -> {user.is_blocked:true}
POST/api/suppliers/verifymoderatorВерифицировать поставщика{company_id,documents} -> {verified:bool}
POST/api/webhooks/cdekcdekWebhook от СДЭК{event,shipment_id} -> 200 OK
POST/api/notifications/telegram-bottelegramWebhook от Telegram{update} -> 200 OK
GET/api/notificationsbuyer+Список уведомлений?unread= -> {items[]}
GET/api/admin/audit-logadminAudit log?actor=&action=&from= -> {items[]}
GET/api/admin/finance/reportadminФинансовый отчёт?from=&to= -> {gmv,revenue,fees,payouts}
POST/api/referrals/applybuyer+Применить реферальный код{code} -> {discount}

Все endpoint'ы начинаются с /api. Авторизация через Bearer JWT токен. Все POST/PATCH требуют CSRF-токен. Rate limit: 100 req/min для авторизованных, 20 req/min для гостей.

Часть E

Структура кодовой базы

Директории и модули (Next.js 16 App Router)

rodnoy/
+- src/
|  +- app/                          # Next.js App Router
|  |  +- (public)/                  # Публичные страницы (guest)
|  |  |  +- page.tsx                # Главная
|  |  |  +- catalog/page.tsx        # Каталог пулов
|  |  |  \- pool/[id]/page.tsx      # Карточка пула
|  |  +- (auth)/                    # Авторизация
|  |  |  +- login/page.tsx
|  |  |  \- register/page.tsx
|  |  +- (buyer)/                   # Кабинет покупателя
|  |  |  +- dashboard/page.tsx
|  |  |  +- pools/page.tsx          # Мои пулы
|  |  |  \- shipments/page.tsx      # Мои доставки
|  |  +- (supplier)/                # Кабинет поставщика
|  |  |  +- dashboard/page.tsx
|  |  |  +- products/page.tsx
|  |  |  +- pools/page.tsx          # Управление пулами
|  |  |  \- payouts/page.tsx        # Выплаты
|  |  +- (organizer)/               # Кабинет организатора C2C
|  |  |  \- dashboard/page.tsx
|  |  +- (admin)/                   # Админ-панель
|  |  |  +- users/page.tsx
|  |  |  +- disputes/page.tsx
|  |  |  \- finance/page.tsx
|  |  \- api/                       # API Routes (REST)
|  |     +- auth/[...nextauth]/route.ts
|  |     +- products/route.ts
|  |     +- pools/route.ts
|  |     +- pools/[id]/join/route.ts
|  |     +- payments/sbp/route.ts
|  |     +- payments/webhook/route.ts
|  |     +- shipments/[id]/track/route.ts
|  |     +- disputes/route.ts
|  |     +- webhooks/cdek/route.ts
|  |     \- admin/audit-log/route.ts
|  +- components/
|  |  +- ui/                        # shadcn/ui компоненты
|  |  +- pool/                      # Компоненты пула
|  |  |  +- PoolCard.tsx
|  |  |  +- PoolProgress.tsx
|  |  |  +- PriceTier.tsx
|  |  |  \- ParticipantsList.tsx
|  |  +- payment/                   # Платёжные
|  |  |  +- SbpQR.tsx
|  |  |  \- CardForm.tsx
|  |  +- shipment/                  # Доставка
|  |  |  +- TrackingMap.tsx
|  |  |  \- PickupPointSelector.tsx
|  |  \- admin/                     # Админ-интерфейс
|  +- lib/
|  |  +- db.ts                      # Prisma client
|  |  +- auth.ts                    # NextAuth config
|  |  +- escrow.ts                  # Escrow-сервис
|  |  +- payments/
|  |  |  +- sbp.ts                  # СБП интеграция
|  |  |  +- yookassa.ts
|  |  |  \- tinkoff.ts
|  |  +- carriers/
|  |  |  +- cdek.ts                 # СДЭК API
|  |  |  +- boxberry.ts
|  |  |  \- pochta.ts
|  |  +- notifications/
|  |  |  +- telegram-bot.ts
|  |  |  +- email.ts
|  |  |  +- sms.ts
|  |  |  \- push.ts
|  |  +- compliance/
|  |  |  +- receipt-54fz.ts         # Онлайн-касса
|  |  |  +- honest-sign.ts          # Честный ЗНАК
|  |  |  \- pdn-152fz.ts            # ПДн
|  |  +- moderation/
|  |  |  +- supplier-verify.ts
|  |  |  +- antifraud.ts
|  |  |  \- arbitration.ts
|  |  \- utils/
|  |     +- price-tier.ts           # Расчёт лесенки цен
|  |     +- cascade.ts              # Каскадные пулы
|  |     \- audit-log.ts
|  +- hooks/                        # React hooks
|  |  +- usePool.ts
|  |  +- usePayment.ts
|  |  \- useShipment.ts
|  +- stores/                       # Zustand stores
|  |  +- auth-store.ts
|  |  \- cart-store.ts
|  \- types/                        # TypeScript типы
|     +- api.ts
|     +- pool.ts
|     \- user.ts
+- prisma/
|  +- schema.prisma                 # ER-схема
|  +- migrations/
|  \- seed.ts                       # Тестовые данные
+- mini-services/
|  \- notifications-worker/         # Воркер отправки уведомлений
+- public/                          # Статика
+- tests/
|  +- unit/
|  +- integration/
|  \- e2e/
\- package.json

Готовность к разработке

Документ выше даёт команде разработчиков всё необходимое для старта кодирования без дополнительных уточнений:

  • 12 таблиц БД с полями, типами и связями
  • 7 ролей с правами и триггерами назначения
  • 9 статусов сделки с переходами и триггерами
  • 28 API endpoint'ов с входами/выходами
  • Структура кода по директориям и модулям

Что нужно добавить до первого спринта:

  • ⚠ Swagger/OpenAPI спецификация (автогенерация из типов)
  • ⚠ Sequence-диаграммы для каждой из 8 схем сделок
  • ⚠ Тестовый план (unit/integration/e2e coverage цели)
  • ⚠ CI/CD pipeline конфигурация
  • ⚠ Migration plan (последовательность создания таблиц)
Открытые вопросы - 17 пунктов

Нерешённые вопросы - с планом решения по каждому

17 пунктов, выявленных при аудите, с приоритетом, сроком и решением. Разделены на 3 категории: критично до разработки, до пилота, до Scale.

!

🔴 Критично до начала разработки (5)

G1 - Wireframes / Figma-прототип
Frontend

Нет макетов 15+ экранов приложения (каталог, карточка пула, личный кабинет, оплата, трекинг).

Решение: Figma-прототип до спринта 1
Экраны: 15 ключевых (каталог, пул, оплата, дашборды x3, арбитраж)
Срок: Неделя 1 (Discovery)
G2 - Idempotency для платежей
Backend

Нет защиты от двойных списаний при retry платёжных API.

Решение: Idempotency-Key header на все POST /api/payments/*
Реализация: PostgreSQL UNIQUE constraint на (participant_id, idempotency_key)
Срок: Спринт 5 (escrow)
G3 - Search implementation
Backend

Нет спецификации поиска по пулам и товарам.

Решение: PostgreSQL FTS (tsvector + GIN index) для MVP
Миграция: ElasticSearch на Scale (5K+ пулов)
Фильтры: город, категория, цена, статус, тип пула
Срок: Спринт 3
G4 - File upload pipeline
Backend

Нет спецификации загрузки фото товаров.

Решение: Presigned S3 URL (прямая загрузка в MinIO/S3)
Валидация: max 5MB, JPEG/PNG/WebP, проверка MIME
Thumbnails: sharp (Node.js), 3 размера: 150px, 500px, 1200px
Срок: Спринт 4
G5 - Database indexing
Backend

Нет стратегии индексирования.

Ключевые индексы: pools(status, collects_until), pools(cities GIN), pool_participants(user_id, pool_id), payments(escrow_transaction_id)
Composite: (pool_id, status) на pool_participants для подсчёта
Срок: Спринт 4 (миграции)
?

🟡 До пилота (7)

G6 - Дизайн-система (детально)
Цветовая палитра в коде (CSS variables), типошкала (12px-48px), spacing (4px base), компоненты shadcn/ui с состояниями. Storybook. Срок: Спринт 2
G7 - Caching strategy
Cache-aside: пул-карточки (TTL 60с), каталог (TTL 5мин), пользователь (TTL 30мин). Invalidation: при изменении пула -> DEL pool:{id}. Срок: Спринт 5
G8 - Retry / error handling
Exponential backoff (3 попытки, 1с/4с/16с). Dead letter queue для критичных (платежи). Circuit breaker для внешних API (СБП, СДЭК). Срок: Спринт 6
G9 - SDK integration guides
Конкретные версии: ЮKassa SDK v2, СДЭК API v2, Boxbberry JSON-RPC. Код примеры + error codes. Срок: Спринт 5
G10 - Товарный знак "Родной"
Регистрация в Роспатенте (класс 35 - услуги маркетплейса, класс 9 - ПО). Защита домена .ru/.com. Срок: Discovery (нед 1-2)
G11 - DPIA (Data Privacy Impact Assessment)
Оценка влияния на ПДн: риски утечки, процедуры breach response (уведомление РКН в течение 72ч). Срок: До пилота
G12 - Партнёрские контракты
Объёмные скидки СДЭК (от 500 отправок/мес -> -15%), тарифы ЮKassa (2.0% при объёме 1M+), условия Модульбанка для escrow (6% на остаток). Срок: Discovery
->

🟢 До Scale (5)

G13 - PWA спецификация
manifest.json, service worker (offline catalog cache), push notifications (Web Push API), install prompt. Срок: Спринт 7
G14 - Accessibility (a11y)
WCAG 2.1 AA: цветовой контраст 4.5:1, keyboard nav, ARIA labels, screen reader (NVDA/JAWS). Срок: До Scale
G15 - Страхование escrow
Страхование профессиональной ответственности. При превышении 1.4Mруб. (лимит АСВ) - отдельная страховка. Срок: До Scale
G16 - Налоговая оптимизация
Анализ УСН 6% vs 15% vs ОСНО. Патент для самозанятых организаторов. НДС для B2B. Налоговый консалтинг. Срок: До Scale
G17 - Адаптивность спецификация
Breakpoints: sm 640, md 768, lg 1024, xl 1280. Touch-friendly: min 44px tap targets. Mobile-first подход. Срок: Дизайн-система
5
критичных до разработки
Wireframes, idempotency, search, upload, indexing
7
до пилота
Дизайн-система, кэш, retry, SDK, ТЗ, DPIA, контракты
5
до Scale
PWA, a11y, страхование, налоги, адаптив
Tech Scale-up - масштабирование

От 1 VPS до k8s - триггеры, пороги, cost-прогноз

Когда и как переходим на следующую инфраструктуру. Триггеры перехода, backup/DR стратегия, мониторинг, cost-прогноз по фазам.

3 стадии масштабирования

Стадия Триггер Инфраструктура Cost/мес Что меняется
Stage 1 - MVP
Q1-Q2 2026
Запуск 1 VPS (8 vCPU, 16GB, 200GB SSD)
nginx + Node.js + PostgreSQL + Redis на одном сервере
6 000руб. Docker Compose, ручной deploy, daily backup
Stage 2 - Pilot
Q3 2026
500+ сделок/мес
CPU >70%
2 VPS: App (8 vCPU) + DB (8 vCPU, 32GB)
Redis на отдельном контейнере
S3 для статики
18 000руб. CI/CD через GitHub Actions, hourly backup, мониторинг Sentry + Uptime
Stage 3 - Scale
Q4 2026+
5K+ сделок/мес
3K+ одновременных
Yandex Managed PostgreSQL
k8s cluster (3 nodes)
Redis Cluster
CDN для статики
45 000руб. Auto-scaling, replication, PITR backup, ELK stack для логов

Backup стратегия

PostgreSQL
- Daily: полный pg_dump -> S3 (retention 30 дней)
- Hourly: WAL archive -> S3 (PITR на Stage 3)
- Weekly: base backup -> отдельный регион
Redis
- RDB snapshot каждые 6 часов
- AOF для критичных данных
- Retention: 7 дней
S3 (фото, документы)
- Versioning включён
- Cross-region replication (Stage 3)
- Lifecycle: 90 дней -> Glacier

Disaster Recovery

RTO (Recovery Time Objective)
Stage 1: 4 часа - Stage 2: 2 часа - Stage 3: 30 мин
RPO (Recovery Point Objective)
Stage 1: 24 часа - Stage 2: 1 час - Stage 3: 5 минут (PITR)
Сценарии DR
- Падение VPS -> восстановление из backup на новый сервер
- Коррупция БД -> PITR до точки сбоя
- Удаление данных -> restore из последнего backup
DR-тестирование
Ежеквартальный DR-drill: восстановление на staging-сервере

Мониторинг - что отслеживаем

Infra
CPU, RAM, disk I/O, network
Uptime, response time
Node exporter + Prometheus
App
Error rate, RPS, latency
Slow queries, pool connections
Sentry + custom metrics
Business
GMV/час, регистрации/час
Платежи, escrow-баланс
PostHog + Metabase
Security
Антифрод-флаги, failed logins
Rate-limit violations
Cloudflare WAF + audit log
QA - тестирование и качество

Test plan, автотесты, нагрузочное, pen-test

Стратегия обеспечения качества: что тестируем, как, какие инструменты, критерии приёмки. Coverage цели по типам тестов, расписание нагрузочного тестирования и pen-test.

Пирамида тестов

Unit-тесты
70%
Jest + React Testing Library. Coverage: бизнес-логика (ценообразование, escrow, cascade). Цель: 80% coverage на lib/ модулях.
Integration
20%
Vitest + Prisma test DB. API routes, workflows (создание пула -> join -> оплата -> доставка). Цель: 60% coverage на api/.
E2E
10%
Playwright. Критические user flows: регистрация -> участие в пуле -> оплата -> подтверждение. 15-20 сценариев.

Test Plan для MVP

1
Smoke-тесты (каждый deploy)
Главная страница, регистрация, вход, создание пула, оплата СБП (мок)
2
Regression (каждый релиз)
Все E2E сценарии + критические unit-тесты. Время: ~10 мин
3
Нагрузочное (перед пилотом)
k6: 1000 одновременных, 100 RPS на /api/pools, проверка latency <500ms
4
Pen-test (перед Scale)
Внешний аудитор: OWASP Top 10, SQL injection, XSS, CSRF, auth bypass
5
User acceptance (перед launch)
10 тестовых пользователей проходят CJM, фиксация friction points

CI/CD и критерии приёмки

CI Pipeline
1. Lint (ESLint + Prettier)
2. Type check (TypeScript)
3. Unit-тесты (Jest)
4. Build (Next.js)
5. Integration-тесты (Vitest)
CD Pipeline
1. E2E на staging
2. Deploy на staging
3. Smoke-тесты staging
4. Manual approval (PM)
5. Deploy на production
Критерии приёмки
- Unit coverage >= 80%
- E2E: все критические flows зелёные
- 0 critical/high багов
- Lighthouse score >= 80
- Latency API < 500ms (p95)