https://github.com/murzindima/graduate_work
Рекомендательная система для онлайн-кинотеатра. Система рекомендует фильмы пользователям на основе их предпочтений и предыдущих просмотров. Если пользователь не имеет истории просмотров, система предлагает ему популярные или новые фильмы.
- Клонировать репозиторий на локальную машину командой
git clone https://github.com/murzindima/graduate_work.git
- Перейти в директорию проекта командой
cd graduate_work
- Запустить docker-compose командой
docker-compose -f docker-compose-recommendations.yml up --build
- Перейти на http://localhost:90/api/openapi для просмотра документации по API сервиса Recommendations
*
PostgreSQL сервиса Movies будет инициализирован автоматически на старте контейнера PostgreSQL из файла movies/postgres_movies/create_schema.sql
без данных.
**
Для простоты проверки работоспособности по согласованию с наставником на некоторых ручках API была отключена авторизация и сервис авторизации не был подключен
В итоге у вас будет полностью готовая к работе инфраструктура для рекомендательной системы, без данных.
Если же хотите так же наполнить всеми необходимыми данными, то следуйте инструкциям ниже.
- Необходимо наполнить базу сервиса Movies. Для этого можно воспользоваться скриптом из директории
movies/sqlite_to_postgres
. Скрипт переносит данные из SQLite базы данных в PostgreSQL. Для конфигурации скрипта требуется создать файл.env
. Пример файла можно найти в файле.env.example
. После создания файла.env
можно запустить скрипт командойpython3 load_data.py
. Удостоверьтесь, что PostgreSQL сервиса Movies доступен по адресуlocalhost:5432
- После чего требуется перезапустить контейнер сервиса ETL командой
docker-compose restart etl_movies
для загрузки данных из PostgreSQL в Elasticsearch - Для того, чтобы наполнить MognoDB сервиса Recommendations можно воспользоваться скриптом в директории
recommendations/sqlite2mongo
для переноса данных из SQLite в MongoDB. Файл SQLite базы данных взят из теории первых спринтов. Скрипт наполнит MongoDB случайными данными, но с реальными ID фильмов. Для конфигурации скрипта требуется две переменные окружения:SQLITE_FILE
-- путь к файлу SQLite базы данных (по умолчанию файл ищется в каталоге откуда запускается скрипт) иUGC_API_URL
-- URL API сервиса UGC (по умолчанию http://localhost:60/api/v1/movies). Наполенение происходит через API, то есть прямого доступа к MognoDB не требуется. Cкрипт можно запустить командойpython3 main.py
Теперь всё готово и можно пользоваться рекомендательной системой.
Сервисы проекта Movies:
- PostgreSQL -- база данных для хранения информации о фильмах
- Elasticsearch -- поисковый движок для поиска фильмов
- Redis -- кэш для хранения информации о фильмах
- ETL -- сервис для загрузки данных о фильмах в базу данных из PostgreSQL в Elasticsearch
- API -- сервис для работы с фильмами на основе FastAPI
- NGINX -- прокси-сервер для обработки запросов к API
Сервисы проекта UGC:
- MongoDB -- база данных для хранения информации об UGC
- Mongo Express -- веб-интерфейс для работы с базой данных (креды admin:pass)
- API -- сервис для работы с UGC на основе FastAPI
- NGINX -- прокси-сервер для обработки запросов к API
Сервисы проекта Recommendations:
- MongoDB -- база данных для хранения информации о рекомендациях
- Mongo Express -- веб-интерфейс для работы с базой данных (креды admin:pass)
- API -- сервис для работы с рекоммендациями на основе FastAPI
- NGINX -- прокси-сервер для обработки запросов к API
- 8081 -- порт для доступа к Mongo Express сервиса UGC
- 8091 -- порт для доступа к Mongo Express сервиса Recommendations
- 60 -- порт для доступа к API сервиса UGC
- 70 -- порт для доступа к API сервиса Movies
- 90 -- порт для доступа к API сервиса Recommendations
- 27017 -- порт для MongoDB
- 8081 -- порт для Mongo Express
- 9200 -- порт для Elasticsearch
- 6379 -- порт для Redis
- 5432 -- порт для PostgreSQL
- 80 -- порт для NGINX
- 8003 -- порт для API сервиса Movies
- 8005 -- порт для API сервиса UGC
- 7070 -- порт для API сервиса Recommendations
Можно изменить порты в файле .env
Необходимо создать файл .env
в корне проекта и изменить переменные окружения на свои значения по необходимости.
Пример файла .env
можно найти в файле .env.example
- .github -- директория для хранения файлов GitHub Actions
- movies -- директория для сервиса Movies
- etl -- директория для сервиса ETL
- fastapi_movies -- директория для сервиса API
- nginx -- директория для конфигурации NGINX
- postgres_movies -- директория в которой хранится DDL для базы данных PostgreSQL
- sqlite_to_postgres -- директория для скрипта для переноса данных из SQLite в PostgreSQL
- ugc_service -- директория для сервиса UGC
- src -- директория для исходного кода сервиса UGC
- nginx -- директория для конфигурации NGINX
- recommendations -- директория для сервиса Recommendations
- src -- директория для исходного кода сервиса Recommendations
- nginx -- директория для конфигурации NGINX
- sqlite2mongo -- директория для скрипта для переноса данных из SQLite в MongoDB
- docker-compose.yml -- файл для запуска всех сервисов
- .env.example -- пример файла с переменными окружения
- README.md -- файл с описанием проекта
- fastapi -- фреймворк для создания API
- pydantic -- библиотека для валидации данных
- motor -- асинхронный драйвер для работы с MongoDB
- pandas -- библиотека для работы с данными
- scikit-learn -- библиотека для машинного обучения
Пререквизит -- poetry
Также убедитесь, что у вас установлены запущены сервисы MongoDB и UGC
Для локальной разработки необходимо:
- Перейти в директорию сервиса
- Запустить виртуальное окружение командой
poetry shell
- Установить зависимости командой
poetry install
Запустить сервис можно командой poetry run uvicorn src.main:app --reload
Либо можно использовать docker-compose командой docker-compose up --build
в корне проекта и при необходимости перезапустить сервис командой docker-compose restart recommendations
Пререквизит -- запущенный проект с данными (смотри Инструкция по запуску).
Запустить тесты можно командой docker-compose -f docker-compose-recommendations-tests.yml up --build --exit-code-from recommendations-tests