Tech Stack & Concepts 🛠️
Добро пожаловать в техническое сердце Gifty. На этой странице мы собрали ключевые технологии и концепции, на которых стоит наш проект. Это ваша карта местности: не обязательно знать все детали сразу, но важно понимать, почему мы выбрали именно эти инструменты и как они связаны друг с другом.
🏗 Инфраструктура (Foundation)
Наш фундамент — это контейнеризация и надежные базы данных.
🐳 Docker & Docker Compose
Зачем: "It works on my machine" — больше не аргумент.
Мы упаковываем всё в контейнеры. Весь проект (API, БД, Парсеры, Бот) поднимается одной командой docker-compose up -d.
Если вы добавили новую библиотеку в requirements.txt, не забудьте пересобрать образ (docker-compose build).
🐘 PostgreSQL + pgvector
Зачем: Это не просто хранилище данных, а наш поисковый движок.
Мы используем PostgreSQL 16+ с расширением pgvector. Это позволяет нам хранить эмбеддинги (векторные представления) товаров и искать подарки по смыслу, а не только по ключевым словам.
Важно: Все запросы к БД — асинхронные (
asyncpg).
🐰 RabbitMQ
Зачем: Асинхронная обработка тяжелых задач. Когда нужно спарсить 1000 товаров или отправить 500 уведомлений, мы не заставляем пользователя ждать. Мы кидаем задачу в очередь (RabbitMQ), а воркеры (отдельные процессы) разгребают её в фоне. Это делает API быстрым и отзывчивым.
👉 Архитектура парсинга и очередей
🔴 Redis
Зачем: Кэширование и временные данные. Здесь мы храним сессии пользователей, чтобы не дергать БД на каждый чих, и используем как брокер сообщений для Celery/TaskQueue в некоторых местах (или как быстрый кэш для часто запрашиваемых данных).
🐍 Бэкенд (Core)
Наш код написан на Python 3.11+, и мы используем современные асинхронные подходы.
⚡ FastAPI
Что это: Современный веб-фреймворк.
Почему: Он быстрый (Starlette), типизированный (Pydantic) и автоматически генерирует документацию (Swagger UI).
Мы любим его за Dependency Injection (Depends(...)) — это позволяет легко подменять компоненты (например, БД) в тестах.
🗃 SQLAlchemy 2.0 (Async)
Что это: ORM для работы с базой.
Важно: Мы используем стиль 2.0.
❌ Старый стиль (не используем): session.query(User).filter(...)
✅ Новый стиль (используем): await session.execute(select(User).where(...))
Это позволяет писать асинхронный код, который не блокирует сервер пока база думает.
📜 Pydantic V2
Что это: Валидация данных. Все входные и выходные данные описываются схемами. Это гарантирует, что если фронтенд прислал строку вместо числа, мы узнаем об этом сразу и с понятной ошибкой. V2 работает на Rust и очень быстр.
⚗️ Alembic
Что это: Миграции базы данных.
Правило крови: Никогда не меняйте структуру БД (таблицы, колонки) вручную через SQL. Всегда создавайте миграцию:
alembic revision --autogenerate -m "Added status column"
🧠 Предметная область и AI
То, что делает Gifty уникальным.
🎁 GUTG (Grand Unified Theory of Gifting)
Это наша внутренняя философия подбора подарков. Мы оцениваем товары не просто как "Кружка", а по 10 осям: Романтичность, Практичность, Кринж, Эстетика и т.д. Это позволяет давать рекомендации типа "Хочу что-то милое, но полезное" (High Aesthetic + High Utility).
🕷 Scrapy (Parsers)
Для сбора данных мы используем фреймворк Scrapy. У нас два режима работы парсеров:
- Discovery: Быстро пробежаться по каталогу и найти новые ссылки на товары.
- Deep: Зайти в конкретный товар и скачать всё: цену, фото, описание.
🛠 Инструменты разработки и мониторинга
📅 Weeek
Наш таск-трекер. Аналог Jira/Trello. Все задачи, баги и планы живут там. У нас есть интеграция: бот может присылать уведомления о новых задачах.
🦔 PostHog
Аналитика продуктов. Мы не гадаем, мы смотрим данные. Куда кликают пользователи? На каком шаге отваливаются? PostHog дает ответы.
🔭 Observability (Prometheus + Grafana + Loki)
- Prometheus: Собирает метрики (сколько запросов в секунду, сколько ошибок 500).
- Loki: Собирает логи. Если что-то упало, идем в Grafana искать трейсбэк.
- Sentry: Ловит ошибки в реальном времени и шлет алерты в Telegram.