Как я сделал интернет-магазин uaartist: от нуля до приёма оплаты
Лев Алексеев · обновлено 30 августа 2026
uaartist — интернет-магазин аксессуаров ручной работы на Django + DRF (бэкенд) и Next.js + TypeScript (фронтенд). Построен с нуля за июль 2026 года: от пустого репозитория до задеплоенного магазина с рабочим приёмом оплаты — за первую неделю.
О текущем статусе: технически проект готов и работает на проде, но коммерчески ещё не запущен — каталог пуст, оплата в тестовом режиме. Что осталось до открытия, перечислено в конце.
Таймлайн
Старт: инфраструктура и модель данных
Монорепозиторий, Django + DRF и Next.js + TypeScript в Docker Compose, версионированное API (/api/v1/). В тот же день — модель каталога: категории с вложенностью, товары с вариантами (размер/цвет как отдельные сущности с ценой и остатком).
Backend API и фронтенд-витрина
DRF-эндпоинты с фильтрацией и пагинацией, OpenAPI-схема — из неё генерируются TypeScript-типы для фронта, чтобы бэкенд и фронт не расходились по контракту. Next.js со страницами каталога, карточки товара, корзины и оформления на серверном рендере.
Оплата: ЮKassa, полный цикл
Приём платежей с чеком по 54-ФЗ, вебхук с перепроверкой статуса через API ЮKassa. В тот же день прогнан тестовый платёж тестовой картой — полный цикл до вебхука отработал с первого раза.
Продакшн-деплой и переезд с Vercel
Прод-конфигурация (gunicorn + nginx + HTTPS) и сразу — переезд витрины с Vercel на свою VM. Причина переезда: ТСПУ душит зарубежный хостинг для российских посетителей, часть пользователей получала страницу без стилей или вообще не получала её.
Конструктор косметичек — вторая попытка
Первая версия (перенос вёрстки старого лендинга «в лоб») не прижилась: превью там строилось на CSS-псевдоэлементах и точной структуре DOM, на новом стеке разметка не легла, а UX разваливался. Бэкенд к тому моменту был готов и протестирован — пересчёт цены под кастомную конфигурацию делает сервер, а не клиент. Переделал фронтенд-часть с нуля под новый макет, серверный прайсинг оставил как есть.
Аккаунты и остальное на продакшене
JWT-авторизация, гостевой заказ без обязательной регистрации, личный кабинет с историей заказов. На проде: автопродление HTTPS-сертификатов, ежедневные бэкапы базы и еженедельные — медиафайлов (включая копию во внешнем хранилище), 6 сценариев E2E-тестов на Playwright, мониторинг серверных ошибок с алертами в Telegram.
Технические решения
- Цена «замерзает» в заказе на момент покупки — не пересчитывается задним числом, если товар потом подорожает или изменится.
- Корзина клиентская (localStorage), но при оформлении сервер заново проверяет цены и остатки — клиенту в этом смысле не доверяют.
- Кастомная позиция из конструктора хранится в заказе как JSON-конфигурация, а не как искусственно заведённый «вариант товара» — комбинаций слишком много, чтобы заводить их все заранее.
- Гостевой заказ обязателен для MVP — обязательная регистрация перед покупкой режет конверсию.
Инфраструктура
- Cloud.ru VM: Docker-стек nginx + gunicorn (Django) + Next.js (standalone) + PostgreSQL, обновляется через docker compose up -d --build.
- HTTPS через Let's Encrypt с автопродлением по cron.
- Бэкапы: ежедневно база, еженедельно медиа — локально и зеркалом во внешнем хранилище.
- Playwright E2E — 6 сценариев на ключевые пользовательские пути (каталог → корзина → оформление и так далее).
- Мониторинг: серверные ошибки 5xx уходят в Telegram, чтобы узнавать о сбое сразу, а не по жалобам покупателей.
Что осталось до запуска
- Наполнить каталог — сейчас в нём 0 товаров, без этого коммерческий запуск не имеет смысла.
- Перевести ЮKassa из тестового режима в боевой — для этого нужен уже задеплоенный сайт с офертой, контактами и условиями доставки (частично встречная зависимость с пунктом ниже).
- Страницы оферты, доставки и возврата — ждут регистрационные реквизиты ИП.
Нужен похожий магазин?
Что входит, сроки и цена на разработку интернет-магазина на Django под ключ.