Готовый к продакшену шаблон бота на Aiogram 3 с асинхронным стеком: SQLAlchemy 2 (async), Alembic, Redis FSM‑хранилище, Docker Compose (PostgreSQL, Redis, pgAdmin).
- Aiogram 3: роутеры, middlewares, FSM
- Redis: хранилище FSM (
RedisStorage) - PostgreSQL + SQLAlchemy 2 (async): работа с БД через
async_sessionmaker - Alembic: миграции БД
- Docker Compose:
postgres,redis,pgadmin,bot
- Скопируйте
.env.exampleв.envи заполните значения. - Запустите все сервисы в Docker:
docker compose up --build- Примените миграции БД (в отдельном терминале из корня проекта):
alembic upgrade head- Бот стартует как контейнер
botавтоматически. Для локального запуска без контейнера:
pip install -r requirements.txt
python -m app.mainИспользуйте шаблон ./.env.example: скопируйте его в .env и задайте необходимые значения.
Важно:
- В Docker‑сценарии
POSTGRES_HOSTиREDIS_HOSTдля контейнераbotпереопределяются наpostgresиredisсоответственно.
app/main.py: точка входа (инициализация логирования, созданиеBot,Dispatcher, пула сессий БД и запуск polling)app/factory/:bot.py:setup_bot— инициализация ботаdispatcher.py:setup_dispatcher— FSM‑хранилище в Redis, middlewares, роутерыrunners.py: хуки старта/остановки,run_pollingdb_session.py: создание пула сессий SQLAlchemy
app/bot/:handlers/:admin.py,user.py— хендлеры и роутерыfilters/: кастомные фильтры (например,AdminFilter)middlewares/innerиmiddlewares/outer: троттлинг, прокидывание сессии БДkeyboards/,lexicon/,states/: клавиатуры, тексты, FSM‑состояния
app/db/: фабрика пула, репозиторииapp/models/: декларативные модели SQLAlchemymigration/: Alembic (env настроен читать.env)
Для настройки логирования используется файл logging.yml в корне проекта. Функция setup_logging() из модуля app.logging загружает конфигурацию из этого файла перед созданием любых логгеров:
from app.logging import setup_logging
# Инициализация логирования
setup_logging()Если файл logging.yml не найден, выполняется logging.basicConfig с уровнем INFO по умолчанию.
Конфигурация logging.yml включает:
- консольный обработчик;
- ротацию лог-файла
logs/app.log(10 МБ, 3 резервных копии); - формат сообщений:
%(asctime)s - %(name)s - %(levelname)s - %(message)s.
Убедитесь, что каталог logs существует и доступен для записи.
- Сгенерировать новую миграцию:
alembic revision --autogenerate -m "init"- Применить миграции:
alembic upgrade head- Откатить:
alembic downgrade -1Убедитесь, что .env доступен процессу, запускающему Alembic (в migration/env.py dsn собирается из переменных).
- Полный стек в Docker:
docker compose up --build- Только инфраструктура (БД, Redis, pgAdmin), а бот локально:
docker compose up -d postgres redis pgadmin
pip install -r requirements.txt
python -m app.main-
Линтинг (Ruff):
ruff check . ruff check . --fix # автоисправление
-
Форматирование (Ruff Format):
ruff format . -
Проверка типов (MyPy):
mypy app config
-
Тесты (pytest) с покрытием:
pytest -q # запуск тестов pytest --cov --cov-report=term-missing # отчёт покрытия в терминале pytest --cov --cov-report=html # html-отчёт в ./htmlcov
-
Pre-commit хуки:
pip install -r requirements-dev.txt pre-commit install # установить git-хуки pre-commit run --all-files # прогнать на всём репозитории
В pre-commit включены: базовые проверки, Ruff (линт и формат), MyPy. Конфигурации берутся из
pyproject.toml. -
Валидация commit message (Conventional Commits):
- Сообщения коммитов должны соответствовать формату Conventional Commits (например:
feat: add login,fix(auth): refresh token). - Хук
commit-msgпроверяет это автоматически приgit commit. - Удобно создавать сообщения через мастер:
cz commit
- Примеры валидных сообщений:
feat: add user profilefix(db): handle reconnectrefactor(core): simplify config loaderchore: bump dependencies
- Сообщения коммитов должны соответствовать формату Conventional Commits (например:
- Конфигурация:
config/config.py - Инициализация бота:
app/factory/bot.py - Диспетчер, FSM и middlewares:
app/factory/dispatcher.py - Хуки старта/остановки:
app/factory/runners.py - Точка входа:
app/main.py
- «BOT_TOKEN must not be empty»: проверьте
BOT_TOKENв.env. - Ошибки подключения к Redis: проверьте
REDIS_HOST,REDIS_PORT,REDIS_PASSWORD; в Docker пароль обязателен (см.docker-compose.yml). - Alembic не видит БД: убедитесь, что
POSTGRES_*заданы и контейнерpostgresв состоянии healthy.