← Все кейсы A-01 Кейс · /ru/business/pioner

Сайт pioner.ru

B2B-каталог мебели под заказ: покупатель настраивает изделие в калькуляторе, сразу видит цену, собирает корзину и оформляет заказ без регистрации.

Статус
В проде с лета 2026
Роль
Весь стек, один разработчик; дизайн — с фрилансерами-дизайнерами
Стек
Next.js 15React 19TypeScriptTailwind 4FastAPIDjango 5 / Wagtail 6PostgreSQL 16RedisElasticsearchRabbitMQnginxDocker ComposeGitHub Actions
W 1160
A-01видео · 1600 × 1000 · прототип
pioner.ru
Прототип 3D-модели в калькуляторе (three.js, ветка эксперимента — в прод не влит)
390 × 844
A-01видео · прототип
Прототип 3D-модели в калькуляторе (three.js, ветка эксперимента — в прод не влит)
01Задача ~1,5 года · один разработчик~1,5 года

Что нужно было сделать

Старый сайт на MODX не давал менять ассортимент, цены и параметры калькуляторов без программиста, а для заказа покупателю приходилось писать менеджеру. Нужен был каталог, где цена считается на лету, заказ оформляется без регистрации, а контент, фото и параметры меняются в админке — и всё это должен был сделать один человек.

Сделал за ~1,5 года: монорепозиторий из 9 сервисов — фронт на Next.js и 8 сервисов на Python, включая CMS на Wagtail. Весь стек работает в docker compose на одном сервере, мониторинг — на отдельном. Публикация страницы в админке сама сбрасывает кеш сайта; товары уходят фидами в Яндекс Товары и Яндекс Бизнес; на сайте работает чат с ИИ-консультантом, а контент-бот правит карточки через MCP.

02Архитектура 9 сервисов · docker compose9 сервисов

Как это устроено

Контент API для браузера Хранилища
Яндекс · Товары · Бизнес
Посетители
Контент-бот · MCP
Chatwoot · бот-консультант
nginx
TLS
301 и 410
front · Next.js, SSR и ISR
gateway · BFF, кеш, MCP
cms · Wagtail, админка, фиды
calculators · цена
cart · корзина, заказы, КП
auth · гость, вход по коду
search · Elasticsearch
Redis · кеш
PostgreSQL
Elasticsearch
фиды SSR сброс ISR REST цена
Легенда
  • HTTP
  • внешний сервис
  • запросы
  • хранилище
Контент API для браузера Хранилища
Посетители
Контент-бот · MCP
Chatwoot · бот
nginx · TLS · 301 и 410
front · Next.js, SSR и ISR
gateway · BFF, кеш, MCP
cms · Wagtail, админка, фиды
calculators · цена
cart · корзина, заказы, КП
auth · гость, вход по коду
search · Elasticsearch
PostgreSQL · cms, cart, auth
Redis · gateway, calculators
Elasticsearch · search
Легенда
  • HTTP
  • внешний сервис
  • запросы
  • хранилище
9 сервисов в одном docker compose; внешние сервисы обведены пунктиром. Браузер ходит в calculators, search, cart и auth напрямую через nginx. RabbitMQ и notifications — в решении 02 ниже; scheduler — cron: sitemap, фиды, импорт из XML-фида.
03Цифры

В цифрах

  • 9 сервисов: фронт на Next.js и 8 на Python
  • ~81 тыс. строк кода
  • 616 тестов
  • 100 / 0 Lighthouse SEO / CLS, мобильный

Ещё: 93 деплоя в прод с медианой 39 с · 536 правил 301 при переезде · 1 381 коммит · 127 HTTP-эндпоинтов · 19 MCP-инструментов.

04Инженерные решения 4 решения

Что было непросто

Решение 01

Калькулятор — класс с аннотациями и реестр

