Production-like микросервисная платформа для бронирования билетов на мероприятия.
Система позволяет пользователям регистрироваться, просматривать каталог мероприятий, бронировать билеты и получать PDF-подтверждения на email. Администраторы управляют мероприятиями через защищённый API.
| Функция | Описание |
|---|---|
| Аутентификация | Регистрация, логин, JWT (RS256), refresh-токены с отзывом |
| Каталог мероприятий | CRUD операций, пагинация, фильтрация |
| Бронирование | Создание и отмена бронирований, защита от double-booking |
| Email-уведомления | Асинхронная отправка писем с PDF-билетами |
| Мониторинг | Prometheus + Grafana, алерты, health-checks |
┌──────────────┐
│ Ingress │
│ (NGINX/TLS) │
└──────┬───────┘
│
┌───────────────┼───────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Auth │ │ Event │ │ Booking │
│ Service │ │ Service │ │ Service │
│ :8002 │ │ :8001 │ │ :8003 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
┌────▼────┐ ┌────▼────┐ ┌─────▼──────┐
│PostgreSQL│ │PostgreSQL│ │ PostgreSQL │
│ auth │ │ event │ │ booking │
└─────────┘ └─────────┘ └─────┬──────┘
│
┌──────▼──────┐
│ RabbitMQ │
└──────┬──────┘
│
┌──────▼──────────┐
│ Notification │
│ Worker │
│ (Celery) │
└──────┬──────────┘
│
┌──────▼──────┐
│ SMTP │
└─────────────┘
| Компонент | Технология |
|---|---|
| Язык | Python 3.12 |
| Фреймворк | FastAPI + Uvicorn |
| ORM | SQLAlchemy 2.0 (async) |
| Миграции | Alembic |
| JWT | python-jose (RS256) |
| Пароли | Argon2 |
| Очереди | Celery + RabbitMQ |
| БД | PostgreSQL 16 |
| Контейнеризация | Docker (multi-stage) |
| Оркестрация | Docker Compose / Kubernetes |
| Мониторинг | Prometheus + Grafana + cAdvisor |
├── services/
│ ├── auth_service/ # Аутентификация и авторизация
│ ├── event_service/ # Управление мероприятиями
│ ├── booking_service/ # Бронирование билетов
│ └── notification_service/ # Celery worker для email-уведомлений
├── frontend/ # Web UI для ручной проверки сценариев через браузер
├── deploy/
│ ├── k8s/ # Kubernetes манифесты
│ └── nginx/ # NGINX конфигурация
├── monitoring/
│ ├── prometheus/ # Prometheus конфигурация и алерты
│ └── grafana/ # Grafana provisioning
├── scripts/ # Вспомогательные скрипты
├── secrets/ # JWT ключи (не коммитить!)
├── docker-compose.yml
├── docker-compose.frontend.yml
├── docker-compose.monitoring.yml
└── .env.example
- Docker + Docker Compose plugin
- OpenSSL (для генерации JWT-ключей)
git clone <repository-url>
cd booking_ticketscp .env.example .env
# Отредактируйте .env — укажите пароли для PostgreSQL, RabbitMQ, SMTPmkdir -p secrets/jwt
openssl genpkey -algorithm RSA -out secrets/jwt/private.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -pubout -in secrets/jwt/private.pem -out secrets/jwt/public.pem
chmod 600 secrets/jwt/private.pem
chmod 644 secrets/jwt/public.pemdocker compose up -d --builddocker exec booking_auth_service alembic upgrade head
docker exec booking_event_service alembic upgrade head
docker exec booking_booking_service alembic upgrade head# Регистрация пользователя
curl -X POST http://127.0.0.1:8002/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"StrongPass123!"}'
# Выдача роли admin
docker exec booking_postgres_auth psql -U auth_user -d auth_db \
-c "UPDATE auth.users SET role='admin' WHERE email='admin@example.com';"curl http://127.0.0.1:8001/health
curl http://127.0.0.1:8002/health
curl http://127.0.0.1:8003/healthSwagger-документация доступна по адресам:
| Сервис | URL |
|---|---|
| Auth | http://127.0.0.1:8002/docs |
| Events | http://127.0.0.1:8001/docs |
| Bookings | http://127.0.0.1:8003/docs |
В проекте есть отдельный web-интерфейс для ручной проверки основных сценариев:
- регистрация и логин
- refresh / logout
- просмотр событий
adminCRUD для мероприятий- создание и отмена бронирований
- health-check по API сервисам
Frontend вынесен в отдельный compose-файл, чтобы его можно было поднимать независимо от backend и не ловить конфликты пересоздания контейнеров.
Сначала должен быть поднят основной backend:
docker compose up -dЗатем отдельно запускается frontend:
docker compose -f docker-compose.frontend.yml up -dОткрыть интерфейс можно по адресу:
https://127.0.0.1:3443
Локально используется self-signed сертификат, поэтому браузер покажет предупреждение безопасности.
docker compose -f docker-compose.frontend.yml build
docker compose -f docker-compose.frontend.yml up -ddocker compose -f docker-compose.frontend.yml downВажно:
- frontend не поднимает backend-сервисы сам, он подключается к уже существующей Docker-сети
booking_tickets_booking_network - если backend уже запущен, для интерфейса достаточно только
docker compose -f docker-compose.frontend.yml up -d - если API контейнеры остановлены, интерфейс откроется, но запросы к сервисам работать не будут
| Метод | Путь | Описание |
|---|---|---|
POST |
/api/v1/auth/register |
Регистрация |
POST |
/api/v1/auth/login |
Логин (возвращает access + refresh) |
POST |
/api/v1/auth/refresh |
Обновление access-токена |
POST |
/api/v1/auth/logout |
Выход (отзыв refresh-токена) |
| Метод | Путь | Описание | Auth |
|---|---|---|---|
POST |
/api/v1/events/ |
Создать мероприятие | admin |
GET |
/api/v1/events/ |
Список мероприятий | — |
GET |
/api/v1/events/{id} |
Детали мероприятия | — |
PATCH |
/api/v1/events/{id} |
Обновить мероприятие | admin |
DELETE |
/api/v1/events/{id} |
Удалить мероприятие | admin |
| Метод | Путь | Описание | Auth |
|---|---|---|---|
POST |
/api/v1/bookings/ |
Забронировать билет | user |
GET |
/api/v1/bookings/my |
Мои бронирования | user |
GET |
/api/v1/bookings/{id} |
Детали бронирования | user |
POST |
/api/v1/bookings/{id}/cancel |
Отменить бронирование | user |
- JWT (RS256) — приватный ключ только в
auth_service, публичный — в остальных сервисах - Refresh-токены хранятся в БД и могут быть отозваны
- Rate limiting на логин — защита от brute-force (5 попыток / 5 мин, бан на 15 мин)
- Role-based access control — изменение мероприятий только для
admin - SELECT FOR UPDATE — защита от race condition при бронировании
- Non-root контейнеры — все сервисы запускаются от непривилегированного пользователя
- Network Policies (K8s) — zero-trust модель с явными правилами доступа между сервисами
docker compose -f docker-compose.monitoring.yml up -d| Компонент | URL | Логин / Пароль |
|---|---|---|
| Prometheus | http://localhost:9090 | — |
| Grafana | http://localhost:3000 | admin / admin |
| cAdvisor | http://localhost:8080 | — |
| RabbitMQ UI | http://localhost:15672 | guest / guest |
При запуске мониторинга Grafana автоматически загружает 5 дашбордов:
| Дашборд | Описание |
|---|---|
| API Services Overview | RPS, error rate, latency (p50/p95/p99), статус-коды, uptime всех API сервисов |
| PostgreSQL Overview | Активные соединения, использование connections (%), размер БД, транзакции, deadlocks |
| Container Resources (cAdvisor) | CPU, RAM, сетевой I/O, использование диска контейнерами |
| RabbitMQ Overview | Публикации, ack/delivery, глубина очередей, подключения, unacked messages |
| Business Metrics | Кастомные бизнес-метрики: регистрации, логины, бронирования, проданные билеты, email-уведомления |
| Метрика | Тип | Labels | Описание |
|---|---|---|---|
auth_login_attempts_total |
Counter | status (success/failure/rate_limited) |
Попытки входа |
auth_registrations_total |
Counter | status (success/duplicate) |
Регистрации |
auth_token_refreshes_total |
Counter | status (success/revoked/invalid) |
Обновления refresh-токенов |
auth_logouts_total |
Counter | status (success/not_found) |
Выходы из системы |
auth_active_sessions |
Gauge | — | Текущие активные сессии |
| Метрика | Тип | Labels | Описание |
|---|---|---|---|
bookings_created_total |
Counter | status (success/failed) |
Созданные бронирования |
bookings_cancelled_total |
Counter | status (success/not_found) |
Отменённые бронирования |
bookings_retrieved_total |
Counter | — | Запросы на получение бронирований |
tickets_sold_per_event |
Gauge | event_id |
Проданные билеты по мероприятиям |
tickets_available_per_event |
Gauge | event_id |
Доступные билеты по мероприятиям |
| Метрика | Тип | Labels | Описание |
|---|---|---|---|
events_created_total |
Counter | — | Созданные мероприятия |
events_updated_total |
Counter | — | Обновлённые мероприятия |
events_deleted_total |
Counter | — | Удалённые мероприятия |
total_events |
Gauge | — | Общее количество мероприятий в системе |
| Метрика | Тип | Labels | Описание |
|---|---|---|---|
emails_sent_total |
Counter | status (success/failed) |
Отправленные письма |
emails_retry_total |
Counter | — | Повторные попытки отправки |
pdf_generated_total |
Counter | status (success/failed) |
Сгенерированные PDF-билеты |
| Алерт | Уровень | Условие |
|---|---|---|
ServiceDown |
🔴 Critical | Сервис недоступен > 1 мин |
HighErrorRate |
🟡 Warning | > 5% 5xx за 5 мин |
SlowResponses |
🟡 Warning | p95 latency > 1с за 5 мин |
PostgresHighConnections |
🟡 Warning | > 80% от max_connections |
Все манифесты находятся в deploy/k8s/.
# 1. Namespace
kubectl apply -f deploy/k8s/base/namespace.yaml
# 2. Secrets (скопировать из secrets.example.yaml и заполнить)
kubectl apply -f deploy/k8s/secrets.yaml
# 3. Infrastructure (PostgreSQL, RabbitMQ)
kubectl apply -f deploy/k8s/infrastructure/
# 4. Сервисы
kubectl apply -f deploy/k8s/base/
kubectl apply -f deploy/k8s/auth_service/
kubectl apply -f deploy/k8s/event_service/
kubectl apply -f deploy/k8s/booking_service/
kubectl apply -f deploy/k8s/notification_service/
# 5. Ingress
kubectl apply -f deploy/k8s/ingress.yaml
# 6. Миграции
kubectl exec -n booking-tickets deploy/auth-service -- alembic upgrade head
kubectl exec -n booking-tickets deploy/event-service -- alembic upgrade head
kubectl exec -n booking-tickets deploy/booking-service -- alembic upgrade headЧек-лист для проверки работоспособности:
- Все сервисы отвечают
200на/health - Регистрация и логин работают
-
refreshвозвращает новую пару токенов - Повторное использование refresh-токена возвращает
401 - Обычный пользователь получает
403на изменение мероприятий -
adminможет создавать, обновлять и удалять мероприятия - Создание и отмена бронирования работают
- Notification worker получает задачу и отправляет email
Следующие шаги для приближения к полноценному production:
- CI/CD пайплайн (GitHub Actions / GitLab CI)
- Структурированное логирование (JSON) + агрегация (Loki / ELK)
- Интеграция платёжной системы
MIT