Skip to content

Latest commit

 

History

History
99 lines (73 loc) · 7.1 KB

File metadata and controls

99 lines (73 loc) · 7.1 KB

TaskAPI - API de Gerenciamento de Tarefas

Autores

  • Lucas Pinheiro Caldas (20220040190)
  • Matheus Queiroz de Almeida Pereira (20220055380)

JavaSpring BootDockerKubernetesCI/CDSecurity

Sobre o Projeto

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.

Arquitetura de Produção

A aplicação em produção no GKE segue um fluxo de tráfego moderno e resiliente:

  1. Um usuário acessa o domínio https://taskapi-lucas-matheus.duckdns.org.
  2. O serviço de DNS (DuckDNS) resolve o domínio para o endereço IP público do nosso Ingress Controller.
  3. O NGINX Ingress Controller, atuando como o "porteiro" do cluster, recebe a requisição.
  4. O cert-manager garante que a conexão seja segura, gerenciando o certificado TLS (HTTPS) obtido do Let's Encrypt.
  5. O Ingress Controller analisa a requisição e, com base nas regras definidas, encaminha o tráfego para o Service interno da aplicação.
  6. O Service (taskapi-service) localiza um Pod saudável e disponível para receber a requisição.
  7. 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.

Funcionalidades

Funcionalidades da Aplicação

  • ✅ 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.

Funcionalidades de DevOps e Infraestrutura

  • 🐳 Containerização com Docker: Dockerfile otimizado 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.

Como Executar a Aplicação

Acesso à Aplicação em Produção

A aplicação está implantada e disponível publicamente na nuvem.

Acesse a aplicação em: https://taskapi-lucas-matheus.duckdns.org

Para Desenvolvimento Local com Docker

A imagem da aplicação também está disponível no GitLab Container Registry para execução local.

  1. Certifique-se de que o Docker está instalado e em execução.
  2. 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
  3. Acesse a aplicação no seu navegador: http://localhost:8080

Pipeline de CI/CD

O pipeline de CI/CD no arquivo .gitlab-ci.yml automatiza todo o ciclo de vida da aplicação em quatro estágios:

  1. build: Compila o código-fonte Java e empacota a aplicação em um arquivo .jar usando Maven.
  2. test: Executa todos os testes unitários e de integração para garantir a qualidade e a estabilidade do código.
  3. package: Constrói a imagem Docker da aplicação e a publica no GitLab Container Registry.
  4. deploy: Conecta-se de forma segura ao cluster GKE, aplica todos os manifestos Kubernetes da pasta k8s/ e implanta a nova versão da aplicação sem intervenção manual.

Configuração do Kubernetes

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 o cert-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.

Endpoints da API

A seguir estão os endpoints RESTful disponíveis na aplicação.

Autenticação (/auth)

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" }

Tarefas (/tasks)

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..." }