Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ node_modules
npm-debug.log
yarn-error.log
pnpm-debug.log
infra/k6/node_modules

# Build output
dist
Expand Down
2 changes: 2 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ PORT=3000
NODE_ENV=development
COOKIE_SECRET=same-serious-secret
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
THROTTLE_LIMIT=100
THROTTLE_TTL=60000

# --- POSTGRES ---
DB_SCHEMA=base
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,6 @@ pids
*.pid
*.seed
*.pid.lock
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

infra/k6/data/*.json
1 change: 1 addition & 0 deletions Dockerfile.prod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ COPY pnpm-lock.yaml ./

# Загружаем всё в виртуальное хранилище.
# Если lock-файл не менялся, этот слой будет взят из кэша
ENV CI=true
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm fetch

Expand Down
29 changes: 27 additions & 2 deletions infra/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,32 @@
# Command to run infra at dev mode
# Инфраструктура проекта

Run it by pwd at root! Not include at this dir
Данный каталог содержит конфигурации для локальной разработки и инструменты для нагрузочного тестирования.

## Модули инфраструктуры

### dev

Конфигурации Docker Compose для поднятия окружения разработки (базы данных, очереди, кеш).

Команда для запуска из корня проекта:

```sh
docker compose -f ./infra/dev/compose.dev.yaml --env-file .env --profile infra up --build -d -V
```

### k6

Сценарии нагрузочного и стресс-тестирования модулей API. Инструкции по установке и запуску находятся в infra/k6/README.md.

Команды запуска из **корня** **(../cwd)** проекта:

```sh
pnpm run k6:all
pnpm run k6:auth
pnpm run k6:team
pnpm run k6:projects
pnpm run k6:user
pnpm run k6:board
pnpm run k6:tasks
pnpm run k6:smoke
```
35 changes: 18 additions & 17 deletions infra/dev/compose.dev.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: '3.9'
version: "3.9"

name: task-tracker-api

Expand All @@ -10,7 +10,7 @@ services:
env_file:
- .env
ports:
- '3000:3000'
- "3000:3000"
depends_on:
database:
condition: service_healthy
Expand All @@ -21,10 +21,10 @@ services:
deploy:
resources:
limits:
cpus: '2.0'
cpus: "2.0"
memory: 1024M
reservations:
cpus: '0.5'
cpus: "0.5"
memory: 256M

database:
Expand All @@ -39,40 +39,41 @@ services:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE}
ports:
- '6000:5432'
- "6000:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
healthcheck:
test: [
'CMD-SHELL',
'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -q
|| exit 1',
test:
[
"CMD-SHELL",
"pg_isready -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\" -q
|| exit 1",
]
interval: 5s
timeout: 5s
retries: 5
profiles: ['infra']
profiles: [ "infra" ]

redis:
hostname: redis
container_name: redis
image: redis:7-alpine
restart: always
ports:
- '${REDIS_PORT:-6999}:6379'
- "${REDIS_PORT:-6999}:6379"
command: redis-server --save 60 1 --loglevel notice
volumes:
- redis_data:/data
networks:
- backend
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
timeout: 3s
retries: 5
profiles: ['infra']
profiles: [ "infra" ]

minio:
hostname: minio
Expand All @@ -83,14 +84,14 @@ services:
MINIO_ROOT_USER: ${S3_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY}
ports:
- '9000:9000' # API
- '9001:9001' # Console (UI)
- "9000:9000" # API
- "9001:9001" # Console (UI)
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
networks:
- backend
profiles: ['infra']
profiles: [ "infra" ]

minio-init:
image: minio/mc:latest
Expand All @@ -101,7 +102,7 @@ services:
MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY}
networks:
- backend
profiles: ['infra']
profiles: [ "infra" ]
entrypoint: >
/bin/sh -c " sleep 5; mc alias set myminio http://minio:9000
${S3_ACCESS_KEY} ${S3_SECRET_KEY}; mc mb myminio/${S3_BUCKET_NAME}
Expand Down
78 changes: 78 additions & 0 deletions infra/k6/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# Нагрузочное тестирование k6

В данном каталоге расположены сценарии для проведения нагрузочного и стресс-тестирования API task-backend. Инструментарий базируется на k6 и интегрирован в монорепозиторий как отдельный пакет воркспейса.

## Предварительные требования

Для выполнения сценариев необходимо наличие установленного бинарного файла k6 в операционной системе. Пакет не устанавливается через менеджеры пакетов Node.js автоматически.

### Инструкции по установке

- Windows: winget install k6
- macOS: brew install k6
- Linux: sudo apt-get install k6

После установки необходимо перезапустить терминал для обновления переменных окружения.

## Структура каталогов

- modules/ — Атомарные функции для взаимодействия с конкретными модулями системы (auth, team, projects, user, board, board-columns, tasks). Содержат логику запросов и проверки статусов.
- scenarios/ — Комплексные пользовательские сценарии, имитирующие реальное поведение (например, создание полной структуры от проекта до задачи).
- scripts/ — Вспомогательные скрипты и быстрые тесты (Smoke tests).
- common/ — Общая конфигурация, параметры нагрузки (stages), пороговые значения (thresholds) и функции генерации тестовых данных.

## Команды запуска

Все команды должны запускаться из корневой директории проекта.

- pnpm k6:seed — Сидинг тестовых данных для k6 (PostgreSQL + Redis).
- pnpm k6:clear — Удаление k6-тестовых данных из PostgreSQL и Redis.
- pnpm k6:smoke — Запуск проверочного теста с минимальной нагрузкой.
- pnpm k6:all — Проведение полного стресс-теста всех модулей API.
- pnpm k6:auth — Тестирование производительности модуля авторизации.
- pnpm k6:team — Тестирование производительности модуля команд.
- pnpm k6:projects — Тестирование производительности модуля проектов.
- pnpm k6:user — Тестирование производительности модуля пользователей.
- pnpm k6:board — Тестирование производительности модуля досок.
- pnpm k6:tasks — Тестирование производительности модуля задач.

## Использование переменных окружения

Для смены целевого адреса сервера без изменения кода сценариев используется флаг -e:

pnpm --filter @project/performance-tests exec k6 run -e BASE_URL=https://api.example.com scenarios/stress-full.js

## Анализ результатов

При анализе отчетов следует ориентироваться на следующие метрики:

- http_req_duration: Общее время обработки запроса сервером.
- http_req_failed: Процент запросов, завершившихся ошибкой.
- vus: Количество виртуальных пользователей в активной фазе теста.
- thresholds: Статус выполнения установленных критериев качества (SLA).

## Конфигурация и профили нагрузки

Система поддерживает динамическое переключение интенсивности тестирования с помощью переменных окружения.

### Доступные профили (PROFILE)

В `common/config.js` определены следующие уровни нагрузки:

| Профиль | Описание | Нагрузка |
| :------- | :--------------------------- | :------------------- |
| `smoke` | Быстрая проверка доступности | 1 VU, 10 секунд |
| `low` | Базовая стабильность | 10 VUs, разгон 30с |
| `medium` | Стандартная рабочая нагрузка | 50 VUs, плато 3 мин |
| `high` | Проверка предела прочности | 300 VUs, плато 5 мин |

### Примеры запуска с профилями

Для управления нагрузкой передайте переменную `PROFILE`:

```sh
pnpm k6:tasks -e PROFILE=medium

# Запуск стресс-теста на кастомный URL
pnpm k6:all -e PROFILE=high -e BASE_URL=[http://staging-api.local](http://staging-api.local)
```
Loading
Loading