01 · Экосистема EloStore
EloStore
FACEIT
Уровень 1
ELO 320
до 2 уровня 181 ELO
Платформа услуг для CS2
Коммерческий сервис: буст рейтинга, AI-разбор демок, турниры, скины, партнерка. Переписан с монолита на новый стек без остановки продаж: 109 522 строки TypeScript, 82 таблицы PostgreSQL и ответ API за 30-90 мс на проде.
Команда на витрине
У каждого бустера на главной своя карточка: рендер агента, 10 уровень FACEIT и ELO.
Рендеры с elostore.ru: сделаны нашим промпт-инжинирингом на наших 3D-наработках и нашей собственной модели










Оплата: три шлюза
Рубли на elostore.ru, доллары и евро на elostore.pro: российская платежка, зарубежный кошелек и криптовалюта. Каждая оплата проходит одну и ту же проверку, прежде чем стать заказом, а данные карт к нам не попадают вообще.
Журнал повторяет обработку оплаты в коде сайта, суммы и номера заказов вымышленные
Журнал оплатыLava
Заказ сам находит исполнителя
Оплаченный заказ за секунду уходит в Telegram: клиенту подтверждение, админам карточка, бустерам заявка с кнопкой. Сайт при этом самодостаточен: все то же приходит в кабинет и на почту, а запасной путь для бустеров это канал заказов. Кто первый нажал, того и заказ, а доля бустера начисляется сама.
Тексты сообщений из кода ботов EloStore, заказ, имена и суммы вымышленные
EloStoreTelegram · клиенту
#A7K2FACEIT · 6 → 9 lvlСумма: 3 490 ₽Срок: 2-3 дняПодбираем бустера. Напишем, как только он возьмёт заказ.EloStoreTelegram · админам
#A7K2FACEIT · 6 → 9 lvlСумма: 3 490 ₽Клиент: АртемСрок: 2-3 дняEloStoreTelegram · бустеру Stormrush
AI-разбор демки
Игрок загружает запись матча и получает разбор по раундам. Парсер, больше 70 метрик, разметку зон карт и эталоны мы сделали с полного нуля, а LLM настроили и обучили на примерах как тренера: роль, словарь сленга, правила, хороший и плохой разбор.
Цифры игрока в примере вымышленные, метрики и формат разбора настоящие
Перетащи .dem или нажми, чтобы выбрать
FACEITPremierММWingman
Турниры
Турнир проходит целиком на сайте: заявка командой, сетка, бан карт капитанами и запуск матча на нашем CS2-сервере. Адрес сервера после вето видят только игроки, админ и кастер, а трансляцию дополняют повторы ярких моментов.

0 vs 0
Ход Kraken: бан карты
Ancient
Anubis
Dust II
Inferno
Mirage
Nuke
OverpassDouble Elimination · 8 команд
Верхняя · 1/4
Kraken13
Nomads9
Stormline13
Havoc11
Frostbite8
Zenith13
Redline13
Aftershock6
Верхняя · 1/2
Kraken13
Stormline10
Zenith11
Redline13
Финал верхней
Kraken·
Redline·
Команда собирается по ссылке
- kkiraкэп
- свободный слот
- свободный слот
- свободный слот
- свободный слот
Задача
EloStore продавал на старом монолите: один server.js, данные без строгой схемы, страшно трогать платежи.
Задача: переписать продукт целиком так, чтобы продажи не останавливались ни на день, и заложить основу для роста: SEO, новые продукты, вторая витрина на западный рынок.
Срез по слоям
- Интерфейспиксель
- Витрина с калькулятором цены, кабинеты клиента, бустера и партнера, админка на 38 разделов, оверлей для трансляций
- Логикаденьги и правила
- Цена чистыми функциями с тестами, заказ создает только вебхук, начисления без дублей, одно ядро на сайт, бота и админку
- Данныесхема и миграции
- 82 таблицы в отдельной схеме, миграции руками и идемпотентно, баланс исполнителя в трех карманах под FOR UPDATE
- Сервервыкладка и эксплуатация
- Standalone-сборка одним архивом, systemd и nginx, снимок и health-check в деплое, разбор демок отдельной службой
- Безопасностьядро
- Guard в каждой странице админки и тест на все page.tsx, вход gate → пароль → 2FA, CSP без unsafe-inline
Переезд без остановки продаж

