chore: Добавлены разделы про код, тестирование и запуск в README
This commit is contained in:
89
README.md
89
README.md
@ -1,4 +1,5 @@
|
||||
# p1ctos4ve
|
||||
|
||||
Проект в рамках дисциплины «Конструирование программного обеспечения»: сервис сохранения и организации медиа со внешних ресурсов
|
||||
|
||||
## Участники
|
||||
@ -44,29 +45,101 @@
|
||||
#### Компоненты
|
||||
[[assets/c4-3components.jpg]]
|
||||
|
||||
#### Код
|
||||
> WIP
|
||||
|
||||
### Контракты API
|
||||
Краткая информация о методах API доступна в [assets/API.md](assets/API.md), а полная документация - в [Scalar](https://scalar.com/) на эндпоинте `/openapi`.
|
||||
|
||||
### Схема БД и оправдание с точки зрения нефункциональных требований
|
||||
> WIP
|
||||
|
||||
[[assets/db.png]]
|
||||
|
||||
#### Нефункциональные требвания
|
||||
|
||||
##### Оптимизация индексов и связей
|
||||
|
||||
В схеме присутствуют индексы на полях, которые часто участвуют в поисковых запросах, например, `userId`, `visibility`, `shareUrl`, `tags`. Это повышает производительность выборок и операций поиска.
|
||||
|
||||
Наличие внешних ключей с каскадным удалением гарантирует целостность данных и упрощает управление связанными данными между таблицами.
|
||||
|
||||
##### Масштабируемость и расширяемость
|
||||
|
||||
Пользователи, сессии и аккаунты разделены по разным таблицам - это упрощает работу и интеграцию способов авторизации пользователей в сервисе.
|
||||
|
||||
##### Безопасность и уникальность данных
|
||||
|
||||
Схема предотвращает дублирование данных посредством использования уникальных индексов.
|
||||
Например, на email и token в сессиях, shareUrl в сейвах.
|
||||
|
||||
### Схема масштабирования сервиса при росте нагрузки в 10 раз
|
||||
|
||||
Для возможности масштабирования можно использовать следующие подходы:
|
||||
|
||||
- Размещение бекенда за балансировщиком нагрузки (например, Nginx, Traefik или Caddy): трафик будет распределяться равномерно между двумя или более экземплярами API
|
||||
- Репликация БД - основная база принимает запись, а одна или несколько реплик получают изменения по журналу (WAL) и обслуживают преимущественно чтение.
|
||||
- Кеширование частозапрашиваемых данных через 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-тестирование
|
||||
> 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",
|
||||
"test": "bun test",
|
||||
"test:watch": "bun test --watch",
|
||||
"test:unit": "bun test ./src/tests/unit/**/*.test.ts",
|
||||
"test:e2e": "bun test --preload ./src/tests/setup.ts ./src/tests/e2e/**/*.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",
|
||||
"db:generate": "drizzle-kit generate",
|
||||
"db:migrate": "bun run src/db/migrate.ts",
|
||||
"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