Ссылка на приватный репозиторий с командной работой https://github.com/artwist-polyakov/Auth_sprint_1
Просим прощения за возможные небрежности — делали проект вдвоем.
/ws
— сервер вебсокетов, запускается в контейнере ws
/etl-notifications-tasks
— задачи для ETL, запускаются в контейнерах etl-notifications-tasks
. Стартует по крону раз в минуту./notifications-workers
— воркеры для обработки задач, запускаются в контейнерах notifications-workers
/notifications
— сервис уведомлений, запускается в контейнере notifications
/rabbitmq
— RabbitMQ, запускается в контейнере rabbitmq
и rabbitmq-init
notifications-db
— она партицирована по дате для поиска уведомлений.
Миграции запускаются в контейнере notifications
. База для вебсокетов излишняя, сервер вебсокетов сам хранит и удаляет пользователей..env.example
в файл .env
docker-compose up -d --build
Расположена в папке docs/c2-notifications.puml
Или если нужна картинка то docs/c2-notifications-_b_Movies_notifications_pipeline__b_.png
push
) (я понимаю что вебсокет — не пуш, но модель данных вышла такая, простите )./mailings
Описал детально все ниже.
Пока у нас нет доступа к почтовому серверу, поэтому уведомления отправляются в директорию ./mailings
Письма можно открыть в почтовом клиенте.
6 мая яндекс разблокировал почтовый ящик, я обещали что буду слать почту только на master@artwist.ru
или на artwist@yandex.ru
.
Думаю что можно одно письмо и на другой аккаунт отправить, но для того чтобы это заработало, надо раскомментировать в проекте mail_service = SMTPMailService()
в файле sender_worker.py
websocat
.https://github.com/vi/websocat
websocat ws://localhost:8765
при запуске бота напишите ему свой uuid.
Бот не реагирует на сообщение, но запомнит вас.
Оставили из прошлого спринта.
.github/workflows
для автоматического тестированияmatch-case
внедренной в 3.10platform: linux/amd64
для сервиса filebeat
filebeat
, logstash
, kibana
Stack Management > Data views
http://localhost:5601/app/management/kibana/indexPatternsДоступы к Sentry:
master@artwist.ru Qhi84DVW@XKaXsx
Чтобы не пытаться вызывать ошибку сервера, можно добавить куда-нибудь 1/0
и посмотреть логи в Sentry
Я добавил их закомментированными в апишке ugc
Инструкция по запуску тестов под нагрузкой:
cd ./research
guidance.md
Результаты на локальном компьютере были следующие
MONGO Среднее время записи в сек.(10000 - строк | 10 - итераций): 0.14699999999720603 Среднее время записи в сек.(100000 - строк | 10 - итераций): 1.3764000000082888 Среднее время чтения в сек.(1000000 - строк): 1.117200000002049 ELASTIC Среднее время записи в сек.(10000 - строк | 10 - итераций): 0.4686000000103377 Среднее время записи в сек.(100000 - строк | 10 - итераций): 3.423700000002282 Среднее время чтения в сек.(1000000 - строк): 0.19690000000409782
Запись в рамках тестов лучшие результаты показывает МОНГО почти в 3 раза, но в случае чтения данных ЕЛАСТИК опережает больше чем в 5 раз
так как нам надо будет чаще читать, чем писать — выбираем эластика Для хранения пользовательских данных, таких как лайки, закладки страниц и рецензии на фильмы, MongoDB может быть более предпочтительным выбором, особенно если эти операции преимущественно связаны с записью и обновлением данных и не требуют сложных поисковых возможностей.
Так же с МОНГО проще работать, в связи с выше укзанными причинами было принято решение реализовать новые ручки на МОНГО
Плюсы:
Минусы:
Плюсы:
Минусы:
Принимая во внимание текущую архитектуру системы и необходимость интеграции с Kafka, Clickhouse, и MongoDB, расширение существующего сервиса является предпочтительным вариантом.
— Сервис 1: UGC-сервис на flask
Умеет проверять авторизован ли пользователь и его uuid. Позволяет передать некоторое событие:
— Сервис 2: Stat-сервис на flask Умеет складывать событие в кафку
— Сервис 3: Kafka
Хранит очереди сообщений Разделение очередей продумывает ответственный за кафку.
— Сервис 4: Скрипт etl между кафкой и olap для записи сообщений
Умеет забрать событие и преобразовать его в запись в колоночной субд
— Сервис 5. Кликхаус для хранения данных аналитки.
Для просмотра документации следует установить поддержку UML на устройство https://plantuml.com/ru/starting
docker-compose up -d --build
пользователей 3000
Ramp 200
Host: http://ugc:5555
Создан middleware проверки прав пользователя ./movies/middlewares/rbac.py
Добавлена изящная деградация ./movies/middlewares/rbac.py
. Возвращаем поиск по звёздным войнам в ответ на любой запрос.
Проверка доступа (./auth/api/v1/users.py
def check_permissions
) может проводиться с помощью токена
В настройки (./movies/configs/settings.py
) добавлен внутренний токен для обхода middleware rbac internal_secret_token
admin
с сервисом django
, создано приложение users
, внесены изменения в nginx.conf
./admin/users/models.py
Доступ к панели администратора имеют (./admin/users/backends.py
):
admin
Создан контейнер jaeger
Настроена трассировка ./auth/main.py
, ./movies/main.py
, nginx/nginx.conf
В сервисе авторизации добавлена возможность ограничения количества запросов к серверу для предотвращения перебора паролей.
Для этого используется redis и методы zadd
, zremrangebyscore
, zcard
Чтобы избежать засорения каждую минуту запускается cleanup_task
, которая применяет zremrangebyscore
.
Используем сервис Яндекса.
Страница авторизации https://oauth.yandex.ru/authorize?response_type=code&client_id=f0f7d3c997d14831944552f7739d94c2 Соглашаемся с предоставлением доступа, нас перенаправляют на страницу апи, которая выпускает токен доступа и рефреш токен.
Создана api yandex_login
(./auth/api/v1/users.py
)
Функция для обмена кода на токены exchange_code_for_tokens
(./auth/api/v1/users.py
)
Созданы абстрактный класс OAuthService (./auth/db/oauth/oauth_service.py
) и класс YandexOAuthService
(./auth/db/oauth/yandex_oauth_service.py
). Созданы методы, позволяющие получать пользовательскую информацию
Создана модель токена ./auth/db/models/token_models/oauth_token.py
Созданы модель пароля и метод, умеющий генерировать валидный пароль ./auth/services/models/signup.py
Создана модель для хранения oauth данных ./auth/db/auth/yandex_oauth.py
Реализованы изменения, связанные с работой oauth ./auth/db/postgres.py
, ./auth/services/user_service.py
Партицирование истории входов по user_device_type
Изменена модель RefreshToken ./auth/db/auth/refresh_token.py
Созданы дополнительные миграции ./auth/migrations/
, в том числе был создан индекс ix_refresh_tokens_user_device_type
Создана функция для определения типа устройства ./auth/api/v1/users.py
get_device_type
Создайте интеграцию Auth-сервиса с сервисом выдачи контента и административной панелью, используя контракт, который вы сделали в прошлом задании. При создании интеграции не забудьте учесть изящную деградацию Auth-сервиса. Auth сервис — один из самых нагруженных, потому что в него ходят большинство сервисов сайта. И если он откажет, сайт отказать не должен. Обязательно учтите этот сценарий в интеграциях с Auth-сервисом.
Добавьте в Auth-сервис трассировку и подключите к Jaeger. Для этого вам нужно добавить работу с заголовком x-request-id и отправку трассировок в Jaeger.
Добавьте в сервис механизм ограничения количества запросов к серверу.
Упростите регистрацию и аутентификацию пользователей в Auth-сервисе, добавив вход через социальные сервисы. Список сервисов выбирайте исходя из целевой аудитории онлайн-кинотеатра — подумайте, какими социальными сервисами они пользуются. Например, использовать OAuth от Github — не самая удачная идея. Ваши пользователи — не разработчики и вряд ли пользуются аккаунтом на Github. Лучше добавить Yandex, VK или Google. Вам не нужно делать фронтенд в этой задаче и реализовывать собственный сервер OAuth. Нужно реализовать протокол со стороны потребителя.
Партицируйте таблицу с пользователями или с историей входов. Подумайте, по каким критериям вы бы её разделили. Важно посмотреть на таблицу не только в текущем времени, но и заглядывая в некое будущее, когда в ней будут миллионы записей. Пользователи могут быть из одной страны, но из разных регионов. А ещё пользователи могут использовать разные устройства для входа и иметь разные возрастные ограничения.
1234
1234
.env
с переменными окружения. Пример файла находится в .env.example
.docker-compose up -d --build
если не нужен SSL
если установили сертификаты
Необходмо согласиться с недостоверным сертификатом или добавить самоподписанный сертификат по инструкции в файле FOR_TEAM.md
Упрялять ролями могут только суперпользователи. Для создания суперпользователя используйте команду:
docker exec -it auth python superuser.py <email> <pass>
С этого модуля вы больше не будете получать чётко расписанное ТЗ, а задания для каждого спринта вы найдёте внутри уроков. Перед тем как начать программировать, вам предстоит продумать архитектуру решения, декомпозировать задачи и распределить их между командой.
В первом спринте модуля вы напишете основу вашего сервиса и реализуете все базовые требования к нему. Старайтесь избегать ситуаций, в которых один из ваших коллег сидит без дела. Для этого вам придётся составлять задачи, которые можно выполнить параллельно и выбрать единый стиль написания кода.
К концу спринта у вас должен получиться сервис авторизации с системой ролей, написанный на FastAPI. Первый шаг к этому — проработать и описать архитектуру вашего сервиса. Это значит, что перед тем, как приступить к разработке, нужно составить план действий: из чего будет состоять сервис, каким будет его API, какие хранилища он будет использовать и какой будет его схема данных. Описание нужно сдать на проверку наставнику. Вам предстоит выбрать, какой метод организации доступов использовать для онлайн-кинотеатра, и систему прав, которая позволит ограничить доступ к ресурсам.
Для описания API рекомендуем использовать OpenAPI{target="_blank"}, если вы выберете путь REST. Или используйте текстовое описание, если вы планируете использовать gRPC. С этими инструментами вы познакомились в предыдущих модулях. Обязательно продумайте и опишите обработку ошибок. Например, как отреагирует ваш API, если обратиться к нему с истёкшим токеном? Будет ли отличаться ответ API, если передать ему токен с неверной подписью? А если имя пользователя уже занято? Документация вашего API должна включать не только ответы сервера при успешном завершении запроса, но и понятное описание возможных ответов с ошибкой.
Для успешного завершения первой части модуля в вашем сервисе должны быть реализованы API для аутентификации и система управления ролями. Роли понадобятся, чтобы ограничить доступ к некоторым категориям фильмов. Например, «Фильмы, выпущенные менее 3 лет назад» могут просматривать только пользователи из группы 'subscribers'.
API для сайта и личного кабинета
API для управления доступами
Подсказки
Дополнительное задание
Реализуйте кнопку «Выйти из остальных аккаунтов», не прибегая к хранению в БД активных access-токенов.