Skip to content

Web2Bizz/atom-dbro-email-service

Repository files navigation

Atom DBRO Email Service

Email service built with NestJS and TypeScript. All email sending is processed asynchronously through RabbitMQ for better scalability and reliability.

📋 Описание

Сервис для работы с электронной почтой, построенный на NestJS и TypeScript. Поддерживает:

  • ✅ Асинхронную отправку email через RabbitMQ
  • ✅ Автоматическую обработку сообщений из очереди
  • ✅ Автоматическое переподключение к RabbitMQ
  • ✅ Health checks для всех сервисов
  • ✅ Docker поддержка (production и development)
  • ✅ Гибкая конфигурация через environment variables

🚀 Быстрый старт

Вариант 1: Docker (рекомендуется)

# 1. Создайте .env файл
cp .env.example .env

# 2. Отредактируйте .env с вашими настройками почты

# 3. Запустите все сервисы
docker-compose up -d

# 4. Проверьте статус
curl http://localhost:3000/health

📖 Подробная инструкция: DOCKER.md

Вариант 2: Локальная установка

# 1. Установите зависимости
npm install

# 2. Создайте .env файл (см. QUICK_START.md)

# 3. Запустите приложение
npm run start:dev

📖 Подробная инструкция: QUICK_START.md

📦 Установка

npm install

⚙️ Настройка

Переменные окружения

Создайте файл .env в корне проекта:

# Application
NODE_ENV=development
PORT=3000
APP_NAME=Atom DBRO Email Service

# Email Configuration
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USER=your-email@gmail.com
MAIL_PASSWORD=your-app-password
MAIL_FROM=noreply@example.com
MAIL_SECURE=false

# RabbitMQ Configuration (обязательно)
RABBITMQ_URL=amqp://localhost:5672
RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VHOST=/
RABBITMQ_QUEUE=email_queue
RABBITMQ_EXCHANGE=email_exchange
RABBITMQ_HEARTBEAT=60

📖 Подробная настройка: CONFIGURATION.md

🏃 Запуск

# Режим разработки с hot reload
npm run start:dev

# Режим отладки
npm run start:debug

# Production режим
npm run start:prod

# Обычный запуск
npm run start

После запуска приложение будет доступно по адресу: http://localhost:3000

📡 API Endpoints

Email Service

Method Endpoint Описание
GET / Приветственное сообщение
GET /config Конфигурация сервисов
GET /health Статус всех сервисов
POST /send-mail Постановка email в очередь RabbitMQ

RabbitMQ Service

Method Endpoint Описание
GET /rabbitmq/status Статус подключения
POST /rabbitmq/publish Публикация в exchange
POST /rabbitmq/send-to-queue Отправка в очередь

Примеры запросов

Отправка email (через RabbitMQ):

curl -X POST http://localhost:3000/send-mail \
  -H "Content-Type: application/json" \
  -d '{
    "to": "recipient@example.com",
    "subject": "Test Email",
    "html": "<h1>Hello!</h1><p>This is a test email.</p>"
  }'

Ответ:

{
  "success": true,
  "message": "Email queued for sending",
  "status": "pending"
}

Проверка здоровья:

curl http://localhost:3000/health

📝 Полные примеры: API.md

🔄 Как это работает

  1. Клиент отправляет запрос на POST /send-mail
  2. Сервис публикует сообщение в RabbitMQ exchange с routing key email.send
  3. EmailConsumer автоматически обрабатывает сообщение из очереди
  4. Email отправляется через SMTP (Nodemailer)
  5. Клиент получает мгновенный ответ о том, что email поставлен в очередь

Преимущества:

  • ✅ Быстрый ответ клиенту (не ждем отправки email)
  • ✅ Масштабируемость (можно запустить несколько workers)
  • ✅ Надежность (сообщения не потеряются при сбоях)
  • ✅ Возможность retry при ошибках

🧪 Тестирование

# Unit тесты
npm run test

# Unit тесты в watch режиме
npm run test:watch

# E2E тесты
npm run test:e2e

# Покрытие тестами
npm run test:cov

🔨 Сборка

# Сборка проекта
npm run build

# Production сборка
npm run start:prod

🧹 Линтинг и форматирование

# Запуск линтера
npm run lint

# Форматирование кода
npm run format

📁 Структура проекта

atom-dbro-email-service/
├── src/
│   ├── config/              # Конфигурация приложения
│   │   ├── configuration.ts
│   │   └── env.validation.ts
│   ├── mail/                # Mail модуль
│   │   ├── dto/
│   │   ├── mail.module.ts
│   │   └── mail.service.ts
│   ├── rabbitmq/            # RabbitMQ модуль
│   │   ├── dto/
│   │   ├── rabbitmq.module.ts
│   │   └── rabbitmq.service.ts
│   ├── email-consumer/      # Email consumer для RabbitMQ
│   │   ├── email-consumer.service.ts
│   │   └── email-consumer.module.ts
│   ├── types/               # TypeScript типы
│   ├── main.ts              # Точка входа
│   ├── app.module.ts        # Главный модуль
│   ├── app.controller.ts    # API контроллер
│   └── app.service.ts       # Сервис приложения
├── test/                    # Тесты
├── Dockerfile               # Docker образ
├── docker-compose.yml       # Production окружение
├── docker-compose.dev.yml   # Development окружение
└── package.json

🛠️ Технологии

Core

Email & Messaging

Validation & Quality

📚 Документация

Быстрый старт

  • 🚀 QUICK_START.md - Запуск за 5 минут
  • 🐳 DOCKER.md - Полное руководство по Docker

Конфигурация

Сервисы

  • 📝 API.md - Примеры использования API
  • 🐰 RABBITMQ.md - Руководство по RabbitMQ

🔒 Безопасность

  • ✅ Переменные окружения для секретов
  • ✅ Непривилегированный пользователь в Docker
  • ✅ Валидация входных данных
  • ✅ Health checks для мониторинга

⚠️ Важно: Никогда не коммитьте файл .env в Git!

🐛 Устранение проблем

Проблемы с почтой

Ошибка: mail: "disconnected"

Решение:

  1. Проверьте MAIL_HOST, MAIL_PORT в .env
  2. Проверьте MAIL_USER и MAIL_PASSWORD
  3. Для Gmail: используйте пароль приложения, не основной пароль
  4. Проверьте интернет-соединение

Проблемы с RabbitMQ

Ошибка: rabbitmq: "disconnected"

Решение:

  1. Убедитесь, что RabbitMQ запущен
  2. Проверьте RABBITMQ_HOST и RABBITMQ_PORT в .env
  3. Проверьте учетные данные

Порт занят

Ошибка: Port 3000 is already in use

Решение: Измените PORT в .env файле:

PORT=3001

📄 License

UNLICENSED

🤝 Поддержка

Если возникли вопросы:

  1. Проверьте QUICK_START.md
  2. Изучите CONFIGURATION.md
  3. Посмотрите примеры в API.md

Версия: 0.0.1
Статус: ✅ Production Ready

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published