Алексей Белов
← Все проекты

Vkusnoru

Интернет-магазин на Next.js и NestJS с каталогом товаров, оформлением заказов, кастомной админ-панелью, логированием и защитой от атак.

Next.jsReactTypeScriptNestJSPostgreSQLPrismaDockerNginx

Задача

Построить интернет-магазин с публичной витриной (каталог, карточки товаров с весовыми опциями, оформление заказа) и полнофункциональной админ-панелью для управления каталогом, контентом (статьи, SEO, сезонные настройки, доставка) и заказами — без привязки к готовым CMS-решениям, с прозрачной архитектурой и контролем над безопасностью и данными.

Результат

  • Полноценный интернет-магазин с самостоятельной платформой управления: владелец ведёт каталог, контент и заказы через собственную админку без зависимости от сторонних CMS.
  • Прозрачный контроль безопасности: журнал входов с детекцией подозрительных попыток и логи ошибок, безопасные для хранения и просмотра благодаря автоматической санитизации чувствительных данных.

Решение

  • Backend на NestJS с чёткой слоистой архитектурой (controller → service → Prisma) и модульной структурой: публичные модули (каталог, категории, заказы, SEO) отдельно от админских (товары, категории, заказы, медиа, статьи, доставка, сезонные настройки, безопасность). Общие Zod-схемы в отдельном пакете (@sladkoru/contracts) используются и на фронте, и на бэке, что исключает рассинхронизацию типов между клиентом и сервером.
  • Оформление заказа с расчётом стоимости по весовым опциям товара на сервере (без доверия к ценам с клиента) и уведомлениями о новом заказе по email и в Telegram.
  • Аутентификация в админке через JWT в httpOnly-cookie (подпись через jose, хеширование паролей — argon2) с версионированием сессий для мгновенного отзыва доступа. Отдельный модуль безопасности логирует все попытки входа (IP, User-Agent, статус, причину отказа) и помечает подозрительную активность.
  • Собственная система логирования ошибок с санитайзером: перед записью в базу данные проходят через фильтры, которые редактируют пароли, токены, cookie и другие чувствительные поля, маскируют email и телефоны, а также строят фингерпринт ошибки (по методу, пути и нормализованному сообщению) для группировки повторяющихся инцидентов.
  • Frontend на Next.js (App Router) с разделением на публичную витрину (RSC-first, кэширование через теги и ISR) и защищённую админ-часть с формами управления товарами, загрузкой и конвертацией изображений (Sharp → WebP). Инвалидация кэша витрины происходит через webhook с bearer-секретом при изменении данных в админке.
  • Инфраструктура через Docker и Nginx, что позволяет разворачивать прод-подобное окружение локально и в проде идентичным образом.