Telegram Bot Development Guide 🛠
Руководство по локальной разработке и отладке Telegram-бота Gifty.
🚀 Локальная разработка
Есть два способа запустить бота локально:
Вариант A: Через Docker Compose (рекомендуется для полной среды)
Если вы хотите запустить весь стек (API, БД, RabbitMQ, бот) одной командой:
Бот запустится автоматически в контейнере telegram-bot вместе с остальными сервисами.
Плюсы:
- ✅ Полная изоляция, не нужно настраивать Python окружение
- ✅ Все зависимости (RabbitMQ, Redis, Postgres) поднимаются автоматически
- ✅ Соответствует продакшн-окружению
Минусы:
- ❌ Медленная итерация (нужно пересобирать образ при изменении кода)
- ❌ Сложнее дебажить (нет прямого доступа к debugger)
Вариант B: Нативно через Python (для быстрой разработки)
Если вы активно меняете код бота и хотите видеть изменения мгновенно:
-
Поднимите только инфраструктуру (БД, Redis, RabbitMQ):
-
Создайте тестового бота через
@BotFather(чтобы не конфликтовать с продом). -
Настройте
.envдля локального запуска: -
Запустите бота нативно:
Плюсы:
- ✅ Мгновенный перезапуск при изменении кода
- ✅ Можно использовать debugger (PyCharm, VS Code)
- ✅ Видны все print-логи в реальном времени
Минусы:
- ❌ Нужно вручную настраивать Python окружение
- ❌ Может отличаться от продакшн-окружения
Конфликт поллинга
Никогда не запускайте локального бота с продовым токеном, если прод уже работает. Telegram будет слать апдейты то одному, то другому, и поведение будет непредсказуемым.
Рекомендация
- Для первого запуска и тестирования интеграций → используйте Docker Compose.
- Для активной разработки (добавление новых команд, FSM) → используйте нативный Python.
⚛️ Frontend (Mini App Dashboard)
В папке services/telegram_bot/dashboard находится React-приложение (Vite), которое открывается внутри Telegram Web App.
Стек: React 18, Vite, TailwindCSS (если есть), Telegram WebApp SDK.
Запуск для разработки:
Приложение будет доступно по адресуhttp://localhost:5173.
Чтобы проверить его в Telegram, вам понадобится https туннель (например, ngrok), так как Telegram WebApp требует HTTPS.
Сборка:
Собранные файлы (dist/) должны раздаваться FastAPI или Nginx. Бот ожидает, что статика доступна по URL, который указан в WEBAPP_URL.
Настройка ngrok для локальной разработки Mini App
Зачем нужен ngrok?
Telegram Web App работает только по HTTPS. Когда вы разрабатываете Mini App локально (localhost:5173), Telegram не может открыть его, потому что:
localhostнедоступен извне (только на вашей машине)- Нет SSL-сертификата (требуется
https://)
ngrok создает публичный HTTPS-туннель к вашему локальному серверу, решая обе проблемы.
Установка ngrok
macOS (Homebrew):
Linux/Windows: Скачайте с ngrok.com/download и добавьте в PATH.
Использование
-
Запустите Mini App локально:
-
Создайте туннель:
-
Скопируйте HTTPS URL из вывода ngrok:
-
Обновите переменную окружения в
.env:Бот автоматически использует эту переменную при создании кнопки Mini App:
-
Перезапустите бота и проверьте кнопку в Telegram.
Ограничения бесплатной версии ngrok
- URL меняется при каждом перезапуске (например,
abc123.ngrok.io→xyz789.ngrok.io) - Есть лимит на количество подключений в минуту
- Для постоянного URL нужен платный аккаунт или альтернативы (localtunnel, serveo)
Альтернативы ngrok
- localtunnel:
npx localtunnel --port 5173 - Cloudflare Tunnel: Бесплатный, без лимитов, но сложнее в настройке
🌍 Локализация (i18n)
Все тексты бота хранятся в файле services/telegram_bot/app/strings.py в словаре STRINGS.
Структура:
Как добавить новый текст:
1. Придумайте уникальный ключ (например, error_database).
2. Добавьте его в оба словаря (ru и en).
3. В коде используйте функцию-хелпер t():
Форматирование
Используйте {variable} для подстановки значений. Aiogram по умолчанию использует Markdown или HTML (зависит от настроек), убедитесь, что спецсимволы экранированы, если вставляете пользовательский ввод.
🐛 Отладка
Логирование
Бот использует стандартный модуль logging. Уровень логирования настраивается в main.py:
Для детальной отладки измените на logging.DEBUG.
Типичные проблемы
1. Бот не отвечает на команды
- Проверьте, что токен правильный:
echo $TELEGRAM_BOT_TOKEN - Убедитесь, что нет другого экземпляра бота с тем же токеном
- Проверьте логи:
docker compose logs telegram-bot
2. Ошибка подключения к RabbitMQ
- Убедитесь, что RabbitMQ запущен:
docker compose ps rabbitmq - Проверьте URL: должен быть
amqp://guest:guest@localhost:5672/для локального запуска
3. Internal API недоступен
- Проверьте, что Core API запущен:
curl http://localhost:8000/health - Убедитесь, что
INTERNAL_API_TOKENсовпадает в.envбота и API