chore: Добавлены разделы про код, тестирование и запуск в README
This commit is contained in:
89
README.md
89
README.md
@ -1,4 +1,5 @@
|
|||||||
# p1ctos4ve
|
# p1ctos4ve
|
||||||
|
|
||||||
Проект в рамках дисциплины «Конструирование программного обеспечения»: сервис сохранения и организации медиа со внешних ресурсов
|
Проект в рамках дисциплины «Конструирование программного обеспечения»: сервис сохранения и организации медиа со внешних ресурсов
|
||||||
|
|
||||||
## Участники
|
## Участники
|
||||||
@ -44,29 +45,101 @@
|
|||||||
#### Компоненты
|
#### Компоненты
|
||||||
[[assets/c4-3components.jpg]]
|
[[assets/c4-3components.jpg]]
|
||||||
|
|
||||||
#### Код
|
|
||||||
> WIP
|
|
||||||
|
|
||||||
### Контракты API
|
### Контракты API
|
||||||
Краткая информация о методах API доступна в [assets/API.md](assets/API.md), а полная документация - в [Scalar](https://scalar.com/) на эндпоинте `/openapi`.
|
Краткая информация о методах API доступна в [assets/API.md](assets/API.md), а полная документация - в [Scalar](https://scalar.com/) на эндпоинте `/openapi`.
|
||||||
|
|
||||||
### Схема БД и оправдание с точки зрения нефункциональных требований
|
### Схема БД и оправдание с точки зрения нефункциональных требований
|
||||||
> WIP
|
|
||||||
|
[[assets/db.png]]
|
||||||
|
|
||||||
|
#### Нефункциональные требвания
|
||||||
|
|
||||||
|
##### Оптимизация индексов и связей
|
||||||
|
|
||||||
|
В схеме присутствуют индексы на полях, которые часто участвуют в поисковых запросах, например, `userId`, `visibility`, `shareUrl`, `tags`. Это повышает производительность выборок и операций поиска.
|
||||||
|
|
||||||
|
Наличие внешних ключей с каскадным удалением гарантирует целостность данных и упрощает управление связанными данными между таблицами.
|
||||||
|
|
||||||
|
##### Масштабируемость и расширяемость
|
||||||
|
|
||||||
|
Пользователи, сессии и аккаунты разделены по разным таблицам - это упрощает работу и интеграцию способов авторизации пользователей в сервисе.
|
||||||
|
|
||||||
|
##### Безопасность и уникальность данных
|
||||||
|
|
||||||
|
Схема предотвращает дублирование данных посредством использования уникальных индексов.
|
||||||
|
Например, на email и token в сессиях, shareUrl в сейвах.
|
||||||
|
|
||||||
### Схема масштабирования сервиса при росте нагрузки в 10 раз
|
### Схема масштабирования сервиса при росте нагрузки в 10 раз
|
||||||
|
|
||||||
Для возможности масштабирования можно использовать следующие подходы:
|
Для возможности масштабирования можно использовать следующие подходы:
|
||||||
|
|
||||||
- Размещение бекенда за балансировщиком нагрузки (например, Nginx, Traefik или Caddy): трафик будет распределяться равномерно между двумя или более экземплярами API
|
- Размещение бекенда за балансировщиком нагрузки (например, Nginx, Traefik или Caddy): трафик будет распределяться равномерно между двумя или более экземплярами API
|
||||||
- Репликация БД - основная база принимает запись, а одна или несколько реплик получают изменения по журналу (WAL) и обслуживают преимущественно чтение.
|
- Репликация БД - основная база принимает запись, а одна или несколько реплик получают изменения по журналу (WAL) и обслуживают преимущественно чтение.
|
||||||
- Кеширование частозапрашиваемых данных через Redis: результаты чтения (например, списки, карточки по ID, агрегации, результаты поиска с популярными фильтрами) складываются в KV хранилище с некоторым TTL, что позволяет сократить время ответа на повторяющиеся запросы
|
- Кеширование частозапрашиваемых данных через Redis: результаты чтения (например, списки, карточки по ID, агрегации, результаты поиска с популярными фильтрами) складываются в KV хранилище с некоторым TTL, что позволяет сократить время ответа на повторяющиеся запросы
|
||||||
|
|
||||||
## Кодирование и отладка
|
## Кодирование и отладка
|
||||||
> WIP
|
|
||||||
|
Для разработки сервиса был использован следующий набор технологий:
|
||||||
|
|
||||||
|
**Бекенд**
|
||||||
|
|
||||||
|
- *Bun* в качестве рантайма
|
||||||
|
- Бекенд-фреймворк *Elysia*
|
||||||
|
- *Drizzle ORM* для работы с базой данных *PostgreSQL*
|
||||||
|
- Фреймворк *Better Auth* для авторизации и аутентификаци пользователей
|
||||||
|
- *SeaweedFS* для хранения UGC
|
||||||
|
- *Redis* для кеширования частозапрашиваемых данных
|
||||||
|
|
||||||
|
**Фронтенд**
|
||||||
|
|
||||||
|
- Фреймворк и библиотеки *Expo* для реализации мобильного клиента сервиса
|
||||||
|
- *Tailwind* + *Nativewind* для стилизации
|
||||||
|
- Набор иконок *Lucide*
|
||||||
|
|
||||||
|
Для запуска в режиме разработки нужно:
|
||||||
|
|
||||||
|
**Бекенд**
|
||||||
|
|
||||||
|
- Установить зависимости: `bun i`
|
||||||
|
- В директории `apps/backend` заполнить файл `.env` на основе `.env.example`
|
||||||
|
- Прописать `bun dev` в директории бекенда или `bun backend:dev` в корне репозитория
|
||||||
|
|
||||||
|
**Фронтенд**
|
||||||
|
|
||||||
|
- В директории `apps/frontend` заполнить файл `.env` на основе `.env.example`
|
||||||
|
- Прописать `bun start` в директории фронтенда. Приложение можно отлаживать на мобильном устройстве через песочницу Expo Go.
|
||||||
|
|
||||||
## Unit-тестирование
|
## Unit-тестирование
|
||||||
> WIP
|
|
||||||
|
В проекте есть тесты, проверяющие корректность работы отдельных элементов сервисов бекенда:
|
||||||
|
- `s3.service.test.ts` - проверяет корректность работы автоопределения типов медиа
|
||||||
|
- `saves.service.test.ts` - моковые тесты для проверки работы сервиса сейвов
|
||||||
|
- `scraper.service.test.ts` - тесты для проверки работы вычисления типов медиа на основе URL
|
||||||
|
|
||||||
|
Для запуска требуется прописать `bun run test:unit` из директории `apps/backend`.
|
||||||
|
|
||||||
## Интеграционное тестирование
|
## Интеграционное тестирование
|
||||||
> WIP
|
|
||||||
|
Также реализованы e2e-тесты для проверки авторизации и сейвов.
|
||||||
|
|
||||||
|
Предварительно запустив бекенд, из директории бекенда нужно запустить `bun run test:e2e`.
|
||||||
|
|
||||||
## Сборка и запуск
|
## Сборка и запуск
|
||||||
> WIP
|
|
||||||
|
Для запуска бекенда и его зависимостей на продакшене достаточно выполнить:
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://git.inkling.su/p1ctos4ve/app p1ctos4ve
|
||||||
|
cd p1ctos4ve
|
||||||
|
chmod +x ./scripts/run.sh
|
||||||
|
./scripts/run.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт `run.sh`:
|
||||||
|
- Запустит PostgreSQL, SeaweedFS и Redis;
|
||||||
|
- Соберет образ бекенда в Docker-контейнер;
|
||||||
|
- Запустит unit и e2e-тесты;
|
||||||
|
- Поднимет сервер бекенда на `localhost:3000`
|
||||||
|
|
||||||
|
В дальнейшем для взаимодействия с API можно открыть Scalar на `localhost:3000/openapi` в браузере.
|
||||||
|
|
||||||
|
|||||||
@ -7,8 +7,8 @@
|
|||||||
"start": "bun run dist/index.js",
|
"start": "bun run dist/index.js",
|
||||||
"test": "bun test",
|
"test": "bun test",
|
||||||
"test:watch": "bun test --watch",
|
"test:watch": "bun test --watch",
|
||||||
"test:unit": "bun test ./src/tests/unit/**/*.test.ts",
|
"test:unit": "bun test ./src/tests/unit/*.test.ts",
|
||||||
"test:e2e": "bun test --preload ./src/tests/setup.ts ./src/tests/e2e/**/*.test.ts",
|
"test:e2e": "bun test --preload ./src/tests/setup.ts ./src/tests/e2e/*.test.ts",
|
||||||
"db:generate": "drizzle-kit generate",
|
"db:generate": "drizzle-kit generate",
|
||||||
"db:migrate": "bun run src/db/migrate.ts",
|
"db:migrate": "bun run src/db/migrate.ts",
|
||||||
"db:studio": "drizzle-kit studio"
|
"db:studio": "drizzle-kit studio"
|
||||||
|
|||||||
BIN
assets/db.png
Normal file
BIN
assets/db.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 114 KiB |
Reference in New Issue
Block a user