RUEN
Обсудить проект

Продукт студии

Play&Buy

Магазин зарубежных подписок и игр для Беларуси: каталог, заказы, шифрованные ключи, курс Нацбанка и админка на пятнадцать разделов.

маршрут API
141
таблицы в базе
23
разделов админки
15

Открыть сайт — playnbuy.by ↗

Главная страница Play&Buy

Магазин зарубежных подписок, игр и сервисов для Беларуси: каталог с фильтрами, корзина, промокоды, заказы с мгновенной выдачей ключей, отзывы и большая административная часть.

Бэкенд — Go: 55 файлов, 13 379 строк, 141 маршрут. Фронтенд — Next.js: 128 файлов, 26 384 строки.

Товар здесь — это ключ, и он лежит зашифрованным

Магазин цифровых товаров устроен не как обычный: на складе не коробки, а строки активации. Утечка базы в таком магазине означает не «украли адреса покупателей», а «украли весь непроданный товар».

Поэтому ключи хранятся в базе зашифрованными AES и расшифровываются в момент выдачи. Склад ключей — отдельный раздел админки со своей моделью: ключ привязан к варианту товара, резервируется под заказ и после выдачи не возвращается в оборот.

Цены в рублях по курсу Нацбанка, а не по вчерашнему

Товар закупается в валюте, продаётся в белорусских рублях. Курс, вбитый руками, начинает врать на следующий день — и либо магазин работает в минус, либо покупатель видит цену выше рынка.

В проекте есть фоновый работник, который забирает официальный курс USD и RUB из API Национального банка и обновляет его в базе. Цена в каталоге пересчитывается от текущего курса, а не от того, что помнил администратор.

Админка — половина проекта

Пятнадцать разделов, и это не «таблица товаров с кнопкой удалить»:

  • товары, категории деревом, варианты со своими ценами;
  • склад ключей и их движение;
  • заказы и их статусы;
  • промокоды с проверкой срока, лимита использований и минимальной суммы;
  • модерация отзывов — одобрить или отклонить;
  • пользователи, роли, блокировка;
  • журнал действий администраторов — кто что поменял и когда;
  • мониторинг, настройки, FAQ, произвольные страницы;
  • конструктор главной страницы и раздел оформления.

Последние два стоит выделить: владелец меняет состав и порядок блоков на главной сам, не обращаясь к разработчику. Для магазина, где витрина перестраивается под каждую распродажу, это разница между «напишу вам в пятницу» и «поменяю за пять минут».

Поддержка живёт в Telegram, а не в отдельной панели

У магазина есть бот, и поддержка работает через него: покупатель отправляет /support, создаётся тикет, дальше переписка идёт в Telegram — со статусами, назначением на оператора и историей сообщений в базе.

Логика простая и правильная: покупатель цифровых товаров и так сидит в Telegram, а оператору не нужно держать открытой ещё одну вкладку. Активный тикет у человека может быть только один — иначе одна и та же проблема расползается по трём обращениям.

Почему бэкенд на Go

141 маршрут, 23 таблицы, фоновые работники, шифрование, выдача ключей в момент оплаты. Это не тот случай, где важна скорость написания первой версии, — здесь важна предсказуемость под нагрузкой и строгая типизация на границе с деньгами и товаром.

Слои разделены: обработчики, сервисы, репозитории, модели. Обработчик не ходит в базу напрямую — это та же дисциплина, что позволяет потом поменять хранилище, не переписывая логику.

Что видит покупатель

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

Отзыв можно оставить и без регистрации — иначе у магазина цифровых товаров, где половина покупок гостевые, отзывов не будет вовсе.

Как это стоит

Шесть контейнеров в одном описании: база, кеш, бэкенд, фронтенд, nginx и выпуск сертификатов. Развёртывание на чистом сервере — это клонировать репозиторий, заполнить переменные окружения и поднять всё одной командой.

Go 1.22 · Fiber · GORM · PostgreSQL 16 · Redis 7 · Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Docker · nginx