Skip to content

Commit 9c79f34

Browse files
committed
docs: update README.md detailing AWS cloud architecture and local setup
1 parent 0f37e85 commit 9c79f34

1 file changed

Lines changed: 81 additions & 93 deletions

File tree

README.md

Lines changed: 81 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,122 +1,110 @@
1-
# 🚀 DotCruz Notifications
1+
# 🚀 DotCruz Notifications (API)
22

3-
![.NET 10](https://img.shields.io/badge/.NET-10.0-512bd4?style=for-the-badge&logo=dotnet)
4-
![MongoDB](https://img.shields.io/badge/MongoDB-47A248?style=for-the-badge&logo=mongodb&logoColor=white)
5-
![RabbitMQ](https://img.shields.io/badge/RabbitMQ-FF6600?style=for-the-badge&logo=rabbitmq&logoColor=white)
6-
![Clean Architecture](https://img.shields.io/badge/Architecture-Clean-blue?style=for-the-badge)
3+
DotCruz Notifications é o serviço central de mensageria e gestão de notificações do ecossistema **DotCruz**. Construído em **.NET 10** utilizando **Clean Architecture** e princípios de **Domain-Driven Design (DDD)**, ele atua como a interface administrativa e API de entrada para criação de templates de notificação e agendamentos de disparos.
74

8-
DotCruz Notifications é um microserviço robusto de alta performance projetado para centralizar a gestão e o disparo de notificações
9-
multiplataforma. Construído com as tecnologias mais recentes do ecossistema .NET, o sistema resolve o desafio de desacoplar o envio de
10-
mensagens (E-mail, SMS, Push) da lógica de negócio principal dos demais serviços da organização.
5+
---
116

12-
## 💡 Por que este projeto?
7+
## ☁️ Arquitetura em Nuvem & Processamento
138

14-
Em arquiteturas distribuídas, delegar o envio de notificações para um serviço especializado garante:
9+
O sistema adota uma arquitetura distribuída e assíncrona baseada em serviços nativos de nuvem (AWS), desacoplando a recepção das requisições na API principal do envio físico das mensagens:
1510

16-
- **Resiliência:** Se um provedor de e-mail falhar, o sistema utiliza políticas de re-tentativa (Retry) e filas para garantir a entrega.
17-
- **Escalabilidade:** O processamento é feito em segundo plano (background), liberando a API para responder instantaneamente.
18-
- **Padronização:** Gerenciamento centralizado de templates com suporte a variáveis dinâmicas e internacionalização (i18n).
11+
### 1. Fila de Processamento (Amazon SQS)
12+
Todas as notificações enviadas imediatamente são publicadas como mensagens na fila **Amazon SQS**. Isso garante que o envio de mensagens seja assíncrono e resiliente, amortecendo picos de carga e permitindo retentativas em caso de falha.
1913

20-
## 🛠️ Stack Tecnológica & Padrões
21-
22-
- **Framework:** .NET 10 (C#)
23-
- **Mensageria:** RabbitMQ + MassTransit
24-
- **Persistência:** MongoDB (Driver 3.8.0)
25-
- **Arquitetura:** Clean Architecture + DDD (Domain Driven Design)
26-
- **Padrões de Projeto:**
27-
- Strategy Pattern: Para seleção dinâmica de provedores de envio (Email, SMS, Push).
28-
- Factory Strategy: Para criação de notificações baseada no tipo solicitado.
29-
- MediatR: Para implementação de CQRS e desacoplamento de eventos.
30-
- Polly: Políticas de retry incremental integradas ao MassTransit.
31-
32-
## 🏗️ Estrutura do Ecossistema
33-
34-
O projeto é dividido em dois motores principais:
14+
### 2. Agendamento Efêmero (AWS EventBridge Scheduler)
15+
Quando uma notificação é agendada para uma data futura, a API cria dinamicamente um agendamento de execução única no **AWS EventBridge Scheduler**. No instante configurado, o EventBridge encaminha a mensagem à fila SQS e se auto-destrói automaticamente (`ActionAfterCompletion.DELETE`), eliminando a necessidade de polling periódico em bancos de dados.
3516

36-
1. **API (DotCruz.Notifications.Api):** Porta de entrada para cadastro de templates e comando inicial de disparo.
37-
2. **Worker (DotCruz.Notifications.Worker):** O cérebro do sistema. Contém:
38-
- Consumers: Processam as filas do RabbitMQ de forma assíncrona.
39-
- ScheduledNotificationPoller: Um serviço de background que monitora e dispara notificações agendadas para o futuro.
17+
### 3. Armazenamento Seguro de Credenciais (AWS SSM Parameter Store)
18+
As configurações de SMTP específicas de cada inquilino (*tenant*) são armazenadas com segurança no **SSM Parameter Store** como `SecureString`. Isso separa os segredos de conexão do banco de dados relacional principal e simplifica o gerenciamento multi-tenant.
4019

41-
## 🚀 Como Executar (Zero Setup)
20+
### 4. Worker Desacoplado (AWS Lambda)
21+
A leitura da fila SQS e a entrega real das notificações (E-mail, SMS, Push) não acontecem nesta API. Elas são de responsabilidade de um worker serverless otimizado compilado com Native AOT (consulte o repositório [DotCruz.Notifications.Delivery.Lambda](https://github.com/dotcruz-ecosystem/DotCruz.Notifications.Delivery.Lambda)).
4222

43-
A única dependência para rodar o projeto completo é o Docker.
23+
---
4424

45-
1. Iniciar o ecossistema
46-
Na raiz do projeto, execute:
25+
## 🛠️ Stack Tecnológica & Padrões
4726

48-
```json
49-
docker-compose up -d --build
50-
```
27+
* **Framework**: .NET 10 (C#)
28+
* **Persistência**: MongoDB (Driver 3.x)
29+
* **Infraestrutura de Mensageria**: AWS SQS (Simple Queue Service)
30+
* **Agendamento de Eventos**: AWS EventBridge Scheduler
31+
* **Armazenamento de Segredos**: AWS Systems Manager (SSM) Parameter Store
32+
* **Padrões de Projeto**:
33+
* **CQRS (MediatR)**: Separação clara de comandos e consultas.
34+
* **Clean Architecture**: Desacoplamento rígido de dependências de infraestrutura por meio de interfaces.
35+
* **Domain-Driven Design (DDD)**: Domínio rico com entidades, objetos de valor e conceitos de agregados.
5136

52-
1. Acessar as Interfaces
53-
Com o container rodando, você tem acesso imediato a:
37+
---
5438

55-
- **📄 Documentação da API (Scalar):**
56-
<http://localhost:5050/scalar>
57-
Explore e teste os endpoints de criação de notificações e templates de forma interativa.
39+
## 🏗️ Estrutura do Projeto
5840

59-
- **📧 Simulador de E-mail (Mailpit):**
60-
<http://localhost:8030/>
61-
Visualize em tempo real todos os e-mails disparados pelo sistema sem precisar de um servidor SMTP real.
41+
O código do projeto está dividido nos seguintes subprojetos dentro da pasta `src`:
6242

63-
- **🐰 RabbitMQ Dashboard:**
64-
<http://localhost:15675/> (User/Pass: guest)
65-
Acompanhe as filas e o fluxo de mensagens entre a API e o Worker.
43+
* **[DotCruz.Notifications.Api](./src/DotCruz.Notifications.Api)**: Camada de apresentação que contém os endpoints Scalar, controllers e configuração inicial do ASP.NET.
44+
* **[DotCruz.Notifications.Application](./src/DotCruz.Notifications.Application)**: Regras de aplicação, Use Cases (envio, criação de templates, etc.) e interfaces de infraestrutura.
45+
* **[DotCruz.Notifications.Domain](./src/DotCruz.Notifications.Domain)**: Entidades de domínio (Templates, Notifications, Tenants), enums e exceções.
46+
* **[DotCruz.Notifications.Infrastructure](./src/DotCruz.Notifications.Infrastructure)**: Implementação de acesso a dados (MongoDB) e integrações de nuvem AWS (SQS, EventBridge Scheduler, SSM).
47+
* **[DotCruz.Notifications.CrossCutting](./src/DotCruz.Notifications.CrossCutting)**: Recursos de injeção de dependência globais e mapeamento de configurações.
48+
* **[DotCruz.Notifications.Contracts](./src/DotCruz.Notifications.Contracts)**: Modelos de mensagens e contratos compartilhados com outros microsserviços do ecossistema.
6649

67-
## 🛠️ Variáveis de Ambiente
50+
---
6851

69-
O projeto já vem pré-configurado no docker-compose.yml, mas você pode customizar:
52+
## 🚀 Como Executar em Desenvolvimento (Local Setup)
7053

71-
- **ConnectionStrings__MongoDb:** Conexão com o banco de dados.
72-
- **Settings__RabbitMqSettings:** Configurações do broker.
73-
- **Settings__ApiKey:** Chave de autenticação para os serviços.
54+
Para rodar a API localmente, você precisa subir a instância do MongoDB e configurar os acessos necessários aos recursos da AWS (SQS, EventBridge Scheduler e SSM).
7455

75-
## 🧪 Configuração para Testes Locais
56+
### Pré-requisitos
57+
* Docker e Docker Compose instalados.
58+
* Credenciais de acesso à AWS com permissões para SQS, EventBridge Scheduler e SSM.
7659

77-
Para executar os testes automatizados que dependem da infraestrutura Docker (Testes de Integração/API), você deve criar o arquivo de
78-
configuração de ambiente na raiz do projeto DotCruz.Notifications.Api.
60+
### Passo a Passo
7961

80-
1. Criar o arquivo appsettings.Test.json
81-
Local: src/DotCruz.Notifications.Api/appsettings.Test.json
62+
1. **Iniciar o Banco de Dados Local**:
63+
Na raiz do projeto, execute o comando para subir o MongoDB em segundo plano:
64+
```bash
65+
docker compose up -d
66+
```
8267

83-
```json
84-
{
85-
"ConnectionStrings": {
86-
"MongoDb": "mongodb://localhost:27020"
87-
},
88-
"Settings": {
89-
"ApiKey": "DotCruzNotificationsKey",
90-
"EmailSettings": {
91-
"Host": "localhost",
92-
"Port": 1030,
93-
"Username": "",
94-
"Password": "",
95-
"FromEmail": "nao-responda@dotcruz.com",
96-
"FromName": "DotCruz Notifications",
97-
"EnableSsl": false
98-
},
99-
"MongoDbSettings": {
100-
"DatabaseName": "NotificationsDb"
68+
2. **Configurar Variáveis de Ambiente / Configurações Locais**:
69+
Ao rodar a API localmente (através do VS Code, Visual Studio ou via CLI `dotnet run`), configure as variáveis de ambiente necessárias para conexão com o MongoDB local e com a AWS (ou configure-as no seu gerenciador de User Secrets do .NET):
70+
```json
71+
{
72+
"ConnectionStrings": {
73+
"MongoDb": "mongodb://localhost:27020"
10174
},
102-
"RabbitMqSettings": {
103-
"Host": "localhost",
104-
"Port": 5675,
105-
"Username": "guest",
106-
"Password": "guest"
75+
"Settings": {
76+
"ApiKey": "DotCruzNotificationsKey",
77+
"AWS": {
78+
"Region": "us-east-1",
79+
"AccessKey": "SUA_ACCESS_KEY",
80+
"SecretKey": "SUA_SECRET_KEY",
81+
"SqsQueueArn": "arn:aws:sqs:us-east-1:123456789012:sua-fila",
82+
"SchedulerRoleArn": "arn:aws:iam::123456789012:role/seu-role-do-scheduler",
83+
"SmtpParameterPath": "/dotcruz/tenants/{0}/smtp-config"
84+
}
10785
}
10886
}
109-
}
110-
```
87+
```
88+
89+
3. **Acessar a Documentação da API (Scalar)**:
90+
Com a API executando localmente, você poderá acessar a documentação interativa em:
91+
* **📄 Documentação da API (Scalar)**: `http://localhost:5050/scalar`
92+
93+
---
11194

112-
> Nota: Utilizamos as portas 27020, 1030 e 5675 para que os testes rodando em sua máquina local consigam acessar os containers Docker
113-
expostos.
95+
## 🔄 Deploy Contínuo (CI/CD)
11496

115-
1. Rodar os testes
97+
O projeto possui duas esteiras automatizadas de implantação via GitHub Actions:
11698

117-
```json
118-
dotnet test
119-
```
99+
### 1. Implantação da API ([deploy.yml](./.github/workflows/deploy.yml))
100+
Acionado a cada push para a branch `main`:
101+
1. Compila a imagem Docker a partir do [Dockerfile](./src/DotCruz.Notifications.Api/Dockerfile) e envia para o GitHub Container Registry (GHCR).
102+
2. Acessa a VPS de produção via SSH.
103+
3. Copia o [docker-compose.prod.yml](./docker-compose.prod.yml) para o servidor como `docker-compose.yml`.
104+
4. Injeta as variáveis de ambiente necessárias (como credenciais AWS, chaves de API e strings de conexão Mongo) a partir do GitHub Secrets.
105+
5. Executa `docker compose pull` e `docker compose up -d` para atualizar os contêineres sob a rede externa `dotcruz_net`.
120106

121-
---
122-
Desenvolvido por Matheus Cruz – Focado em escalabilidade e sistemas distribuídos.
107+
### 2. Publicação de Contratos ([publish-contracts.yml](./.github/workflows/publish-contracts.yml))
108+
Acionado quando há modificações na pasta de contratos:
109+
1. Gera o pacote NuGet (.nupkg) do projeto [DotCruz.Notifications.Contracts](./src/DotCruz.Notifications.Contracts/DotCruz.Notifications.Contracts.csproj).
110+
2. Publica o pacote no NuGet.org utilizando a chave de API fornecida em segredo.

0 commit comments

Comments
 (0)