Бэкенд для хакатона 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:*).
Сервис поддерживает интеграцию с RabbitMQ для отправки сообщений в очереди и exchange.
Минимальная конфигурация (значения по умолчанию):
RABBITMQ_HOSTNAME=localhost
RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guestИли используйте полный URL:
RABBITMQ_URL=amqp://username:password@hostname:5672Тестовые endpoints:
GET /api/v1/rabbitmq/health- проверка подключения к RabbitMQPOST /api/v1/rabbitmq/send- отправка сообщения в очередьPOST /api/v1/rabbitmq/publish- публикация сообщения в exchange
Пример отправки сообщения в очередь:
POST /api/v1/rabbitmq/send
{
"queue": "test-queue",
"message": {
"text": "Hello, RabbitMQ!",
"timestamp": "2024-01-01T00:00:00Z"
},
"options": {
"durable": true,
"persistent": true
}
}Сервис использует Redis для хранения токенов восстановления пароля и других временных данных.
Минимальная конфигурация (значения по умолчанию):
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0С паролем:
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your-redis-password
REDIS_DB=0Дополнительные настройки:
FORGOT_PASSWORD_TOKEN_TTL=3600 # TTL токена восстановления пароля в секундах (по умолчанию 3600 = 1 час)
FRONTEND_URL=http://localhost:5173 # Базовый URL фронтенда (используется для формирования ссылок в письмах)Redis используется для:
- Хранения токенов восстановления пароля (структура: token, email, date)
- Временного хранения данных с автоматическим истечением срока действия
- Токен используется как ключ в Redis (ключ:
forgot-password:{token})
Примечание: При восстановлении пароля письмо отправляется через RabbitMQ в очередь email_queue. Убедитесь, что у вас настроен consumer для этой очереди, который будет отправлять письма. Ссылка формируется как ${FRONTEND_URL}/reset-password?token={token}.
Сервис использует внешний API для генерации аватарок пользователей при регистрации.
Конфигурация:
AVAGEN_BASE_URL=http://82.202.140.37:12745 # Базовый URL API для запросов (генерация аватарок, получение палитры)
AVAGEN_SOURCE_URL=https://it-hackathon-team05.mephi.ru/files # Базовый URL для формирования URL аватарок при сохранении в БД (опционально, по умолчанию используется AVAGEN_BASE_URL)Примечание:
AVAGEN_BASE_URLиспользуется для выполнения запросов к API генерации аватарокAVAGEN_SOURCE_URLиспользуется для формирования URL, которые сохраняются в базе данных- Если переменная
AVAGEN_SOURCE_URLне указана, используется значениеAVAGEN_BASE_URL - Если переменная
AVAGEN_BASE_URLне указана, используется значение по умолчаниюhttp://82.202.140.37:12745 - URL аватарок формируются как
${AVAGEN_SOURCE_URL}/api/v1/{avatarId}?size={size}, гдеsizeможет быть от 4 до 9
Пример:
- API возвращает ID:
c2eaf2cb-0665-477c-87e0-dd2055041a15 - При
AVAGEN_SOURCE_URL=https://it-hackathon-team05.mephi.ru/filesв БД сохранится:https://it-hackathon-team05.mephi.ru/files/api/v1/c2eaf2cb-0665-477c-87e0-dd2055041a15?size=4https://it-hackathon-team05.mephi.ru/files/api/v1/c2eaf2cb-0665-477c-87e0-dd2055041a15?size=5- ... и так далее до size=9
# Установка зависимостей
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": "ivan@example.com",
"password": "password123",
"confirmPassword": "password123"
}
POST /auth/login
Body: {
"email": "ivan@example.com",
"password": "password123"
}
Response: {
"access_token": "...",
"refresh_token": "...",
"user": {
"id": 1,
"email": "ivan@example.com",
"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/- документация