Cервис загрузки медиафайлов и плеер.Пользователи могут загружать медиаконтент(изображения, видео, аудио) и просматривать/прослушивать его в медиаплеере.Интегрирован асинхронный подход к запросам к БД.Для кеширования использован Redis.Для фоновых задач подключён Celery.Реализована возможность чата посредством вебсокетов.Проект подготовлен для развертывания локально и в контейнерах Docker.
- Аутентификация реализована с помощью куков и JWT-токена.
- У неаутентифицированных пользователей доступ к API только на уровне чтения.
- Создание объектов разрешено только аутентифицированным пользователям, прошедшим верификацию.
- Управление пользователями доступно при наличии прав суперпользователя.
- Возможность получения подробной информации о себе и ее редактирование, если пользователь прошел верификацию.
- Получение списка всего доступного контента.
- Возможность загрузки медиаконтента.
- Получение, обновление и удаление конкретного файла.
- Просмотр контента в плеере с возможностью выбрать необходимую стартовую точку воспроизведения.
- Пользователь может получить на свой email отчет о количестве загрузок.
- Онлайн-чат
Документация к API доступна локально: http://localhost:8000/docs/ , в контейнерах: http://localhost:7567/docs/
- Python 3.9
- FastAPI 0.92.0
- fasapi-users 10.4.1
- fastapi-cache2 0.2.1
- Asynchronous
- Anyio
- Cookies
- JWT
- Alembic
- SQLAlchemy 2.0.4
- Docker
- PostgreSQL
- Redis 4.5.2
- Celery 5.2.7
- Flower
- Asyncpg
- Uvicorn
- Gunicorn
- CORS
-
Преварительно необходимо установить Docker и Redis для вашей системы.
-
Склонировать репозиторий:
git clone <название репозитория>
Cоздать и активировать виртуальное окружение:
Команды для установки виртуального окружения на Mac или Linux:
python3 -m venv env
source env/bin/activate
Команды для Windows:
python -m venv venv
source venv/Scripts/activate
- Перейти в директорию infra:
cd source/infra
- Создать .env-файл для локального запуска по образцу:
cp .env-example .env
- Установить зависимости из файла requirements.txt:
cd ..
cd ..
pip install -r requirements.txt
- Для создания миграций выполнить команду:
alembic init migrations
- В alembic.ini нужно задать адрес базы данных.
sqlalchemy.url = postgresql+asyncpg://%(POSTGRES_USER)s:%(POSTGRES_PASSWORD)s@%(POSTGRES_HOST)s:%(POSTGRES_PORT)s/%(POSTGRES_DB_NAME)s?async_fallback=True
- В папке migrations в .env файле должны быть следующие импорты:
from alembic import context
from source.infra.config import POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_HOST, POSTGRES_PORT, POSTGRES_DB_NAME
- В этом же файле добавить получение переменных из конфига:
config = context.config
section = config.config_ini_section
config.set_section_option(section, "POSTGRES_USER", POSTGRES_USER)
config.set_section_option(section, "POSTGRES_PASSWORD", POSTGRES_PASSWORD)
config.set_section_option(section, "POSTGRES_HOST", POSTGRES_HOST)
config.set_section_option(section, "POSTGRES_PORT", POSTGRES_PORT)
config.set_section_option(section, "POSTGRES_DB_NAME", POSTGRES_DB_NAME)
- В этом же файле добавить импорт моделей и установку метадаты в блоке, где написано from myapp import mymodel:
from source.database.models import Base
target_metadata = Base.metadata
- Инициализировать БД:
alembic revision --autogenerate -m 'comment'
- Применить миграцию:
alembic upgrade heads
- Перейти в директорию source:
cd source
- Запустить проект:
uvicorn main:app --reload
- Запустить Redis:
redis-server.exe
redis-cli.exe
- Запустить Celery:
celery -A tasks.tasks:celery worker --loglevel=INFO --pool=solo
- Запустить Flower:
celery -A tasks.tasks:celery flower
- Перейти в директорию infra:
cd source/infra
- Создать файл .env-docker для запуска в контейнерах:
cp .env-example .env-docker
- Выполнить команду для запуска:
docker-compose up -d --build
Регистрация пользователя:
POST /auth/register
Получение токена верификации:
POST /auth/request-verify-token
Сброс пароля:
POST /auth/reset-password
Получение данных своей учетной записи:
GET /users/me
Удаление пользователя:
DELETE /users/id
Добавление контента:
POST /contents/
Обновление контента:
PATCH /contents/content_id
Просмотр контента в плеере:
GET /contents/streamig/content_id
Гут Владимир - https://github.com/VladimirMonolith