quoter-init
Some checks failed
deploy / deploy (push) Failing after 3s

This commit is contained in:
2024-08-30 21:05:51 +03:00
parent d14e5457f3
commit 8e9387b95d
7 changed files with 1334 additions and 411 deletions

View File

@@ -1,34 +1,39 @@
## Presence
"Присутствие" - это сервер для пересылки сообщений в реальном времени. Текущая версия использует SSE-транспорт.
## Квотер
Управляет квотами на загрузку файлов и их размещением в S3-хранилище. Поддерживает создание миниатюр для изображений и управляет квотами на использование дискового пространства для каждого пользователя с использованием Redis.
### ENV
- API_BASE
- AUTH_URL
- REDIS_URL
- `REDIS_URL`: URL для подключения к Redis. Используется для управления квотами и хранения информации о загружаемых файлах.
- `S3_BUCKET`: Имя S3 bucket, используемого для хранения загруженных файлов.
- `CDN_DOMAIN`: Домен CDN для генерации публичных URL-адресов загруженных файлов.
### Как это работает
При каждом обращении к `/connect` создаётся отдельная асинхронная задача с подписками на Redus PubSub каналы, позволяя пользователям получать только те уведомления, которые предназначены непосредственно для них.
1. **Аутентификация**:
- Клиент отправляет файл на сервер с заголовком `Authorization`, содержащим токен. Сервер проверяет наличие и валидность токена, определяя пользователя.
Каналы Redis:
2. **Загрузка файлов**:
- Сервер обрабатывает все загружаемые файлы. Если файл является изображением, создается его миниатюра. И миниатюра, и оригинальное изображение загружаются в S3. Для остальных файлов выполняется простая загрузка в S3 без создания миниатюр.
- `reaction`
- `shout`
- `follower:<author_id>`
- `chat:<chat_id>`
3. **Создание миниатюр**:
- Для всех загружаемых изображений сервер автоматически создает миниатюры размером 320x320 пикселей. Миниатюры сохраняются как отдельные файлы в том же S3 bucket, что и оригинальные изображения.
Сервис пересылает сообщения из этих каналов, которые предназначены пользователю, подписавшемуся на Server-Sent Events (SSE) по адресу `/connect`. Для авторизации подписки используется токен, который передается клиентом в заголовке `Authorization`, или в пути `/connect/{token}`, или в переменной запроса `/connect/?token={token}`.
4. **Определение MIME-типа и расширения файла**:
- MIME-тип и расширение файла определяются автоматически на основе имени файла и его содержимого с использованием библиотеки `mime_guess`.
При завершении подключения, все подписки автоматически отменяются, так как они связаны с конкретным подключением. Если пользователь снова подключается, процесс подписки повторяется.
5. **Загрузка файлов в S3**:
- Все файлы, включая миниатюры и оригиналы изображений, загружаются в указанный S3 bucket. Сформированные URL-адреса файлов возвращаются клиенту.
6. **Управление квотами**:
- Для каждого пользователя устанавливается квота на загрузку данных, которая составляет 1 ГБ в неделю. Перед загрузкой каждого нового файла проверяется, не превысит ли его размер текущую квоту пользователя. Если квота будет превышена, загрузка файла будет отклонена. После успешной загрузки файл и его размер регистрируются в Redis, и квота пользователя обновляется.
### Формат сообщений межсервисной коммуникации
7. **Сохранение информации о загруженных файлах в Redis**:
- Имя каждого загруженного файла сохраняется в Redis для отслеживания загруженных пользователем файлов. Это позволяет учитывать квоты и управлять пространством, занимаемым файлами.
Между сервисами пересылаются целые сущности и типизация действий с ними, поля стандартного redis-сообщения:
### Основные функции
- `action` наименование операции, примеры: "create" | "delete" | "update" | "join" | "left"
- `payload` json одной из сущностей: Reaction | Shout | Author | Chat | Message
- Миниатюры: Автоматическое создание миниатюр для изображений.
- S3/STORJ интеграция: Загрузка файлов в через `aws-sdk-s3` и возврат публичных URL-адресов.
- Управление квотами: Ограничение объема загружаемых данных для каждого пользователя с использованием Redis.
- Отслеживание файлов: Хранение информации о загруженных файлах в Redis для управления квотами.