Production-ready шаблон FastAPI микросервиса с Clean Architecture, async поддержкой и современным инструментарием.
Шаблон для быстрого создания новых FastAPI микросервисов. Включает предустановленную архитектуру, инфраструктуру (БД, кеш, NATS, логирование) и best practices. Готов к использованию как основа для новых сервисов.
- Быстрый старт — создание нового сервиса за минуты
- Единообразие — все сервисы следуют одной архитектуре
- Production-ready — DI, логирование, мониторинг, тесты из коробки
- Масштабируемость — Clean Architecture для легкого расширения
Clean Architecture с четким разделением слоев:
app/
├── domain/ # Бизнес-логика, модели, интерфейсы (независимый слой)
├── application/ # Use cases и сервисы приложения
├── infrastructure/ # Реализации (БД, кеш, NATS, внешние API)
└── interfaces/ # API endpoints (FastAPI routes)
Принципы:
- Domain не зависит от других слоев
- Application зависит только от Domain
- Infrastructure реализует интерфейсы из Domain
- Interfaces зависит от всех слоев
- FastAPI — веб-фреймворк
- SQLAlchemy 2.0+ (async) — ORM для PostgreSQL
- PostgreSQL — основная БД
- Redis — кеширование
- NATS JetStream — межсервисное взаимодействие (pub/sub)
- APScheduler — планировщик задач
- Dependency Injection —
dependency-injector - Python 3.14+ — современные возможности языка
- Python 3.14+
- uv
- Docker & docker-compose
# Клонировать и перейти в директорию
git clone <repository-url>
cd fastapi_template
# Установить зависимости
uv sync
# Запустить все сервисы
make upСервис доступен на http://localhost:8001
fastapi_template/
├── app/
│ ├── domain/ # Доменный слой
│ │ ├── models/ # Pydantic модели
│ │ ├── interfaces/ # Абстрактные интерфейсы
│ │ └── exceptions.py # Доменные исключения
│ ├── application/ # Слой приложения
│ │ └── services/ # Бизнес-логика
│ ├── infrastructure/ # Инфраструктурный слой
│ │ ├── persistence/ # SQLAlchemy, репозитории
│ │ ├── cache/ # Redis клиент
│ │ └── messaging/ # NATS consumer/publisher
│ ├── interfaces/ # Слой представления
│ │ └── api/ # FastAPI routes, schemas
│ └── core/ # Ядро приложения
│ ├── config/ # Настройки (Pydantic Settings)
│ ├── di/ # Dependency Injection
│ └── logging.py # Логирование
├── migrations/ # Alembic миграции
├── tests/ # Тесты
├── docker-compose.yml # Локальная разработка
└── Makefile # Автоматизация задач
- Consumer: batch processing, параллельная обработка, graceful shutdown
- Publisher: автоматическое создание stream, retry, переподключение
- Async SQLAlchemy 2.0+, Alembic миграции, Repository pattern
- Redis с async поддержкой, интерфейс для замены реализации
- APScheduler с поддержкой распределенной координации (Redis/PostgreSQL locks)
Настройки через переменные окружения с префиксами:
APP_*,DB_*,REDIS_*,NATS_*,SENTRY_*,CORS_*
См. .env.example для полного списка.
# Форматирование кода
make format
# Проверка типов
make type-check
# Линтинг
make lint
# Тесты
make test
# Запуск локально
make up # Запустить все сервисы
make down # Остановить
make logs # ЛогиGET /api/v1/health— health checkPOST /api/v1/service/request— пример обработки запросаPOST /api/v1/nats/publish— тестовый эндпоинт для NATS
- Unit тесты:
pytest tests/ - Coverage:
make test(результаты вhtmlcov/) - NATS тесты:
tests/test_nats_consumer.py,tests/test_nats_publisher.py
- API документация:
http://localhost:8001/docs(Swagger) - Альтернативная:
http://localhost:8001/redoc - Метрики:
http://localhost:8001/metrics(Prometheus)
# Из корня проекта
cp -r fastapi_template be/services/new-service-name
cd be/services/new-service-nameОбновить pyproject.toml:
[project]
name = "new-service-name"
description = "Описание вашего сервиса"Обновить docker-compose.yml:
- Изменить имена сервисов (например,
template_app→new_service_app) - Обновить порты при необходимости
- Обновить имена сетей и volumes
Application services:
- Заменить
app/application/services/service.pyна свою бизнес-логику - Обновить интерфейсы в
app/domain/interfaces/services/
API routes:
- Заменить примеры в
app/interfaces/api/routes/service.py - Обновить или удалить
app/interfaces/api/routes/nats.py(тестовый эндпоинт) - Обновить роутер в
app/interfaces/api/routes/router.py
Domain models:
- Заменить
app/domain/models/request.pyна свои модели - Обновить репозитории в
app/infrastructure/persistence/
# Удалить существующие миграции
rm -rf migrations/versions/*
# Создать первую миграцию для вашей схемы
make migrations-create MSG="initial schema"Обновить SQLAlchemy модели:
- Заменить
app/infrastructure/persistence/models/request.py - Обновить репозитории под новые модели
Обновить настройки в app/core/config/nats.py:
subject: str = "your-service.>" # Ваш subject pattern
stream_name: str = "your-service" # Имя stream
consumer_durable: str = "your-service-consumer" # Имя consumerЗаменить message handler:
- Создать свой handler в
app/infrastructure/messaging/message_handler.py - Или создать новый класс, реализующий
IMessageHandler - Обновить DI контейнер в
app/core/di/containers.py
Обновить wiring в DI:
- Добавить новые модули в
wiring_configвcontainers.py
# Удалить тестовые файлы (если не нужны)
rm -rf tests/test_nats_*.py # или обновить под свои тесты
# Обновить зависимости
make deps-update
# Проверить код
make validate
make test- Обновить
README.mdс описанием вашего сервиса - Обновить
.env.exampleс нужными переменными
[Указать лицензию]