Сервис для бронирования отелей позволяет пользователям резервировать различные типы номеров в отелях на заданные даты. Реализована функция загрузки изображений отелей. Пользователи могут просматривать доступные отели по местоположению на обычной странице. В системе предусмотрены логирование, мониторинг ошибок, сбор метрик и их визуализация. Проект использует асинхронный подход к обработке запросов и поддерживает локальное развертывание, а также развертывание в Docker-контейнерах.
- Пользовательская система регистрации
- Неавторизованные пользователи имеют доступ только для чтения
- Аутентификация через куки и JWT-токены
- Создание новых записей разрешено только авторизованным пользователям
- Просмотр персональной информации в профиле
- Бронирование номеров в отелях
- Просмотр и отмена своих бронирований
- Отправка email-подтверждения через Celery
- Фильтрация отелей по местоположению и датам
- Отображение доступных отелей на странице
- Загрузка и обработка изображений отелей с помощью Celery
- Управление сервисом через админ-панель
- Кеширование и обработка фоновых задач через Redis
- Версионирование API
- Мониторинг ошибок через Sentry
- Кастомная система логирования
- Сбор метрик с Prometheus и визуализация в Grafana
- Развертывание в Docker
Локально документация доступна по адресу: http://localhost:8000/v1/docs/
-
Предварительно необходимо установить Docker и Redis для вашей системы.
-
Склонировать репозиторий:
git clone <ссылка на репозиторий>Cоздать и активировать виртуальное окружение:
Команды для установки виртуального окружения на Mac или Linux:
python3 -m venv env
source env\bin\activate
Команды для Windows:
python -m venv venv
source venv\Scripts\activate
- Создать файл .env по образцу:
cp .env-non-dev .env- Установить зависимости из файла requirements.txt:
cd ..
pip install -r requirements.txt- Для создания миграций выполнить команду:
alembic init migrations- В папку migrations в env файл вставьте следующий код:
from logging.config import fileConfig
from alembic import context
from sqlalchemy import engine_from_config, pool
from bookings.models import Booking
from config import settings
from database import Base
from hotels.models import Hotel
from hotels.rooms.models import Room
from users.models import User
config = context.config
config.set_main_option('sqlalchemy.url', f'{settings.DATABASE_URL}?async_fallback=True')
if config.config_file_name is not None:
fileConfig(config.config_file_name)
target_metadata = Base.metadata- Инициализировать БД:
alembic revision --autogenerate -m "comment" - Применить миграцию:
alembic upgrade head - Запустить проект:
uvicorn main:app --reload - Запустить Redis:
redis-server.exe
redis-cli.exe- Запустить Celery:
celery -A tasks.celery_app:celery worker --loglevel=INFO --pool=solo- Запустить Flower:
celery -A tasks.celery_app:celery flowerКуприянов Тимофей - https://github.com/tims1de








