Кейс · Бэкенд · Python
catalog-api: API каталога с поиском
API каталога товаров на Python 3.12 и FastAPI: SQLite с полнотекстовым поиском FTS5 (ранжирование bm25), фасеты по категории, цене, наличию, тегам и характеристикам, курсорная пагинация, ETag, импорт и экспорт CSV, история цен, API-ключи с ролями и аудит-лог. Витрина и админка без фреймворка отдаются самим приложением. Пет-проект.
- Python
- FastAPI
- SQLite
- FTS5
- pytest
- ruff
- mypy
- bandit
- Docker
- GitHub Actions
01 · Как выглядит
Скриншоты


02 · О проекте
Что это и зачем
catalog-api — API каталога товаров на Python 3.12 и FastAPI с витриной и админкой, которые отдаёт само приложение. Пет-проект.
Хранилище SQLite: полнотекстовый поиск через FTS5 с ранжированием bm25, фасеты по категории, цене, наличию, тегам и характеристикам, пагинация курсором с подписью. Доступ по API-ключам с ролями admin, editor и reader: показывается один раз, в базе только хэш. Демо-режим SEED_DEMO=1 поднимает 300 синтетических товаров.
Ограничения
Живой версии нет: Cloudflare не запускает Python-сервер с SQLite. Запуск локально, в Docker или на своём VPS.
Лимитер запросов хранится в памяти процесса: при нескольких воркерах лимит умножается. SQLite рассчитан на один процесс записи. Нет морфологии русского языка и исправления опечаток.
Изображения не перекодируются, метаданные сохраняются как есть. Фасеты не дизъюнктивные; общее число считается точно на каждом запросе, на миллионах товаров это нужно заменять.
Демо-ключи публичны и работают только при SEED_DEMO=1. Не проверялись работа за реальным reverse proxy с TLS, браузеры кроме Chromium и скринридеры. Нагрузочный замер один, на одной машине.
Что внутри
- Поиск FTS5 с bm25, фасеты, сортировки и курсорная пагинация; ETag для условных запросов
- Импорт и экспорт CSV, история цен, загрузка изображений с проверкой сигнатуры и лимитов, аудит-лог
- API-ключи с ролями, лимитер запросов, строгие заголовки безопасности; OpenAPI в dev-режиме и выключен в production
- Витрина и админка без фреймворка, sitemap, robots, llms.txt и OG-теги
- 511 тестов, покрытие 96%; ruff, mypy --strict, bandit, pip-audit и gitleaks без замечаний
- Нагрузочный замер: 339 запросов/с, p95 50 мс при 8 соединениях (Windows, один процесс)
- Docker-образ на python:3.12-slim, пользователь uid 10001, HEALTHCHECK, штатное завершение по SIGTERM
03 · Как запустить
Запуск одной командой
git clone <репозиторий по запросу> catalog-api
cd catalog-api
python -m venv .venv && .venv/bin/pip install --require-hashes -r requirements.lock
SEED_DEMO=1 python -m app # http://127.0.0.1:8110, админка /admin04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.
Запросить код