12 KiB
Telegram Bot API
FastAPI приложение для взаимодействия с Telegram ботом и базой данных PostgreSQL через SQLAlchemy.
Структура проекта
bot-telegram/
├── api/ # FastAPI приложение
│ ├── __init__.py
│ ├── main.py # Основное приложение
│ ├── routers.py # API маршруты
│ ├── schemas.py # Pydantic схемы
│ └── config.py # Конфигурация
├── database/ # Модули базы данных
│ ├── __init__.py
│ ├── database.py # Подключение к БД
│ ├── models.py # SQLAlchemy модели
│ └── ...
├── pyproject.toml # Зависимости проекта
├── .env.example # Пример переменных окружения
└── README.md
Установка и настройка
Способ 1: Запуск через Docker (рекомендуется)
1. Запуск с Docker Compose
# Клонируйте репозиторий и перейдите в директорию
cd bot-telegram
# Запустите все сервисы (API + PostgreSQL)
docker-compose up -d
# Для просмотра логов
docker-compose logs -f api
# Остановка сервисов
docker-compose down
2. Запуск с pgAdmin (опционально)
# Запуск с админкой для базы данных
docker-compose --profile admin up -d
# pgAdmin будет доступен по адресу: http://localhost:5050
# Email: admin@admin.com
# Password: admin
3. Сборка только API контейнера
# Сборка образа
docker build -t telegram-bot-api .
# Запуск контейнера (требует запущенный PostgreSQL)
docker run -d \
--name telegram-bot-api \
-p 8000:8000 \
-e DB_HOST=host.docker.internal \
-e DB_PASSWORD=your_password \
telegram-bot-api
Способ 2: Локальная установка
1. Установка зависимостей
# Используя uv (рекомендуется)
uv sync
# Или используя pip
pip install -e .
2. Настройка базы данных
- Создайте файл
.envна основе.env.example:
cp .env.example .env
- Отредактируйте
.envфайл с вашими настройками PostgreSQL:
DB_USER=postgres
DB_PASSWORD=your_password
DB_HOST=localhost
DB_PORT=5432
DB_NAME=telegram_bot
- Убедитесь, что PostgreSQL запущен и база данных создана:
CREATE DATABASE telegram_bot;
3. Запуск API
# Из корневой директории проекта
python run_api.py
# Или с помощью uvicorn напрямую
uvicorn api.main:app --host 0.0.0.0 --port 8000 --reload
API будет доступно по адресу: http://localhost:8000
API Endpoints
Общие endpoints
GET /- Корневая информацияGET /health- Проверка состояния приложенияGET /docs- Swagger UI документация (автоматически)GET /redoc- ReDoc документация (автоматически)
Пользователи (/api/v1/users)
GET /api/v1/users/- Получить всех пользователейGET /api/v1/users/{telegram_id}- Получить пользователя по Telegram IDPOST /api/v1/users/- Создать нового пользователяPUT /api/v1/users/{telegram_id}- Обновить пользователяDELETE /api/v1/users/{telegram_id}- Деактивировать пользователя
Сообщения (/api/v1/messages)
GET /api/v1/messages/- Получить сообщения с фильтрациейGET /api/v1/messages/{message_id}- Получить конкретное сообщениеPOST /api/v1/messages/- Создать новое сообщение
Настройки бота (/api/v1/settings)
GET /api/v1/settings/- Получить все настройки как словарьGET /api/v1/settings/list- Получить все настройки как список объектовGET /api/v1/settings/{key}- Получить настройку по ключуPOST /api/v1/settings/- Создать или обновить настройкуPUT /api/v1/settings/{key}- Обновить существующую настройкуDELETE /api/v1/settings/{key}- Удалить настройку
Примеры использования
Создание пользователя
curl -X POST "http://localhost:8000/api/v1/users/" \
-H "Content-Type: application/json" \
-d '{
"telegram_id": 123456789,
"username": "john_doe",
"first_name": "John",
"last_name": "Doe",
"language_code": "en"
}'
Создание сообщения
curl -X POST "http://localhost:8000/api/v1/messages/" \
-H "Content-Type: application/json" \
-d '{
"telegram_message_id": 12345,
"user_id": 1,
"text": "Привет!",
"message_type": "text"
}'
Настройка бота
curl -X POST "http://localhost:8000/api/v1/settings/" \
-H "Content-Type: application/json" \
-d '{
"key": "welcome_message",
"value": "Добро пожаловать в наш бот!",
"description": "Приветственное сообщение для новых пользователей"
}'
Модели данных
User (Пользователь)
id- Внутренний IDtelegram_id- Telegram ID пользователя (уникальный)username- Username в Telegramfirst_name- Имяlast_name- Фамилияlanguage_code- Код языка (по умолчанию 'ru')is_active- Активен ли пользовательis_admin- Является ли администраторомcreated_at- Дата созданияupdated_at- Дата обновления
Message (Сообщение)
id- Внутренний IDtelegram_message_id- ID сообщения в Telegramuser_id- ID пользователя (внешний ключ)text- Текст сообщенияmessage_type- Тип сообщения (text, photo, document, etc.)created_at- Дата создания
BotSettings (Настройки бота)
id- Внутренний IDkey- Ключ настройки (уникальный)value- Значение настройкиdescription- Описание настройкиcreated_at- Дата созданияupdated_at- Дата обновления
Переменные окружения
| Переменная | Описание | По умолчанию |
|---|---|---|
DB_USER |
Пользователь PostgreSQL | postgres |
DB_PASSWORD |
Пароль PostgreSQL | password |
DB_HOST |
Хост PostgreSQL | localhost |
DB_PORT |
Порт PostgreSQL | 5432 |
DB_NAME |
Имя базы данных | telegram_bot |
API_HOST |
Хост API сервера | 0.0.0.0 |
API_PORT |
Порт API сервера | 8000 |
API_RELOAD |
Автоперезагрузка в dev режиме | true |
LOG_LEVEL |
Уровень логирования | INFO |
Разработка
Структура API
API организовано по модульному принципу:
main.py- Основное приложение FastAPIrouters.py- Определения маршрутов и бизнес-логикаschemas.py- Pydantic схемы для валидации данныхconfig.py- Конфигурация приложения
Документация
FastAPI автоматически генерирует интерактивную документацию:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Логирование
Приложение использует стандартный модуль logging Python. Уровень логирования можно настроить через переменную окружения LOG_LEVEL.
Интеграция с Telegram ботом
Этот API предназначен для использования Telegram ботом. Бот может:
- Регистрировать новых пользователей при первом взаимодействии
- Сохранять все входящие сообщения
- Получать и обновлять настройки бота
- Управлять пользователями (активация/деактивация, права администратора)
Пример интеграции с aiogram или python-telegram-bot будет добавлен позже.
Docker контейнеризация
Структура Docker файлов
Dockerfile- Многоступенчатая сборка для оптимизации размера образаdocker-compose.yml- Оркестрация API + PostgreSQL + pgAdmin.dockerignore- Исключение ненужных файлов из контекста сборкиinit.sql- Скрипт инициализации базы данных
Docker Compose сервисы
-
postgres- PostgreSQL 15 база данных (отдельный контейнер)- Порт: 5432
- Данные сохраняются в Docker volume
- Автоматическая проверка готовности
-
app- Единое приложение (API + database логика в одном контейнере)- Порт: 8000
- Включает FastAPI сервер и все модули для работы с БД
- Подключается к внешней PostgreSQL по сети
- Автоматически ждет готовности БД
-
pgadmin- Веб-админка PostgreSQL (опционально)- Порт: 5050
- Запускается только с профилем
admin
Команды Docker
# Сборка и запуск всех сервисов
docker-compose up --build -d
# Просмотр логов конкретного сервиса
docker-compose logs -f api
docker-compose logs -f postgres
# Перезапуск сервиса
docker-compose restart api
# Остановка и удаление контейнеров
docker-compose down
# Остановка с удалением volumes (ВНИМАНИЕ: удаляет данные БД)
docker-compose down -v
# Запуск только определенного сервиса
docker-compose up postgres -d
# Выполнение команд внутри контейнера
docker-compose exec api bash
docker-compose exec postgres psql -U postgres -d telegram_bot
Переменные окружения в Docker
В docker-compose.yml настроены следующие переменные:
environment:
# База данных
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: telegram_bot
DB_USER: postgres
DB_PASSWORD: password
# API
API_HOST: 0.0.0.0
API_PORT: 8000
API_RELOAD: "false"
LOG_LEVEL: INFO
Volumes и сети
- Volume
postgres_data- Постоянное хранение данных PostgreSQL - Network
bot_network- Изолированная сеть для взаимодействия сервисов
Производственное развертывание
Для продакшена рекомендуется:
- Изменить пароли по умолчанию
- Настроить внешние тома для данных
- Использовать reverse proxy (nginx)
- Настроить SSL сертификаты
- Ограничить CORS origins
# Пример для продакшена
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d