Telegram-бот для выбора банковской карты с максимальным кэшбэком для выбранной категории покупки.
Разработан на Python 3.11+, aiogram 3.x и PostgreSQL.
- Динамические категории: загружаются администратором каждый месяц через JSON.
- Поиск лучшей карты: расчет суммы кэшбэка с учетом процента и суммы покупки.
- Админ-панель: управление картами и категориями прямо из бота.
- Транзакционная загрузка JSON: гарантирует целостность данных при импорте.
- Готовность к Production: Docker, systemd unit, логирование, глобальный обработчик ошибок.
- Python 3.11+
- PostgreSQL 15+
- Docker и Docker Compose (опционально, для запуска в контейнерах)
- Клонируйте репозиторий и перейдите в папку проекта.
- Создайте виртуальное окружение и установите зависимости:
python3.11 -m venv .venv source .venv/bin/activate pip install -r requirements.txt - Скопируйте файл конфигурации и заполните его:
cp .env.example .env # Отредактируйте .env, укажите BOT_TOKEN и данные для подключения к БД - Запустите бота (миграции БД применятся автоматически):
python -m app.main
- Убедитесь, что
.envфайл заполнен. - Запустите контейнеры:
docker-compose up -d --build
- Просмотр логов:
docker-compose logs -f bot
На сервере с другими проектами бот изолирован: свой пользователь ОС, каталог /opt/cashbackbot, отдельная БД PostgreSQL и свой systemd-сервис.
Пошаговая инструкция: deploy/README.md
Кратко:
- Подключиться по SSH к серверу.
- Установить Git, Python 3.11, PostgreSQL (если ещё нет).
- Создать БД и пользователя PostgreSQL для бота:
sudo DB_PASS='пароль' ./deploy/setup-db.sh - Клонировать репозиторий:
git clone https://github.com/apodobe/cashbackbot.git /opt/cashbackbot && cd /opt/cashbackbot - Создать
.envиз.env.example, указатьBOT_TOKENиDB_PASS. - Запустить деплой:
sudo ./deploy/deploy.sh - Выставить права на
.env:chown cashbackbot:cashbackbot .env && chmod 600 .env - Запустить сервис:
sudo systemctl start cashbackbot && sudo systemctl enable cashbackbot
После старта в Telegram отправьте боту /admin и загрузите JSON с картами и кэшбэком — иначе пользователи увидят сообщение об отсутствии данных.
Проект покрыт тестами более чем на 80%. Используется pytest с моками для базы данных (asyncpg).
# Установка dev-зависимостей
pip install -r requirements-dev.txt
# Запуск тестов с отчетом о покрытии
pytestАдминистратор может загрузить данные через команду /load_cashback. Пример формата:
{
"month": "2026-04",
"cards": [
{
"card_name": "Tinkoff Black",
"bank": "Tinkoff",
"owner": "Alexey",
"card_number": "1111222233334444",
"cashback": {
"restaurants": 5,
"hotels": 10
}
}
]
}Проект построен по слоистой архитектуре (Clean Architecture / Modular Monolith):
handlers/— обработка Telegram-событий (aiogram).services/— бизнес-логика (расчеты, обработка JSON).repositories/— работа с базой данных (SQL запросы через asyncpg).domain/— Pydantic схемы и DTO для типизации.