Платформа построена на современном стеке Next.js 16 + PostgreSQL с выделенными сервисами для платёжного шлюза, уведомлений и realtime-обновлений. Архитектура оптимизирована под быстрый MVP (1-3 мес) с последующим горизонтальным масштабированием без переписывания ядра.
План построен по 2-недельным спринтам. Жёсткий приоритет - запуск MVP B2C+C2C к концу 8-й недели, пилот в одном городе (нед 9-12), добавление B2B и C2B модулей - фаза 3 (мес 4-6). Все сроки валидированы под команду из 5 человек.
Юр. оформление, выбор стека, привлечение первых партнёров, исследование пользователей.
Базовый движок закупок, escrow, СБП-платежи, 2 пилотных категории товаров, Telegram-бот.
Фокус на Москву + СПб, логистическое партнёрство с СДЭК, запуск C2C-сегмента, первые B2B-тесты.
Запуск B2B-кооперации и C2B-агрегации спроса, выход в 10 городов, мобильное приложение.
Стек выбран с учётом трёх факторов: скорость вывода MVP (1-3 мес), доступность специалистов в РФ, долгосрочная поддержка и масштабируемость. Все компоненты - open-source или с российскими альтернативами.
# 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
Полная техническая спецификация для команды разработки: структура базы данных с полями и связями, REST API endpoint'ы с входами/выходами, диаграмма состояний сделки, ролевая модель авторизации и структура директорий кода. Документ достаточен для начала разработки без дополнительных уточнений.
| Роль | Описание | Права | Назначается |
|---|---|---|---|
| guest | Неавторизованный посетитель | Просмотр публичных страниц, каталога пулов, чтение FAQ. Не может участвовать в сделках. | По умолчанию |
| buyer | Физлицо-покупатель | Участие в пулах, оплата, отслеживание сделок, отзывы, реферальные ссылки | После регистрации + верификации email/телефона |
| buyer_b2b | Юрлицо-покупатель | Права buyer + корпоративный профиль, ЭДО, отгрузка на склад, копии документов | После загрузки ИНН/ОГРН + проверки Контур.Фокус |
| supplier | Поставщик (юрлицо или ИП) | Создание карточек товаров, пулов, управление сделками, просмотр выплат, загрузка документов | После верификации: ИНН, ОГРН, банк. реквизиты, договор оферты |
| organizer | Организатор C2C (ИП или самозанятый) | Создание пулов от своего имени, приёмка партий, выдача участникам, комиссия организатора | После верификации: ИНН, статус ИП/самозанятого, адрес ПВЗ |
| moderator | Модератор платформы | Проверка поставщиков, модерация карточек, разрешение споров, блокировки | Назначается администратором платформы |
| admin | Администратор платформы | Полный доступ: пользователи, выплаты, настройки, финансовые отчёты, audit log | Назначается другим администратором, 2FA обязательно |
confirm() может вызвать только система (по таймеру), а cancel() - поставщик или модератор. Все переходы пишутся в audit_log.
| Метод | Путь | Роль | Описание | Вход -> Выход |
|---|---|---|---|---|
| POST | /api/auth/register | guest | Регистрация | {email,phone,password} -> {user,token} |
| POST | /api/auth/login | guest | Вход | {email,password} -> {user,token} |
| POST | /api/auth/verify-phone | guest | SMS-верификация | {phone,code} -> {verified:bool} |
| GET | /api/products | guest+ | Каталог товаров | ?category=&page= -> {items[],total} |
| POST | /api/products | supplier | Создать товар | {name,price,...} -> {product} |
| GET | /api/pools | guest+ | Список пулов | ?city=&status=&variant= -> {items[]} |
| GET | /api/pools/:id | guest+ | Карточка пула | -> {pool,participants[],tier} |
| POST | /api/pools | supplier/organizer | Создать пул | {product_id,variant,...} -> {pool} |
| POST | /api/pools/:id/join | buyer+ | Присоединиться к пулу | {quantity,delivery} -> {participant,payment_url} |
| PATCH | /api/pools/:id/cancel | supplier/moderator | Отменить пул | {reason} -> {pool.status:cancelled} |
| POST | /api/payments/sbp | buyer+ | Оплата через СБП | {participant_id} -> {qr_url,payment_id} |
| POST | /api/payments/card | buyer+ | Оплата картой | {participant_id} -> {confirmation_url} |
| POST | /api/payments/webhook | provider | Webhook от платёжного шлюза | {event,data} -> 200 OK |
| GET | /api/shipments/:id/track | buyer+ | Трекинг отправления | -> {status,history[]} |
| POST | /api/shipments/:id/confirm | buyer+ | Подтвердить получение | -> {pool.status:closed, payout_scheduled} |
| POST | /api/disputes | buyer+ | Открыть спор | {participant_id,reason,evidence[]} -> {dispute} |
| PATCH | /api/disputes/:id/resolve | moderator | Разрешить спор | {resolution,winner} -> {dispute,payout} |
| GET | /api/suppliers/dashboard | supplier | Дашборд поставщика | -> {pools[],payouts[],stats} |
| GET | /api/buyers/dashboard | buyer+ | Дашборд покупателя | -> {pools[],shipments[],disputes[]} |
| GET | /api/admin/users | admin | Список пользователей | ?role=&status= -> {items[]} |
| PATCH | /api/admin/users/:id/block | moderator/admin | Заблокировать | {reason} -> {user.is_blocked:true} |
| POST | /api/suppliers/verify | moderator | Верифицировать поставщика | {company_id,documents} -> {verified:bool} |
| POST | /api/webhooks/cdek | cdek | Webhook от СДЭК | {event,shipment_id} -> 200 OK |
| POST | /api/notifications/telegram-bot | telegram | Webhook от Telegram | {update} -> 200 OK |
| GET | /api/notifications | buyer+ | Список уведомлений | ?unread= -> {items[]} |
| GET | /api/admin/audit-log | admin | Audit log | ?actor=&action=&from= -> {items[]} |
| GET | /api/admin/finance/report | admin | Финансовый отчёт | ?from=&to= -> {gmv,revenue,fees,payouts} |
| POST | /api/referrals/apply | buyer+ | Применить реферальный код | {code} -> {discount} |
Все endpoint'ы начинаются с /api. Авторизация через Bearer JWT токен. Все POST/PATCH требуют CSRF-токен. Rate limit: 100 req/min для авторизованных, 20 req/min для гостей.
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
Документ выше даёт команде разработчиков всё необходимое для старта кодирования без дополнительных уточнений:
Что нужно добавить до первого спринта:
17 пунктов, выявленных при аудите, с приоритетом, сроком и решением. Разделены на 3 категории: критично до разработки, до пилота, до Scale.
Нет макетов 15+ экранов приложения (каталог, карточка пула, личный кабинет, оплата, трекинг).
Нет защиты от двойных списаний при retry платёжных API.
Нет спецификации поиска по пулам и товарам.
Нет спецификации загрузки фото товаров.
Нет стратегии индексирования.
Когда и как переходим на следующую инфраструктуру. Триггеры перехода, backup/DR стратегия, мониторинг, cost-прогноз по фазам.
| Стадия | Триггер | Инфраструктура | 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 для логов |
Стратегия обеспечения качества: что тестируем, как, какие инструменты, критерии приёмки. Coverage цели по типам тестов, расписание нагрузочного тестирования и pen-test.