Веб-приложение для онлайн-бронирования столиков в ресторанах. Пользователи могут искать и бронировать столики, а администраторы — управлять заведениями и бронированиями.
- Вход по email или номеру телефона/паролю
- Авторизация через JWT-токены
- Поиск доступных столиков по дате и времени
- Создание, редактирование и отмена брони
- Проверка на пересечение времени бронирований
- Управление заведениями
- Добавление ресторанов и залов
- Настройка количества столиков
- Управление временем работы
Email уведомления о создании и изменении брони, напоминание о бронировании.
- Язык: Python 3.11
- Backend: FastAPI
- База данных: PostgreSQL + SQLAlchemy + Alembic
- Аутентификация: JWT
- Контейнеризация: Docker, Docker Compose
- Очереди и их мониторинг: Celery, Flower, RabbitMQ
- Тестирование: Pytest
- CI/CD: GitHub Actions
- Инфраструктура: Nginx, Gunicorn/Uvicorn
.
├── alembic/ # Миграции БД
│ ├── env.py
│ └── versions/
│ └── migration.py
| |
├── infra/ # Инфраструктура и деплой
│ ├── docker-compose.local.yml - для локального запуска.
│ ├── docker-compose.production.yml - для запуска на сервере (образы DockerHub).
│ ├── docker-compose.test.yml - для запуска тестов.
│ └── pgdata/ # Данные PostgreSQL
│
├── nginx/ # Конфигурация Nginx
│ ├── local.conf
│ └── prod.conf
│
├── logs/ # Логи проекта
| └── app.log
|
├── src/ # Исходный код приложения
│ ├── api/ # Эндпоинты FastAPI
│ │ ├── endpoints/
│ │ ├── responses/
│ │ ├── routers.py
│ │ └── validators.py
│ │
│ ├── core/ # Конфигурация, база данных, логирование
│ │ ├── base.py
│ │ ├── config.py
│ │ ├── db.py
│ │ ├── logger.py
│ │ └── user.py
| |
| ├── celery/ # Система очередей задач
│ │ ├── html/
| | ├── app.py
| | ├── formatters.py
| | ├── notifications.py
| | └── types.py
| |
│ ├── crud/ # CRUD-операции
| | ├── actions.py - акции
| | ├── base.py - базовый
| | ├── bookings.py - бронирования
│ │ ├── cafes.py
│ │ ├── dishes.py
│ │ ├── tables.py
│ │ ├── users.py
| | ├── slots.py
│ │ └── factory.py
│ │
│ ├── exceptions/ # Кастомные исключения
| | ├── base.py
| | ├── bookings.py
| | ├── cafe.py
| | ├── handlers.py
| | ├── slots.py
│ │ ├── auth.py
│ │ ├── db.py
│ │ └── user.py
│ │
│ ├── models/ # SQLAlchemy-модели
| | ├── action.py
| | ├── base.py
│ │ ├── booking.py
│ │ ├── cafe.py
│ │ ├── dish.py
| | ├── slot.py
│ │ ├── table.py
│ │ └── user.py
│ │
│ ├── schemas/ # Pydantic-схемы
| | ├── action.py
│ │ ├── auth.py
| | ├── base.py
| | ├── bookings.py
│ │ ├── cafes.py
│ │ ├── dish.py
| | ├── slots.py
│ │ ├── table.py
│ │ ├── users.py
│ │ └── validators.py
│ │
│ ├── services/ # Бизнес-логика
│ │ ├── auth.py
│ │ └── slot_rules.py
│ │
| ├── requirements.txt # Основные зависимости
│ └── main.py # Точка входа в приложение
│
├── tests/ # Тесты Pytest
│ ├── conftest.py
│ ├── database_manager.py
│ ├── test_actions.py
│ ├── test_bookings.py
│ ├── test_cafes.py
│ ├── test_config.py
│ ├── test_integration.py
│ ├── test_auth.py
│ ├── test_dishes.py
│ ├── test_tables.py
│ ├── test_time_slots.py
│ ├── test_transactional_example.py
│ ├── test_utils.py
│ └── test_users.py
│
├── AuthJWT.md # Инструкция по авторизации и схема работы
├── env.example # Образец для переменных окружения
├── env.test # Переменные окружения для тестирования
├── create_superuser_cli.py # CLI-скрипт для создания суперпользователя
├── entrypoint.sh # Стартовый скрипт Docker
├── Dockerfile # Docker-образ для backend
├── requirements_dev.txt # Основные зависимости для разработки
├── alembic.ini # Конфиг для Alembic
├── ruff.toml # Настройки линтера Ruff
├── pytest.ini # Конфиг для Pytest
└── README.md
Клонирование репозитория
git clone https://github.com/Studio-Yandex-Practicum/tables_booking_system_team2.git
cd tables_booking_system_team2Копируем файл окружения
cd tables_booking_system_team2
cp env.example .envС Docker (рекомендуется)
Копируем .env в директорию infra
cp .env infra/.envcd src/infra
docker-compose -f docker-compose.local.yml up --buildБез Docker
Создание виртуального окружения
python -m venv venv
source venv/bin/activate # Linux/Mac
или
venv\Scripts\activate # Windows
# Установка зависимостей
pip install -r requirements.txt
# Применение миграций
alembic upgrade headuvicorn src.main:app --reload
После запуска приложение будет доступно:
- API: http://localhost
- Документация: http://localhost/docs
- Альтернативная документация: http://localhost/redoc
Приложение будет доступно по адресу:
👉 http://localhost/api/v1
Документация API:
👉 Swagger UI: http://localhost/docs
👉 ReDoc: http://localhost/redoc
🚀 Основные процессы CI/CD
Каждый коммит, push или pull request автоматически проверяется, тестируется и сопровождается уведомлением в Telegram.
| Workflow | Описание | Событие |
|---|---|---|
| develop.yml | Запускает тесты посредством контейнера docker-compose.test.yml и проверяет корректность кода | push (branch - develop) |
| main.yml | Запускает тесты, отправляет уведомления в Telegram, выполняет деплой на сервер | push (branch - main) |
| style_check.yml | Проверяет стиль кода (Ruff, Pre-commit) | push, pull_request |
| TelegramNotifications.yml | Отправляет уведомления в Telegram об открытии Pull Request | pull request (branch - develop) |
⚙️ Как это работает
- Разработчик делает push или pull request в репозиторий.
- GitHub Actions автоматически:
- собирает проект в Docker;
- прогоняет тесты;
- проверяет стиль кода;
- выполняет деплой на сервер (опционально)
- отправляет уведомление о результате в Telegram. -При успешной проверке или ошибке высылается сообщение в Telegram-чат разработчиков.
📨 Пример уведомления в Telegram
🍽 Сервис бронирования столиков<br>
🔔 Новое обновление в репозитории:<br>
Тип события: push<br>
Бранч: develop<br>
Коммит: 4dce9bd9edc6ad92ea1780c5428e3ad2df0ba109<br>
Автор: warqone<br>
Сообщение: Merge pull request #39 from Studio-Yandex-Practicum/features/crud_for_dishes<br>
Fix update crud dish
‼️ -- Подтяните к себе ветку develop -- ‼️📬 Если тесты или сборка не прошли — в Telegram отправляется
сообщение с ❌ и описанием ошибки.
Это позволяет команде оперативно реагировать и фиксить проблемы без необходимости проверять GitHub вручную.
Для создания суперпользователя, который будет иметь доступ ко всем административным функциям системы в продакшене, выполните следующие шаги:
Запустите контейнеры с приложением:
Убедитесь, что ваше приложение запущено в Docker-контейнерах.
Для этого выполните команду в директории,
где находится ваш файл docker-compose.production.yml:
docker-compose -f docker-compose.production.yml up --buildЗапустите команду для создания суперпользователя:
После того как контейнеры будут запущены, используйте
команду create_superuser для создания суперпользователя:
Примечание:
Замените <имя_контейнера_backend> на реальное имя
контейнера для вашего приложения, например, backend-1.
docker-compose exec <имя контейнера backend> sh python /app/create_superuser_cli.py create-superuserВ процессе выполнения вас попросят ввести следующие данные:
- Username — имя пользователя (от 3 до 50 символов, только латиница, цифры и _)
- Email — email (например, user@example.com)
- Password — пароль (минимум 8 символов, строчные и заглавные буквы, цифры и спецсимволы)
- Phone — номер телефона (например, +79998887766)
- Telegram ID — (необязательно)
Проверьте, что суперпользователь создан:
После успешного выполнения команды, вы увидите сообщение о том,
что суперпользователь был создан.
Теперь вы можете использовать его для доступа
к административной панели вашего приложения.
Проект настроен для параллельного выполнения тестов с транзакционной изоляцией на PostgreSQL в Docker контейнере.
1. Запуск тестов
# Запуск контейнера для тестов
docker-compose -f infra/docker-compose.test.yml up --build -dПосле того как контейнер поднимется, тесты будут произведены автоматически. в /logs появляется файл с логами тестов - test.log, либо можно просмотреть результаты тестов с помощью
docker compose -f infra/docker-compose.test.yml backend logs
Система поддерживает параллельное выполнение тестов с отдельными базами данных для каждого worker'а:
- Master worker:
test_db - Worker gw0:
test_db_gw0 - Worker gw1:
test_db_gw1 - И т.д.
Каждый тест выполняется в своей транзакции, которая автоматически откатывается.
# Только unit тесты
make test-fast
# Только интеграционные тесты
make test-integration
# Конкретные категории
make test-auth
make test-users
make test-cafes
# Конкретный файл
./run_tests.sh tests/test_auth.py
# Конкретный тест
./run_tests.sh tests/test_auth.py::TestAuth::test_loginКонфигурация в файле env.test:
# Основные настройки
DB_ENGINE=postgres
DB_HOST=localhost
DB_PORT=5433
DB_NAME=test_db
DB_USER=test_user
DB_PASSWORD=test_password
# JWT
SECRET=test_secret_key_for_testing_only
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30import pytest
from tests.test_utils import parallel_test, unit_test
class TestExample:
@unit_test
@parallel_test
@pytest.mark.asyncio
async def test_example(self, db_session: AsyncSession):
# Тест с транзакционной изоляцией
user = User(username='test', email='test@example.com', ...)
db_session.add(user)
await db_session.flush() # НЕ commit!
# Транзакция автоматически откатится в конце теста# Показать тестовые базы данных
./cleanup_test_databases.sh --dry-run
# Удалить все тестовые базы данных
./cleanup_test_databases.sh --all --force
# Очистка Docker volumes
make clean-docker# Последовательный режим для отладки
./run_tests.sh --serial --verbose
# Просмотр логов
tail -f test.log
# Подключение к тестовой БД
PGPASSWORD=test_password psql -h localhost -p 5433 -U test_user -d test_db- Backend запускается через Docker + Gunicorn/Uvicorn
- Nginx используется как реверс-прокси
- CI/CD настроен через GitHub Actions:
- запуск тестов
- сборка и публикация Docker-образа
- деплой на сервер
Для обеспечения единого стиля кода используются пакеты Ruff и Pre-commit.
Проверка стиля
ruff checkПроверка и автофикс
ruff check --fixАвтоматическая проверка при коммитах
Чтобы при каждом коммите автоматически проверялась и исправлялась стилистика, нужно подключить pre-commit:
pre-commit install👤 Регистрация пользователя
POST /api/v1/auth/register
Content-Type: application/json
{
"username": "IvanPetrov",
"email": "user@example.com",
"phone": "+75555555555",
"tg_id": 123,
"password": "IvanPetrov@1"
}
✅ Ответ:
{
"username": "IvanPetrov",
"email": "user@example.com",
"phone": "+75555555555",
"tg_id": 123,
"id": 1,
"is_active": true,
"created_at": "2025-10-03T13:39:03.182Z",
"updated_at": "2025-10-03T13:39:03.182Z"
}🔑 Авторизация (получение JWT)
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "sIvanPetrov@1"
}✅ Ответ:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI...",
}Тимлид:
🧑💻 Вадим Каримов
Разработчики:
💡 Вадим Каримов - Общая архитектура, ревью, Celery задачи (напоминания, уведомления), RabbitMQ, Flower
💡 Дмитрий Радюк - Auth (/auth) – логин/регистрация, JWT токены, Docker-compose, конфиги
💡 Александр Лавер - Users (/users) – CRUD пользователей
💡 Александр Комаров - Cafes (/cafes) – CRUD кафе, GitHub Actions, уведомления в группу ТГ при запросах на Pull Request и обновлениях в ветке develop
💡 Игорь Могилин - Dishes (/dishes) – CRUD блюд, привязка к кафе
💡 Вика Долгова - Bookings (/bookings) – бронирование столов/слотов, проверка пересечений, статусов, отмена, выбор блюд
💡 Алексей Гасилин - Slots (/cafe/slots) – CRUD слотов бронирования
💡 Дмитрий Волков - Tables (/cafe/tables) – CRUD столов конкретного кафе
💡 Исхак Мурзаев - Actions (/actions) – CRUD акций, привязка к кафе
💡 Михаил Яковенко - Тесты, автотестирование, Docker-compose для тестирования