Skip to main content

Общая структура

app/
├── bot.py              # Настройка бота, диспетчер, middleware
├── config.py           # Settings (pydantic-settings), загрузка из .env
├── handlers/           # Обработчики сообщений/callback
│   ├── admin/          # Админ-панель (30+ модулей)
│   ├── balance.py      # Обработчики пополнения баланса
│   ├── subscription/   # Покупка и управление подписками
│   └── ...
├── services/           # Бизнес-логика
│   └── payment/        # Адаптеры платёжных систем
├── external/           # Клиенты внешних API
├── database/
│   ├── models.py       # SQLAlchemy модели
│   ├── crud/           # CRUD операции
│   └── database.py     # Управление сессиями
├── webapi/             # FastAPI REST API (админка)
│   ├── routes/         # API эндпоинты
│   └── schemas/        # Pydantic схемы
├── middlewares/        # aiogram middleware
└── utils/              # Утилиты

Стек технологий

КомпонентТехнология
ЯзыкPython 3.13
Telegram фреймворкaiogram 3.x
ORMSQLAlchemy 2.x (async)
База данныхPostgreSQL
REST APIFastAPI
МиграцииAlembic
КэшированиеRedis (опционально)
Линтерruff

Ключевые паттерны

Регистрация обработчиков

Каждый модуль обработчиков экспортирует функцию register_handlers(router):
from aiogram import Router

def register_handlers(router: Router):
    router.callback_query.register(handler_func, SomeFilter())
Регистрация происходит в app/bot.py.

Сессии базы данных

Асинхронные контекстные менеджеры:
async with get_session() as session:
    result = await session.execute(select(User).where(...))

Конфигурация

Все настройки — через переменные окружения. Класс Settings в app/config.py загружает и валидирует их:
from app.config import settings

if settings.YOOKASSA_ENABLED:
    # ...

Платёжная система

Модульные адаптеры с единым интерфейсом. Каждый провайдер — отдельный файл в app/services/payment/.

Единый веб-сервер

FastAPI сервер на порту 8080 обслуживает:
ПутьНазначение
/webhookTelegram webhook
/yookassa-webhookYooKassa webhook
/cryptobot-webhookCryptoBot webhook
/api/*Cabinet API
/healthHealth check