Сервис для работы с пользовательским контентом в онлайн-кинотеатре Netflix.
docker-compose содержат контейнеры:
- server
- redis
- traefik
- zookeeper-kafka
- zookeeper-clickhouse
- kafka
- init-kafka (создание топиков при запуске сервиса)
- clickhouse-server-0[1-4]
* Нужно для полноценного веб-интерфейса Kafka
- schema-registry
- connect
- control-center
- ksqldb-server
- ksqldb-cli
- ksql-datagen
- rest-proxy
Файлы docker-compose:
docker-compose.yml
- для локальной разработки; используются стабы для работы с in-memory очередью.docker-compose-dev.yml
- полный набор всех необходимых контейнеров (Kafka, ClickHouse cluster, Kafka UI).tests/functional/docker-compose.yml
- для функциональных тестов.
Для запуска контейнеров нужно создать файл .env
в корне проекта.
Пример .env
:
ENV=.env
# Python
PYTHONUNBUFFERED=1
# Netflix UGC
# Project
NUGC_DEBUG=1
NUGC_PROJECT_BASE_URL=http://api-ugc.localhost:8010
NUGC_SERVER_PORT=8003
NUGC_PROJECT_NAME=netflix-ugc
NUGC_API_V1_STR=/api/v1
NUGC_SERVER_HOSTS=http://api-ugc.localhost:8010
# Auth
NAA_SECRET_KEY=changeme
# Redis
NUGC_REDIS_HOST=redis
NUGC_REDIS_PORT=6379
NUGC_REDIS_MAIN_DB=0
NUGC_REDIS_OM_URL=redis://@redis:6379
NUGC_REDIS_DEFAULT_CHARSET=utf-8
NUGC_REDIS_DECODE_RESPONSES=1
NUGC_REDIS_RETRY_ON_TIMEOUT=1
# MongoDB
NUGC_MONGODB_USER=codereview
NUGC_MONGODB_PASSWORD=netflix
NUGC_MONGODB_NAME=netflix_ugc
NUGC_MONGODB_HOST=mongodb
NUGC_MONGODB_PORT=27017
NUGC_MONGOEXPRESS_LOGIN=admin
NUGC_MONGOEXPRESS_PASSWORD=pass
# Queue
NUGC_QUEUE_PROGRESS_NAME=progress-topic
NUGC_QUEUE_PROGRESS_GROUP=progress-group
NUGC_QUEUE_PROGRESS_CONSUMERS=2
NUGC_QUEUE_BOOKMARKS_NAME=bookmarks-topic
NUGC_QUEUE_BOOKMARKS_GROUP=bookmarks-group
NUGC_QUEUE_BOOKMARKS_CONSUMERS=2
NUGC_QUEUE_FILM_RATING_NAME=film-rating-topic
NUGC_QUEUE_FILM_RATING_GROUP=film-rating-group
NUGC_FILM_RATING_CONSUMERS=2
# Kafka
NUGC_KAFKA_URL=kafka:9092
# ELK
NUGC_LOGSTASH_HOST=logstash
NUGC_LOGSTASH_PORT=5044
NUGC_LOGSTASH_LOGGER_VERSION=1
# Config
NUGC_USE_STUBS=0
NUGC_TESTING=0
NUGC_CI=0
Локально:
docker-compose build
docker-compose up
Синхронизировать окружение с requirements.txt
/ requirements.dev.txt
(установит отсутствующие пакеты, удалит лишние, обновит несоответствующие версии):
make sync-requirements
Сгенерировать requirements.*.txt files (нужно пере-генерировать после изменений в файлах requirements.*.in):
make compile-requirements
Используем requirements.local.in
для пакетов, которые нужно только разработчику. Обязательно нужно указывать constraints files (-c ...)
Пример:
# requirements.local.txt
-c requirements.txt
ipython
Запуск тестов (всех, кроме функциональных) с экспортом переменных окружения из .env
файла:
export $(echo $(cat .env | sed 's/#.*//g'| xargs) | envsubst) && make test
Для функциональных тестов нужно создать файл .env
в папке ./tests/functional
Пример .env
(для корректной работы тестов надо подставить корректные значения для NAA):
# Tests
ENV=.env
# Python
PYTHONUNBUFFERED=1
# Netflix UGC
# Project
NUGC_DEBUG=1
NUGC_PROJECT_BASE_URL=http://api-ugc.localhost:8010
NUGC_SERVER_PORT=8003
NUGC_PROJECT_NAME=netflix-ugc
NUGC_API_V1_STR=/api/v1
NUGC_SERVER_HOSTS=http://api-ugc.localhost:8010
# Auth
NAA_SECRET_KEY=changeme
# Redis
NUGC_REDIS_HOST=redis
NUGC_REDIS_PORT=6379
NUGC_REDIS_MAIN_DB=0
NUGC_REDIS_OM_URL=redis://@redis:6379
NUGC_REDIS_DEFAULT_CHARSET=utf-8
NUGC_REDIS_DECODE_RESPONSES=1
NUGC_REDIS_RETRY_ON_TIMEOUT=1
# MongoDB
NUGC_MONGODB_USER=codereview
NUGC_MONGODB_PASSWORD=netflix
NUGC_MONGODB_NAME=netflix_ugc
NUGC_MONGODB_HOST=mongodb
NUGC_MONGODB_PORT=27017
NUGC_MONGOEXPRESS_LOGIN=admin
NUGC_MONGOEXPRESS_PASSWORD=pass
# Queue
NUGC_QUEUE_PROGRESS_NAME=progress-topic
NUGC_QUEUE_PROGRESS_GROUP=progress-group
NUGC_QUEUE_PROGRESS_CONSUMERS=2
NUGC_QUEUE_BOOKMARKS_NAME=bookmarks-topic
NUGC_QUEUE_BOOKMARKS_GROUP=bookmarks-group
NUGC_QUEUE_BOOKMARKS_CONSUMERS=2
NUGC_QUEUE_FILM_RATING_NAME=film-rating-topic
NUGC_QUEUE_FILM_RATING_GROUP=film-rating-group
NUGC_FILM_RATING_CONSUMERS=2
# Kafka
NUGC_KAFKA_URL=kafka:9092
# Config
NUGC_USE_STUBS=1
NUGC_TESTING=1
NUGC_CI=0
# Tests
TEST_CLIENT_BASE_URL=http://traefik:80
TEST_SERVER_BASE_URL=http://server:8003
TEST_NETFLIX_AUTH_BASE_URL=http://traefik:81
# Netflix Auth API
FLASK_APP=main.py
FLASK_DEBUG=1
FLASK_ENV=development
# Project
NAA_SQLALCHEMY_ECHO=0
NAA_PROJECT_BASE_URL=http://api-auth.localhost:8009
NAA_API_V1_STR=/api/v1
NAA_SERVER_HOSTS=http://api-auth.localhost:8009
NAA_SERVER_PORT=8002
NAA_PROJECT_NAME=netflix-auth
NAA_THROTTLE_KEY_PREFIX=limiter:
NAA_THROTTLE_USER_REGISTRATION_LIMITS=3/minute
NAA_THROTTLE_ENABLE_LIMITER=0
NAA_DEBUG=1
# Tracing
NAA_OTEL_ENABLE_TRACING=0
# auth0
NAA_AUTH0_DOMAIN=dummy.com
NAA_AUTH0_API_AUDIENCE=https://dummy.com
NAA_AUTH0_ISSUER=https://dummy.com/
NAA_AUTH0_CLIENT_ID=secret
NAA_AUTH0_CLIENT_SECRET=secret
NAA_AUTH0_AUTHORIZATION_URL=https://dummy.com/oauth/token
# Social
NAA_SOCIAL_GOOGLE_CLIENT_ID=secret
NAA_SOCIAL_GOOGLE_CLIENT_SECRET=secret
NAA_SOCIAL_GOOGLE_METADATA_URL=https://accounts.google.com/.well-known/openid-configuration
NAA_SOCIAL_YANDEX_CLIENT_ID=secret
NAA_SOCIAL_YANDEX_CLIENT_SECRET=secret
NAA_SOCIAL_YANDEX_ACCESS_TOKEN_URL=https://oauth.yandex.ru/token
NAA_SOCIAL_YANDEX_USERINFO_ENDPOINT=https://login.yandex.ru/info
NAA_SOCIAL_YANDEX_AUTHORIZE_URL=https://oauth.yandex.ru/authorize
NAA_SOCIAL_USE_STUBS=1
# Postgres
NAA_DB_HOST=db-auth
NAA_DB_PORT=5432
NAA_DB_NAME=netflix_auth
NAA_DB_USER=test
NAA_DB_PASSWORD=codereview
NAA_DB_DEFAULT_SCHEMA=public
# Redis
NAA_REDIS_HOST=redis-auth
NAA_REDIS_PORT=6379
NAA_REDIS_THROTTLE_STORAGE_DB=2
NAA_REDIS_DEFAULT_CHARSET=utf-8
NAA_REDIS_DECODE_RESPONSES=1
NAA_REDIS_RETRY_ON_TIMEOUT=1
Запуск функциональных тестов:
cd ./tests/functional && docker-compose up test
Или через рецепт Makefile:
make dtf
Перед коммитом проверяем, что код соответствует всем требованиям:
make lint
Для настройки pre-commit:
pre-commit install
Redis используется в качестве основной БД (Redis Stack on Redis Enterprise). Веб-интерфейс RedisInsight доступен по адресу:
localhost:13333
В качестве брокера сообщений используется Kafka. Веб-интерфейс доступен по адресу (может настраиваться до 5-10 минут):
${PROJECT_BASE_URL}:9021/
Документация в формате OpenAPI 3 доступна по адресам:
${PROJECT_BASE_URL}/api/v1/docs
- Swagger