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, что позволяет разворачивать прод-подобное окружение локально и в проде идентичным образом.