Изделие — класс, параметры объявлены аннотациями типов. Декоратор кладёт класс в реестр, при старте каждый получает две ручки — расчёт и превью, — а модель запроса и OpenAPI генерируются из аннотаций. Настройки живут в CMS и проецируются в Redis; URL класса совпадает с URL страницы товара, поэтому калькулятор находится без таблицы соответствий. Ответ у всех калькуляторов один, и корзина собирает позицию одинаково для любого изделия. Цену с фронта корзина не принимает.

Решение 02

Сброс двух слоёв кеша по событиям

Ответы кешируются дважды — в Redis у gateway и в ISR Next.js. CMS после коммита транзакции публикует событие в RabbitMQ; воркер gateway переводит событие в ключи и идёт строго по порядку: Redis, затем сброс ISR, затем прогрев страницы. Гонку закрывает счётчик поколения: пересборка, увидевшая после записи другое значение, удаляет свой результат. События идемпотентны, страховка — TTL и кнопка «Очистить кеш» в админке.

cms · сигнал после коммита
RabbitMQ · событие
gateway · воркер
1 · Redis
2 · сброс ISR
3 · прогрев страницы
Схема событий
cms · сигнал после коммита
RabbitMQ · событие
gateway · воркер
1 · Redis
2 · сброс ISR
3 · прогрев
Схема событий
Событие идемпотентно: «удали и перечитай». Письма из gateway, cart и auth тоже идут через RabbitMQ — их отправляет notifications.
Решение 03

ИИ-бот правит живой сайт через MCP

MCP-сервер работает без серверных сессий, с OAuth 2.1, поэтому запрос может обработать любой воркер. Запись в CMS повторяется, только если запрос точно не ушёл; «прочитать → изменить → опубликовать» идёт в одной транзакции под блокировкой строки с повторной проверкой. В страницу с черновиком редактора запись не идёт — бот получает 409. Правка применяется целиком или никак, HTML проходит белый список тегов.

19 MCP-инструментов: 9 на чтение, 10 на запись
W 556
A-01.3Telegram → MCP → сайт · статистика
Чат с ботом Пионер в Telegram: по просьбе владельца ассистент добавил разъёмы и их количество в калькуляторы семи блоков розеток и показал таблицу, что теперь выводится в расчёте
Чат с ботом Пионер в Telegram: ответ по статистике витрин — переходы, время на сайте и открытия калькуляторов (цифры размыты)
Слева ассистент правит калькуляторы на сайте через MCP, справа — отвечает по статистике витрин.
Решение 04

Переезд: 301 и честные 404/410

У старого сайта были сотни адресов в выдаче с другой структурой URL. Карта 301 в nginx — 536 точных правил, разделы без замены отвечают 410. На фронте 404 приходит с настоящим статусом: notFound() вызывается до первой границы стриминга. Сам переезд — перевод staging-сервера в production с сохранением данных.

05История 08.2024 → 10.20262024 → 2026

Как шёл проект

  1. 08.2024Старт: auth, PostgreSQL, Redis, nginx в docker compose
  2. 09.2024Первый фронт (SPA), CMS на Wagtail, gateway как BFF
  3. 02–04.2025Один сервис калькуляторов вместо нескольких; реестр калькуляторов; первый CI/CD на staging
  4. 05.2025Фронт переписан на Next.js 15 и React 19
  5. 09–12.2025Корзина и заказ гостем; RabbitMQ, scheduler, поиск на Elasticsearch, уведомления, вход по коду
  6. 13.06.2026Запуск в прод
  7. 06–09.2026MCP-сервер с OAuth; фиды Яндекса; событийный сброс кеша; ежесуточные бэкапы; честные 404/410
  8. 10.2026Повтор писем до успеха; статусы заказа с историей; чат с ИИ-консультантом для всех посетителей
06Экраны 6 кадров
07Интеграции 14

С чем связан сайт

  • Яндекс Метрика
  • Яндекс Товары
  • Яндекс Бизнес
  • Яндекс Директ (ЕПК)
  • Chatwoot
  • MCP
  • SMTP
  • Let's Encrypt
  • Tailscale
  • GitHub Actions
  • GHCR
  • Prometheus
  • Loki
  • Grafana
08Рядом то же производство