Бэкенд для хакатона Atom DBRO
Настройка через переменную окружения DATABASE_URL:
DATABASE_URL=postgresql://user:password@localhost:5432/atom_dbro
Сервис поддерживает работу с любыми S3-совместимыми хранилищами (AWS S3, Beget, Yandex Object Storage, DigitalOcean Spaces, MinIO и др.).
Минимальная конфигурация:
S3_BUCKET_NAME=your-bucket-name
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key
S3_REGION=us-east-1Для кастомных провайдеров (Beget, Yandex и т.д.):
S3_ENDPOINT=https://s3.ru1.storage.beget.cloud
S3_BUCKET_NAME=your-bucket-name
S3_ACCESS_KEY_ID=your-access-key
S3_SECRET_ACCESS_KEY=your-secret-key
S3_REGION=ru1Подробная документация по настройке S3: docs/S3_CONFIGURATION.md
API настроен для работы с фронтендом на localhost:5173 (Vite dev server). По умолчанию разрешены следующие источники:
http://localhost:5173http://localhost:3000http://127.0.0.1:5173http://127.0.0.1:3000
Для настройки других источников используйте переменную окружения CORS_ORIGINS:
CORS_ORIGINS=http://localhost:5173,https://yourdomain.com,https://app.yourdomain.comПримечание: В development режиме (NODE_ENV !== 'production') автоматически разрешаются все локальные адреса (localhost:* и 127.0.0.1:*).
Приложение поддерживает экспорт метрик Prometheus для мониторинга.
Конфигурация через переменные окружения:
# Включить/выключить Prometheus (по умолчанию: true)
PROMETHEUS_ENABLED=true
# Путь для endpoint метрик (по умолчанию: /metrics)
PROMETHEUS_PATH=/metrics
# Включить стандартные метрики Node.js (по умолчанию: true)
PROMETHEUS_DEFAULT_METRICS=true
# Дополнительные метки для всех метрик (JSON формат, опционально)
PROMETHEUS_DEFAULT_LABELS={"app":"atom-dbro","env":"production"}Доступ к метрикам:
После запуска приложения метрики доступны по адресу (с учетом глобального префикса admin/api):
http://localhost:3000/admin/api/metrics
Примечание:
- Если
PROMETHEUS_ENABLED=false, endpoint не будет создан - Путь
PROMETHEUS_PATHуказывается относительно корня приложения, но с учетом глобального префиксаadmin/api - Для доступа к метрикам без префикса установите
PROMETHEUS_PATH=/metricsи используйтеhttp://localhost:3000/metrics
Доступные метрики:
Приложение автоматически собирает следующие кастомные метрики:
-
http_requests_total- Общее количество HTTP запросов- Метки:
method(HTTP метод),route(маршрут),status_code(код ответа)
- Метки:
-
http_request_duration_seconds- Длительность HTTP запросов в секундах- Метки:
method(HTTP метод),route(маршрут) - Бакеты: 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10 секунд
- Метки:
-
http_errors_total- Общее количество HTTP ошибок- Метки:
method(HTTP метод),route(маршрут),status_code(код ошибки),error_type(тип ошибки)
- Метки:
-
login_attempts_total- Общее количество попыток входа- Метки:
status(success/failure),reason(invalid_credentials, user_not_found, user_blocked, unauthorized, unknown)
- Метки:
-
login_duration_seconds- Длительность попыток входа в секундах- Метки:
status(success/failure) - Бакеты: 0.01, 0.05, 0.1, 0.25, 0.5, 1, 2, 5 секунд
- Метки:
Все метрики автоматически собираются:
- HTTP метрики (1-3) - для всех HTTP запросов через глобальный interceptor
- Метрики входа (4-5) - для попыток входа через LoginLoggingInterceptor
# Установка зависимостей
npm install
# Применение миграций
npm run db:migrate
# Запуск в режиме разработки
npm run start:dev
# Запуск в продакшене
npm run start:prodПосле запуска приложения Swagger UI доступен по адресу:
http://localhost:3000/api
API использует JWT (JSON Web Tokens) для аутентификации. При успешном входе пользователь получает два токена:
- access_token - короткоживущий токен для доступа к защищенным ресурсам (по умолчанию 24 часа)
- refresh_token - долгоживущий токен для обновления access_token (по умолчанию 7 дней)
POST /auth/register
Body: {
"firstName": "Иван",
"lastName": "Иванов",
"email": "[email protected]",
"password": "password123",
"confirmPassword": "password123"
}
POST /auth/login
Body: {
"email": "[email protected]",
"password": "password123"
}
Response: {
"access_token": "...",
"refresh_token": "...",
"user": {
"id": 1,
"email": "[email protected]",
"firstName": "Иван",
"lastName": "Иванов"
}
}
POST /auth/refresh
Body: {
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Response: {
"access_token": "...",
"refresh_token": "...",
"user": { ... }
}
Примечание: Endpoint требует валидный refresh token (авторизованный пользователь).
Для доступа к защищенным эндпоинтам добавьте токен в заголовок Authorization:
Authorization: Bearer <access_token>
Срок действия токенов настраивается через переменные окружения:
JWT_EXPIRES_IN=24h # Срок действия access token (по умолчанию 24h)
JWT_REFRESH_EXPIRES_IN=7d # Срок действия refresh token (по умолчанию 7d)
JWT_SECRET=your-secret-key # Секретный ключ для подписи access токенов
JWT_REFRESH_SECRET=your-refresh-secret-key # Секретный ключ для подписи refresh токенов (опционально, по умолчанию используется JWT_SECRET)src/organization/- модуль организаций с поддержкой галереи изображенийsrc/database/- схемы базы данныхsrc/auth/- аутентификация и авторизацияdocs/- документация