É uma API RESTful avançada desenvolvida para gerenciar entidades de Pessoa e Trabalho, com um relacionamento entre elas. A aplicação utiliza o framework NestJS e o ORM Prisma para persistência de dados em um banco PostgreSQL. Além disso, a aplicação é escalável, utilizando múltiplas instâncias balanceadas por um servidor NGINX e gerenciada em um cluster Kubernetes.
- Gerenciamento de Pessoas: Criação, consulta, atualização e exclusão de registros de pessoas.
- Gerenciamento de Trabalhos: Criação, consulta, atualização e exclusão de registros de trabalhos.
- Relacionamento Pessoa-Trabalho: Cada pessoa está associada a um trabalho, permitindo consultas relacionadas.
- Validação de Dados: Validação robusta de DTOs (Data Transfer Objects) utilizando class-validator.
- Persistência com PostgreSQL: Banco de dados relacional gerenciado pelo Prisma ORM.
- Load Balancer: Utilização de NGINX para balancear a carga entre múltiplas instâncias da aplicação.
- Monitoramento e Backup: Health Check com LivenessProbe e backup diário do banco de dados às 03:00 da manhã.
- NestJS: Framework para criar a API RESTful, gerenciando rotas e lógica de negócio.
- TypeScript: Linguagem principal, garantindo tipagem estática e maior segurança.
- Prisma: ORM para gerenciar o banco PostgreSQL, incluindo migrations e sincronização de dados.
- PostgreSQL: Banco de dados relacional para armazenar pessoas e trabalhos.
- NGINX: Servidor web utilizado como load balancer.
- Docker: Contêineres para a aplicação, banco de dados e servidor web.
- Kubernetes: Orquestração de contêineres para gerenciar pods, services, deployments e replicasets.
- Minikube: Ambiente de desenvolvimento local para Kubernetes.
Antes de começar, certifique-se de ter instalado:
- Node.js (v16 ou superior)
- Docker e Docker Compose
- Kubectl
- Minikube
- Clone o repositório:
git clone https://github.com/renanjava/prova-eliel cd prova-eliel
- Configure as variáveis de ambiente:
Crie um arquivo
.env
com base no.env.example
:DATABASE_URL=postgresql://user:password@postgres:5432/my_db PORT=3000
- Suba os contêineres com Docker Compose:
docker-compose up --build
Isso iniciará o banco PostgreSQL, duas instâncias da aplicação NestJS e o NGINX como Load Balancer.
-
Inicie o Minikube com suporte ao provisionamento de volumes:
O addon
default-storageclass
é necessário para que os volumes persistentes funcionem corretamente no cluster.minikube start --addons=default-storageclass
-
Monte os arquivos de configuração necessários:
Monte um diretório local (
./config
) dentro do Minikube, permitindo que o cluster acesse a configuração de criptografia de dados sensíveis.minikube mount ./config:/var/lib/minikube/certs/config
-
Reinicie o Minikube com a configuração de criptografia ativada:
Essa etapa configura o servidor da API para usar a política de criptografia definida no arquivo
crypt.yaml
.minikube start --extra-config=apiserver.encryption-provider-config=/var/lib/minikube/certs/config/crypt.yaml --addons=default-storageclass
-
Ative o
metrics-server
:Esse addon permite coletar métricas dos pods, como uso de CPU e memória.
minikube addons enable metrics-server
-
Ative o addon de volumes persistentes:
Permite o uso de volumes persistentes com o driver de armazenamento local padrão.
minikube addons enable csi-hostpath-driver
-
Abra o dashboard do Minikube:
Interface gráfica para visualizar recursos do cluster em tempo real.
minikube dashboard
-
Aplique todos os manifestos YAML do projeto:
Cria os recursos do banco de dados, da aplicação, e do NGINX dentro do cluster.
kubectl apply -f db-configmaps.yaml kubectl apply -f db-secrets.yaml kubectl apply -f db-statefulsets.yaml kubectl apply -f app-configmaps.yaml kubectl apply -f app-secrets.yaml kubectl apply -f app-deployment.yaml kubectl apply -f app-service.yaml kubectl apply -f nginx-config.yaml kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-service-loadbalancer.yaml
-
Inicie o túnel do Minikube:
O túnel cria rotas no seu sistema para permitir o acesso externo ao LoadBalancer.
minikube tunnel
-
Verifique os serviços do cluster:
O comando abaixo mostra os serviços criados, incluindo o
EXTERNAL-IP
do LoadBalancer.kubectl get svc
-
Acesse a aplicação pelo navegador:
Copie a URL do campo
EXTERNAL-IP
referente ao serviço NGINX e cole no seu navegador para acessar a aplicação.
- Banco de Dados: PostgreSQL gerenciado pelo Prisma e Kubernetes StatefulSets.
- Load Balancer: NGINX balanceando a carga entre múltiplas instâncias da aplicação.
- Configuração: ConfigMaps para variáveis de ambiente e Secrets para valores sensíveis.
- Backup: CronJob para backup diário do banco de dados às 03:00 da manhã.
- Volumes: PersistentVolumeClaim para armazenamento de dados do banco.
- Monitoramento: Health Check com LivenessProbe a cada 3 segundos.
O uso de Kubernetes permite gerenciar réplicas da aplicação, garantindo alta disponibilidade e resiliência. O NGINX atua como Load Balancer, distribuindo requisições entre as instâncias. Além disso, o armazenamento persistente e os backups automáticos garantem a integridade dos dados.