Maxton
Полноценная e-commerce платформа: асинхронный бэкенд на FastAPI, PostgreSQL, витрина с серверным рендерингом и админ-панель. Оплата через Stripe и складской учёт, из которого остатки не утекают незаметно. Это личный проект, а не запущенный магазин.
- Год
- 2026
- Направление
- Бэкенд
- Экраны
- 4
Обзор
Большинство учебных e-commerce проектов заканчиваются списком товаров и корзиной. В Maxton собрана вся форма магазина: путь, по которому реально идёт покупатель (каталог, корзина, оплата, заказы, список желаний, отзывы, сохранённые адреса), и админ-панель на той же кодовой базе и той же базе данных, через которую владелец ведёт бизнес.
Бэкенд разложен по слоям так же, как я строю всё остальное: роутеры занимаются только HTTP, сервисы держат бизнес-правила, репозитории владеют запросами, модели описывают схему. Запросы и ответы типизированы через Pydantic, база это асинхронный SQLAlchemy 2 поверх asyncpg, и каждый запрос несёт свой идентификатор через структурированные JSON-логи, поэтому сбой действительно можно проследить.
Больше всего размышлений потребовал промежуток между «добавить в корзину» и «оплачено». Заказ, ожидающий оплаты, должен удерживать остаток, иначе последний товар купят двое. Но удерживать бесконечно тоже нельзя, иначе брошенная корзина тихо снимает товар с продажи. Поэтому резервирование привязано к состоянию заказа, а фоновая задача закрывает неоплаченные заказы и возвращает ровно то, что они удерживали.
Платежи идут через Stripe Checkout, вызываемый напрямую по httpx, а не через SDK, с webhook-эндпоинтом для подтверждения. Аутентификация построена на сессиях: bcrypt-хеши паролей, httpOnly cookie и токены сброса пароля, которые хранятся в виде SHA-256, поэтому в базе никогда не лежит токен, пригодный сам по себе.
Проект запускается локально и в Docker, а тесты идут через pytest против настоящего PostgreSQL. О статусе честно: это личная сборка, на которой я прорабатываю архитектуру, а не живой магазин с покупателями.
Ключевые моменты
Витрина и админка
Каталог, корзина, оплата через Stripe, список желаний, отзывы и адреса для покупателя; аналитика и управление для владельца.
Слои по умолчанию
Цепочка роутер, сервис, репозиторий, модель, типизированная от начала до конца через Pydantic и асинхронный SQLAlchemy 2.
Остатки, которые не утекают
Резервирование привязано к состоянию заказа, а фоновая задача закрывает неоплаченные заказы и возвращает удержанное.
Платежи без SDK
Stripe Checkout управляется напрямую через httpx, подтверждение приходит на webhook-эндпоинт.
Безопасно хранимые токены
bcrypt-хеши паролей, httpOnly сессионные cookie и токены сброса, которые хранятся только как SHA-256.
Прозрачно в продакшене
Структурированное JSON-логирование с идентификатором, привязанным к каждому запросу.
Стек