Sladkoru
Интернет-магазин турецких сладостей: дизайн, frontend, backend, SEO и деплой — полный цикл.
Next.jsReactTypeScriptNestJSPostgreSQLPrismaDockerNginx
Задача
Разработать интернет-магазин турецких сладостей с нуля: витрину с каталогом и карточками товаров, оформление заказа без предоплаты (с уведомлением менеджера), и полноценную админ-панель для управления магазином без участия разработчика — товары, категории, медиа, заказы, статьи и модерация контента.
Результат
- Владелец бизнеса самостоятельно управляет всем контентом сайта — товарами, ценами, статьями и заказами — без обращения к разработчику.
- Сайт полностью готов к продакшену: быстрый, SEO-оптимизированный сторфронт и стабильная админка с журналом ошибок и контролем доступа, работающие в едином Docker-окружении.
Решение
- Монорепозиторий на pnpm workspaces с общим пакетом контрактов (Zod-схемы + типы), который является единственным источником правды для DTO между frontend и backend — исключает рассинхрон типов между слоями.
- Frontend на Next.js App Router с разделением на публичную витрину (RSC, кеширование) и защищённую админку; backend на NestJS со слоистой архитектурой controller → service → Prisma, JWT-аутентификация в httpOnly-cookie (jose + argon2) с версионированием сессий для мгновенного отзыва доступа.
- Админ-панель включает: CRUD для товаров и категорий (с ручной сортировкой и featured-слотами), загрузку и конвертацию изображений в WebP через sharp, Notion-подобный блочный редактор для статей, модерацию пользовательского контента, журнал ошибок и раздел безопасности сессий.
- SEO-модуль с генерацией метаданных и структурированных данных на уровне сервера; автоматическая инвалидация кеша страниц по тегам при изменении данных в админке (webhook backend → revalidate API); уведомления о заказах и обращениях через email (SMTP) и Telegram.
- Деплой в Docker (отдельные образы frontend/backend), PostgreSQL как основное хранилище, Nginx как reverse proxy на VPS; отдельные Docker-режимы для локальной разработки и production-like проверки перед выкладкой.