- Lucas Pinheiro Caldas (20220040190)
- Matheus Queiroz de Almeida Pereira (20220055380)
O TaskAPI é uma aplicação web para gerenciamento de tarefas que permite aos usuários se cadastrarem, fazerem login e gerenciarem uma lista de tarefas pessoais.
Originalmente desenvolvido como uma API REST com autenticação segura via JWT, o projeto evoluiu para uma solução cloud-native com um pipeline de entrega contínua (CI/CD) totalmente automatizado e implantado no Google Kubernetes Engine (GKE). A aplicação agora é exposta de forma segura na internet com HTTPS, utilizando NGINX Ingress e provisionamento automático de certificados SSL/TLS com cert-manager e Let's Encrypt.
A aplicação em produção no GKE segue um fluxo de tráfego moderno e resiliente:
- Um usuário acessa o domínio
https://taskapi-lucas-matheus.duckdns.org. - O serviço de DNS (DuckDNS) resolve o domínio para o endereço IP público do nosso Ingress Controller.
- O NGINX Ingress Controller, atuando como o "porteiro" do cluster, recebe a requisição.
- O cert-manager garante que a conexão seja segura, gerenciando o certificado TLS (HTTPS) obtido do Let's Encrypt.
- O Ingress Controller analisa a requisição e, com base nas regras definidas, encaminha o tráfego para o
Serviceinterno da aplicação. - O
Service(taskapi-service) localiza um Pod saudável e disponível para receber a requisição. - O Pod, gerenciado por um
Deployment, executa a imagem Docker da aplicação TaskAPI e processa a requisição. As probes de Liveness e Readiness garantem que apenas Pods saudáveis recebam tráfego.
- ✅ Autenticação de Usuários: Sistema completo de registro e login.
- 🔐 Segurança com JWT: Endpoints de tarefas protegidos que só podem ser acessados com um token válido.
- 📝 Gerenciamento de Tarefas: Usuários autenticados podem criar e visualizar suas próprias tarefas.
- 💾 Banco de Dados em Memória: Utiliza H2 Database para facilitar a execução e os testes.
- 🐳 Containerização com Docker:
Dockerfileotimizado com múltiplos estágios para uma imagem final leve e segura. - 🚀 Pipeline de CI/CD Completo com GitLab: Pipeline automatizado que realiza build, teste, publicação da imagem Docker e deploy contínuo no Kubernetes.
- ☁️ Deploy Automatizado no Google Kubernetes Engine (GKE): A aplicação é implantada automaticamente em um cluster Kubernetes na nuvem.
- 📜 Infraestrutura como Código (IaC): Toda a configuração do ambiente Kubernetes é descrita de forma declarativa em arquivos de manifesto (YAML).
- 🔄 Gerenciamento de Tráfego com NGINX Ingress: Um único ponto de entrada para o cluster que roteia o tráfego para a aplicação.
- 🔒 HTTPS Automático com Let's Encrypt: Provisionamento e renovação automática de certificados SSL/TLS usando
cert-manager. - ❤️ Health Probes: Configuração de Liveness e Readiness Probes para garantir a saúde e a resiliência da aplicação no Kubernetes.
A aplicação está implantada e disponível publicamente na nuvem.
Acesse a aplicação em: https://taskapi-lucas-matheus.duckdns.org
A imagem da aplicação também está disponível no GitLab Container Registry para execução local.
- Certifique-se de que o Docker está instalado e em execução.
- Baixe a imagem Docker do registro do GitLab:
docker pull registry.gitlab.com/lucpc/taskapi:master ```3. **Execute a imagem** localmente: ```bash docker run -p 8080:8080 registry.gitlab.com/lucpc/taskapi:master
- Acesse a aplicação no seu navegador: http://localhost:8080
O pipeline de CI/CD no arquivo .gitlab-ci.yml automatiza todo o ciclo de vida da aplicação em quatro estágios:
build: Compila o código-fonte Java e empacota a aplicação em um arquivo.jarusando Maven.test: Executa todos os testes unitários e de integração para garantir a qualidade e a estabilidade do código.package: Constrói a imagem Docker da aplicação e a publica no GitLab Container Registry.deploy: Conecta-se de forma segura ao cluster GKE, aplica todos os manifestos Kubernetes da pastak8s/e implanta a nova versão da aplicação sem intervenção manual.
Toda a infraestrutura da aplicação no cluster é definida como código na pasta k8s/.
deployment.yaml: Descreve como executar a aplicação, incluindo a imagem Docker, o número de réplicas e as health probes (Liveness e Readiness) para monitorar a saúde dos Pods.service.yaml: Cria um ponto de acesso de rede interno e estável (ClusterIP) para que outros componentes do cluster, como o Ingress, possam se comunicar com a aplicação.cluster-issuer.yaml: Configura ocert-manager, ensinando-o a solicitar certificados do Let's Encrypt.ingress.yaml: Define as regras para expor a aplicação na internet. Ele gerencia o tráfego externo, o roteamento baseado em domínio e a configuração de TLS para habilitar o HTTPS.
A seguir estão os endpoints RESTful disponíveis na aplicação.
| Método | Endpoint | Descrição | Corpo da Requisição (JSON) |
|---|---|---|---|
POST |
/auth/register |
Registra um novo usuário. | { "username": "user", "password": "123" } |
POST |
/auth/login |
Autentica um usuário e retorna um token JWT. | { "username": "user", "password": "123" } |
Obs: Todos os endpoints de tarefas são protegidos e exigem um cabeçalho de autorização.
Authorization: Bearer <seu-token-jwt>
| Método | Endpoint | Descrição | Corpo da Requisição (JSON) |
|---|---|---|---|
GET |
/tasks/list |
Retorna a lista de tarefas do usuário logado. | N/A |
POST |
/tasks/post |
Cria uma nova tarefa para o usuário logado. | { "title": "Nova Tarefa", "description": "Descrição..." } |