Старый монолит на Express заменен на Next.js 15, React 19, TypeScript strict и Drizzle поверх той же PostgreSQL.
- 01Сначала разбор старой системы и живой схемы базы, потом схема Drizzle поверх существующих данных: текстовые даты переведены в timestamptz, старые идентификаторы сохранены
- 02Фазы: схема → дизайн-система → кабинеты → калькулятор и оплата → чаты и админка → переключение трафика в nginx
- 03Платежный модуль перенесен как черный ящик: формулы один в один с прежним продом
- 04Server Actions для мутаций, API-роуты только там, где нужен внешний вызов: вебхуки, Telegram, игровой сервер
Итог
Трафик на новой версии, старое приложение выведено из обращения и заархивировано.
Деньги: оплата и выплаты

Прием оплаты через три провайдера, включая криптовалюту, и автоматические начисления исполнителям.
- 01Заказ создает только вебхук провайдера, клиент лишь инициирует счет
- 02Атомарный клейм: UPDATE ... WHERE status <> 'succeeded' RETURNING. Заказ создает та доставка, что выиграла гонку
- 03Подпись говорит «от кого», но не «сколько»: сумма сверяется, цена пересчитывается на сервере из снимка
- 04Провайдер без вебхуков страхуется опросом неоплаченных счетов раз в 3 минуты
- 05Выплата идемпотентна по паре заказ-исполнитель, сумма дельт баланса всегда ноль, это держит тест
Итог
Повторный или опоздавший вебхук не создает второй заказ и не откатывает статус.
Четыре роли на одной базе

Клиент, бустер, партнер и админ работают в своих интерфейсах поверх одних данных.
- 01Клиент: заказы, чат с исполнителем, доступы к аккаунту шифруются и стираются при закрытии, отзыв и чаевые
- 02Бустер: пул заявок, взятие заказа, прогресс, финансы и вывод
- 03Партнер на своем поддомене: промокод, переходы, конверсия, начисления
- 04Бизнес-логика живет в server/<домен>/core.ts и вызывается из сайта, бота и админки: после расхождения выплат между кабинетом и админкой дублей больше нет
AI-разбор демок

Платный продукт: игрок загружает запись матча и получает разбор ошибок по раундам.
- 01Python-парсер реплеев CS2 считает метрики прицела и движения
- 02LLM-анализ поверх метрик, воркер на FastAPI в Docker, non-root, токен сравнивается за константное время
- 03Запросы к LLM из РФ режутся провайдерами: исходящий трафик идет SOCKS-туннелем на зарубежный узел
Итог
Тяжелая обработка изолирована от витрины и не может ее положить.
Партнерка со стримерами и антифрод

Стримеры получают процент с заказов по промокоду, накрутка онлайна ловится автоматически.
- 01Считаем не «сколько пишет чат», а «сколько пишет живых»: ботоферма умеет писать, но ее аккаунты палятся
- 02Сигналы: доля онлайна, проявившаяся в чате живыми аккаунтами, онлайн к фолловерам, плоский график онлайна, нулевые фолловеры и кучная регистрация у писавших
- 03Только публичные источники: анонимный Twitch IRC и открытые API, трекер копит данные каждые 5 минут
- 04Пока данных мало, вердикт честный: «мало данных», а не догадка
точка это 10 зрителей
Онлайн за час
обычный канал
этот каналровная линия
Истории с прода
Инцидент 01 · открыт
Layout не защищает страницу
В Next.js layout и page рендерятся параллельно. Проверка в layout не мешала странице сходить в базу и отдать данные в RSC-пейлоаде: заказы и почты клиентов уходили неавторизованному curl.
Инцидент 02 · открыт
Настройки админки не доезжали до цены
Функция надбавки принимала ставки аргументом, а вызывалась без него. Цена считалась по зашитым значениям, что бы ни выставил админ.
Инцидент 03 · открыт
Карта сайта закешировалась пустой
Страницы с ISR пререндерились во время сборки без доступа к базе, и sitemap однажды ушел в кеш пустым.
Стек
Next.js 15 · React 19 · TypeScript strict · Tailwind v4 · Drizzle ORM · PostgreSQL · Zod · Pino · Vitest · Python · FastAPI · Docker · nginx · systemd