{"id":28384616,"url":"https://github.com/patinaomi/projeto-java-thymeleaf","last_synced_at":"2026-05-12T19:01:44.184Z","repository":{"id":301260121,"uuid":"950312281","full_name":"patinaomi/projeto-java-thymeleaf","owner":"patinaomi","description":"Repositório destinado para a entrega da sprint 4 da matérias de Devops e Java.","archived":false,"fork":false,"pushed_at":"2025-05-23T13:58:47.000Z","size":1024,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-07T06:42:12.731Z","etag":null,"topics":["devops","java","spring","spring-boot","spring-mvc","spring-security","thymeleaf","thymeleaf-java","thymeleaf-template-engine"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patinaomi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-18T00:58:15.000Z","updated_at":"2025-06-18T22:23:35.000Z","dependencies_parsed_at":"2026-04-07T06:03:14.748Z","dependency_job_id":null,"html_url":"https://github.com/patinaomi/projeto-java-thymeleaf","commit_stats":null,"previous_names":["patinaomi/projeto-java-thymeleaf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/patinaomi/projeto-java-thymeleaf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patinaomi%2Fprojeto-java-thymeleaf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patinaomi%2Fprojeto-java-thymeleaf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patinaomi%2Fprojeto-java-thymeleaf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patinaomi%2Fprojeto-java-thymeleaf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patinaomi","download_url":"https://codeload.github.com/patinaomi/projeto-java-thymeleaf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patinaomi%2Fprojeto-java-thymeleaf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32952812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T09:19:52.626Z","status":"ssl_error","status_checked_at":"2026-05-12T09:17:33.438Z","response_time":102,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","java","spring","spring-boot","spring-mvc","spring-security","thymeleaf","thymeleaf-java","thymeleaf-template-engine"],"created_at":"2025-05-30T09:11:28.067Z","updated_at":"2026-05-12T19:01:44.171Z","avatar_url":"https://github.com/patinaomi.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# **Challenge OdontoPrev**\n[![Sync GitHub Repo to Azure DevOps](https://github.com/patinaomi/projeto-java-thymeleaf/actions/workflows/sync-to-azure-devops.yml/badge.svg)](https://github.com/patinaomi/projeto-java-thymeleaf/actions/workflows/sync-to-azure-devops.yml)\n\n## 📌 **Índice**\n1. [Sobre o Projeto](#-sobre-o-projeto)\n2. [Implementações Java – Sprint 4](#️-implementações-java--sprint-4)\n3. [Implementações DevOps – Sprint 4](#️-implementações-devops--sprint-4)\n4. [Vídeos Demonstrativos](#-vídeos-demonstrativos)\n5. [Arquitetura do Projeto](#-arquitetura-do-projeto)\n6. [Configuração das Pipelines](#-configuração-das-pipelines)\n7. [Rodando o Projeto com Docker](#-rodando-o-projeto-com-docker)\n8. [Equipe](#-equipe)\n\n\n## 💡 **Sobre o Projeto**\nO sistema é uma aplicação Java com Spring Boot, desenvolvida para gerenciar clínicas odontológicas, com recursos para cadastro de dentistas, clínicas e feedbacks. Foi implementado um ambiente DevOps com CI/CD utilizando **Azure DevOps** e deploy em **na nuvem**. O banco de dados é **Oracle**, também hospedado em container Docker.\n\n#### **⚙️ Funcionalidades principais**\n✅ Cadastro e gerenciamento de dentistas, clínicas e consultas.  \n✅ Recebimento e gestão de feedbacks dos atendimentos.  \n✅ Dashboard moderno e responsivo para facilitar a navegação.\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n## ⚙️ Implementações Java – Sprint 4\nNesta 4ª Sprint, a aplicação Java foi finalizada com arquitetura **full MVC**, contemplando os requisitos funcionais propostos:\n\n-   🔐 **Autenticação e Autorização**  \n    Implementação do **Spring Security**, com autenticação baseada em formulário e controle de acesso por **perfis de usuário (roles)**, permitindo acesso diferenciado para clínicas e dentistas.\n\n-   🌐 **Internacionalização**  \n    A aplicação conta com suporte a múltiplos idiomas por meio do recurso de internacionalização do Spring. Os arquivos `.properties` foram configurados para exibir textos em português e inglês de forma dinâmica.\n\n-   📬 **Mensageria com RabbitMQ**  \n    Integração com o **RabbitMQ** para envio e consumo de mensagens assíncronas, como no envio de e-mails de cadastro. A configuração foi realizada com produtores e consumidores devidamente registrados.\n\n-   📊 **Monitoramento com Spring Boot Actuator**  \n    Endpoints de monitoramento e métricas foram habilitados com o **Spring Boot Actuator**, permitindo acompanhar a saúde da aplicação, consumo de recursos e estatísticas de uso.\n\n-   🤖 **Inteligência Artificial com Spring AI**  \n    Recursos de IA foram adicionados utilizando o **Spring AI** com integração à API da OpenAI (GPT-3.5 Turbo). O sistema é capaz de **gerar resumos automáticos de feedbacks dos pacientes**, proporcionando insights inteligentes para as clínicas.\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n## ⚙️ Implementações DevOps – Sprint 4\n\nNesta sprint, foi implementada uma esteira completa de **CI/CD** utilizando o **Azure DevOps**, com o objetivo de automatizar o build, push e deploy da aplicação na nuvem.\n\n-   🚀 **Integração Contínua (CI)**  \n    A pipeline é disparada automaticamente a cada push no repositório Git. Ela realiza o `build` do projeto com Maven, empacota a aplicação como **imagem Docker** e faz o push para o **Azure Container Registry (ACR)**.\n\n-   📦 **Entrega Contínua (CD)**  \n    Após a publicação da imagem no ACR, a pipeline de CD realiza o deploy automático para o **Azure Container Instance (ACI)**, expondo a aplicação com **IP público**, tornando possível acessá-la diretamente pelo navegador.\n\n-   🔄 **Automação e Rastreabilidade**  \n    O processo automatizado proporciona **velocidade, confiabilidade e versionamento controlado**, além de facilitar testes e validações em ambiente de produção.\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n## 🎥 **Vídeos Demonstrativos**\nDisponibilizamos dois vídeos para apresentar as etapas e funcionalidades do projeto:\n### 📦 _1. DevOps: CI/CD com Azure DevOps_\n\nNeste vídeo, mostramos todo o fluxo da esteira de integração e entrega contínua:\n-   Push no repositório Git\n-   Execução da pipeline de CI (build da imagem Docker e push no Azure Container Registry)\n-   Execução da pipeline de CD (deploy automático no Azure Container Instances)\n-   Verificação do container em execução e acesso via IP público\n\n📌 **Assista aqui:**  \n[▶ CI/CD no Azure DevOps](https://youtu.be/P0mPnDin5T0)\n\n----------\n### 💻 _2. Demonstração do Sistema Java_\nEste vídeo apresenta as funcionalidades principais da aplicação:\n-   Login e navegação com interface desenvolvida em Thymeleaf\n-   Arquitetura final da solução\n-   Integrações com RabbitMQ e OpenAI\n\n📌 **Assista aqui:**  \n[▶ Demonstração do Sistema Java](https://youtu.be/-vDVQu-9Jb0)\n\nCredenciais usadas para testes:\n\n-   `clinica1@email.com` / `senha123`\n-   `dentista1@email.com` / `senha123`\n\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n## 🏛️ **Arquitetura do Projeto**\n\n![arquitetura do projeto](https://github.com/patinaomi/projeto-java-thymeleaf/blob/main/diagrama.drawio.png)\n\nA arquitetura do projeto foi desenvolvida com foco em escalabilidade, monitoramento e integração contínua. Utilizando o Azure DevOps, o pipeline de CI/CD automatiza o processo de build e deploy da aplicação. A imagem Docker é gerada a partir do código Java com Spring Boot, enviada para o Azure Container Registry e, em seguida, implantada no Azure Container Instance como um container acessível por IP público. A aplicação se comunica com um banco de dados Oracle, hospedado em container, e com o RabbitMQ como serviço de mensageria para eventos assíncronos, como o envio de e-mails. O monitoramento é realizado com Prometheus e Grafana, também em containers, permitindo o acompanhamento em tempo real do estado e métricas da aplicação. Toda a estrutura é pensada para proporcionar uma experiência DevOps completa e robusta.\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n\n---\n\n## 💡 **Configuração das Pipelines**\n#### 🛠️ Configuração da Pipeline de CI (Continuous Integration)\n\nNa pipeline de **Integração Contínua (CI)**, configurada no Azure DevOps, foi definido o uso do `pool` padrão do Azure Pipelines para execução das tarefas. O processo automatiza a construção da imagem Docker da aplicação Java. Primeiramente, a tarefa `Docker Build an image` é responsável por **compilar o projeto** e gerar a imagem Docker a partir do `Dockerfile` localizado na pasta `challenge/`. Em seguida, a tarefa `Push an image` faz o **envio da imagem criada para o Azure Container Registry (ACR)**, utilizando as credenciais fornecidas na configuração. A imagem recebe a tag correspondente ao número do build, garantindo versionamento e rastreabilidade para futuros deploys.\n👉 [`link do código de ci-pipeline.yml`](https://github.com/patinaomi/projeto-java-thymeleaf/blob/main/challenge/ci-pipeline.yml)\n#### 🚀 Pipeline de CD (Entrega Contínua)\n\nA pipeline de **Continuous Deployment (CD)** foi configurada no **Azure DevOps** com o objetivo de automatizar o processo de publicação da aplicação Java na nuvem. Após a conclusão da etapa de build e push da imagem Docker (na pipeline de CI), a pipeline de CD é acionada para realizar o deploy da imagem no serviço **Azure Container Instance (ACI)**.\n\nO processo segue os seguintes passos:\n\n1.  **Autenticação na conta Azure** via Azure CLI.\n\n2.  **Criação do container** com base na imagem gerada e armazenada no **Azure Container Registry (ACR)**.\n\n3.  O container é criado com IP público, permitindo o acesso via navegador.\n\n4.  A aplicação roda em ambiente Linux e é configurada para escutar na porta 8080.\n\n    👉 [`link do código de cd-pipeline.yml`](https://github.com/patinaomi/projeto-java-thymeleaf/blob/main/challenge/cd-pipeline.yml)\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n## 🐳 Rodando o Projeto com Docker\n\nPara rodar a aplicação completa com **Spring Boot + Oracle + RabbitMQ + Prometheus + Grafana**, siga os passos abaixo:\n\n### 📁 Pré-requisitos\n\n-   Docker instalado (link de instalação)\n-   Docker Compose instalado (link de instalação)\n\n### 🐑 1. Clone o repositório\n```\ngit clone https://github.com/patinaomi/projeto-java-thymeleaf\ncd projeto-java-thymeleaf\n```\n\n### ⚙️ 2. Configure o arquivo `.env`\n\nCrie um arquivo chamado `.env` na raiz do projeto com o seguinte conteúdo (ajuste os valores conforme suas credenciais):\n```ORACLE_USER=seu-usuario\nORACLE_PASS=sua-senha\nOPENAI_KEY=sua-chave-openai-aqui\nJWT_SECRET_KEY=sua-chave-jwt-aqui\nEMAIL_USER=seuemail@gmail.com\nEMAIL_PASSWORD=sua-senha-email-smpt-aqui\n```\n### 🚀 3. Suba os containers\nNa raiz do projeto, execute o seguinte comando:\n``docker compose up --build\n``\n\nEsse comando irá:\n-   Construir a imagem do projeto Java.\n-   Subir os containers do **RabbitMQ**, **Oracle** (caso esteja local), **Prometheus** e **Grafana**.\n-   Inicializar a aplicação acessível em:  \n    👉 [`http://localhost:8080`](http://localhost:8080)\n### 📊 Interfaces disponíveis\n|Serviço|URL|\n|--|--|\n|🌐 Aplicação|[http://localhost:8080](http://localhost:8080)|\n|🐰 RabbitMQ|[http://localhost:15672](http://localhost:15672) _(user: guest / guest)_|\n|📊 Prometheus|[http://localhost:9090](http://localhost:9090)|\n|📈 Grafana|[http://localhost:3000](http://localhost:3000) _(login padrão: admin / admin)_|\n\n### 🛠️ Inicialização do Banco de Dados\nAo rodar o projeto pela primeira vez, é necessário garantir que o banco de dados seja criado automaticamente. Para isso, o projeto deve ser executado com a propriedade spring.jpa.hibernate.ddl-auto configurada como create. Isso fará com que todas as tabelas definidas pelas entidades JPA sejam geradas automaticamente no banco Oracle. Após a criação inicial, recomenda-se alterar esse modo para update ou none, evitando a recriação acidental do schema em execuções futuras.\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n## 🧑‍🤝‍🧑 Equipe\n\n| \u003ch3\u003eClaudio Bispo\u003c/h3\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/110735259?v=4\" width=180px\u003e \u003ch6\u003eRM553472\u003c/h6\u003e \u003ca href=\"https://github.com/claubis\"\u003e\u003cimg src=\"https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\"\u003e\u003c/a\u003e \u003ca href=\"https://www.linkedin.com/in/claudiosbispo\"\u003e\u003cimg src=\"https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\"\u003e\u003c/a\u003e \u003ca href=\"https://www.instagram.com/_claudiobispo/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Instagram-%23E4405F.svg?style=for-the-badge\u0026logo=Instagram\u0026logoColor=white\"\u003e\u003c/a\u003e|\u003ch3\u003ePatricia Naomi\u003c/h3\u003e \u003cimg src=\"https://avatars.githubusercontent.com/u/132932532?v=4\" width=180px\u003e\u003ch6\u003eRM552981\u003c/h6\u003e \u003ca href=\"https://github.com/patinaomi\"\u003e\u003cimg src=\"https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\"\u003e\u003c/a\u003e \u003ca href=\"https://www.linkedin.com/in/patinaomi/\"\u003e\u003cimg src=\"https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\"\u003e\u003c/a\u003e \u003ca href=\"https://www.instagram.com/naomipati/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Instagram-%23E4405F.svg?style=for-the-badge\u0026logo=Instagram\u0026logoColor=white\"\u003e\u003c/a\u003e|\n|--|--|\n\n\n[:arrow_up: voltar para o índice :arrow_up:](#-índice)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatinaomi%2Fprojeto-java-thymeleaf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatinaomi%2Fprojeto-java-thymeleaf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatinaomi%2Fprojeto-java-thymeleaf/lists"}