{"id":22741326,"url":"https://github.com/yohansn/gocase-devops","last_synced_at":"2025-06-13T23:32:50.595Z","repository":{"id":267045065,"uuid":"899254062","full_name":"YohansN/gocase-devops","owner":"YohansN","description":"Desafio Técnico para vaga de DevOps Estagiário na GoCase","archived":false,"fork":false,"pushed_at":"2024-12-08T00:14:37.000Z","size":8,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T04:13:26.511Z","etag":null,"topics":["devops","docker","docker-compose","github-actions","pipeline"],"latest_commit_sha":null,"homepage":"","language":null,"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/YohansN.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}},"created_at":"2024-12-05T22:39:18.000Z","updated_at":"2024-12-08T00:14:41.000Z","dependencies_parsed_at":"2024-12-07T23:23:30.345Z","dependency_job_id":"4253248b-887d-4533-83ba-8a1c932117a0","html_url":"https://github.com/YohansN/gocase-devops","commit_stats":null,"previous_names":["yohansn/gocase-devops"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YohansN%2Fgocase-devops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YohansN%2Fgocase-devops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YohansN%2Fgocase-devops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YohansN%2Fgocase-devops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YohansN","download_url":"https://codeload.github.com/YohansN/gocase-devops/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246273553,"owners_count":20750906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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","docker","docker-compose","github-actions","pipeline"],"created_at":"2024-12-11T00:09:43.664Z","updated_at":"2025-03-30T04:13:29.611Z","avatar_url":"https://github.com/YohansN.png","language":null,"readme":"# GoCase - Desafio DevOps\n## Sobre os repositórios\nEste repositório contém uma ligação para dois outros repositórios do desafio, um com a aplicação Front-end em React/Vite e outro com o Back-end Ruby on Rails com a API que é utilizada pelo front. No repositório atual você irá encontrar o arquivo docker-compose responsável por executar a aplicação por completo por meio da orquestração dos três serviços em containeres (front, back, banco de dados).\n\nNos ademais repositórios encontram-se os arquivos *dockerfile* que conteinerizam cada uma das aplicações individualmente para gerar suas imagens. No caso do front, também encontra-se a pipeline para seu deploy na Vercel na pasta *.github/workflows*. \u003cbr\u003e\nVale lembrar que a aplicação do **front não irá funcionar como um todo** sem o back-end, que é o caso do deploy na Vercel. \u003cbr\u003e\n**Atenção: Todas as alterações feitas a partir dos repositórios originais estão na Branch Main!**\n\n---\nA aplicação deployada na Vercel se encontra no domínio:\n[https://devopscasefront-two.vercel.app](https://devopscasefront-two.vercel.app)\n\n## Como executar a aplicação em container localmente.\nAqui temos o arquivo **docker-compose** que pode ser usado para executar a aplicação de forma ***[conteinerizada](https://aws.amazon.com/pt/what-is/containerization/)*** localmente. Para isso siga os passos abaixo:\n\n**PRÉ-REQUISITOS**: \u003cbr\u003e\nÉ necessário ter o ***[git](https://git-scm.com/book/pt-br/v2/Começando-Instalando-o-Git)***, o ***[docker](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-pt)*** e o ***[docker compose](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04-pt)*** instalados na máquina.\n\n1. Para rodar a aplicação faça a clonagem deste repositório com o comando:\n```\ngit clone --recurse-submodules https://github.com/YohansN/gocase-devops.git\n```\nNecessário para baixar tanto o repositório principal quanto seus sub-módulos.\n\n2. Entre no diretório raiz do projeto e execute o comando:\n```\ndocker-compose up -d\n```\n\n3. **Pronto!** Agora você já pode entrar na página da aplicação acessando: **[localhost:80](localhost:80)** no seu navegador.\n   \n4. Para parar a aplicação utilize ``` docker-compose down ``` na raiz do projeto.\n\n---\n### ----- ATENÇÃO -----\nAs aplicações utilizam as seguintes portas: \u003cbr\u003e\n| Serviço  | Porta |\n| ------------- | ------------- |\n| Front-end | `80`  |\n| Back-end  | `3000`  |\n| Banco de dados  | `5432`  |\n\nCaso alguma já esteja em uso na sua máquina isso pode **acarretar em problemas na hora da execução dos containeres**. Certifique-se de que não tenha outra aplicação rodando nessas portas ou modifique o arquivo docker-compose para que ele utilize portas distintas.\nOs logs do container podem ser verificados com ```docker-compose logs``` para identificar possíveis erros.\n\n## Integração entre os Serviços\nOs três serviços são orquestrados por meio do Docker Compose que faz as conexões entre eles. Ele faz isso criando um conteiner de cada serviço. No caso do front-end e do back-end da aplicação ele cria um conteiner a partir da imagem do arquivo dockerfile de cada aplicação. Para o banco de dados eu escolhi o PostgreSQL que é um sistema de gerenciamento de banco de dados open source e amplamente utilizado. Seu container é gerado a partir de sua imagem oficial no [DockerHub](https://hub.docker.com/_/postgres). O Front-End se conecta com o Back-End por meio de configurações internas do projeto onde o front faz requisições para o endereço localhost:3000 que é o domínio padrão da API do back-end.\u003cbr\u003e\nDentro do arquivo compose também são definidos as variáveis de ambiente que são essenciais para fazer a conexão do back-end ruby no banco de dados postgres e algumas configurações que variam a depender do serviço. Também é lá que é definido as portas lógicas onde os serviços irão ser executados e que estarão disponíveis para o acesso na nossa máquina. Por último foram definidos volumes, responsaveis por fazer a persistência dos dados dos serviços.\n\n## Desenvolvimento da Pipeline CI/CD\nPor meio do GitHub Actions foi desenvolvido uma Pipeline para deploy do **Front-End** da aplicação na plataforma **[Vercel](https://vercel.com/home)** de forma totalmente gratuita e automátizada. Na pipeline são definidas regras de execução que dizem em que momento o código da pipeline deverá ser executado. Em projetos maiores é comum existirem diferentes pipelines para diferentes ambientes como testes, homologação e produção. Nesse caso apenas uma pipeline de produção foi criada e ela é executada quando um push é feito na branch principal main, como requisitado. Foram configuradas chaves/tokens secretos que fazem a conexão entre o repositório do GitHub e o projeto na Vercel. \u003cbr\u003e\nA Pipeline é executada em uma máquina virtual Ubuntu. Lá ela faz o clone do repositório e executa os comandos para instalação do CLI da Vercel, build da aplicação e envio dos arquivos Artifacts para o deploy na plataforma. \u003cbr\u003e\nAlgumas etapas de verificação de código podem ser adicionadas para um maior controle do que deve ser deployado ou não. Optei por não implementar uma etapa de testes uma vez que o projeto não disponibiliza os mesmos, fazendo com que a pipeline quebre.\n\n## Escolhas técnicas\nNo caso da aplicação Back-End em Ruby foi necessário gerar e passar por variável de ambiente (hard-coded) uma nova chave master.key durante a criação do container no docker-compose pois o arquivo com a chave original não foi disponibilizado. **Isso não é uma boa prática visto que a chave secreta fica exposta**. No entanto para fins de testes acredito ser uma solução valida. No caso de uma aplicação real que seria deploiada/hospedada eu colocaria o valor dessa chave em uma variavel de ambiente do servidor e passaria durante a criação do container de forma dinâmica.\n\n\u003cbr\u003e\n\n---\nEsté projeto foi desenvolvido por Yohans Nascimento para o desafio técnico da vaga **DevOps Estagiário** na ***GoCase***. 🐋📱🌐","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyohansn%2Fgocase-devops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyohansn%2Fgocase-devops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyohansn%2Fgocase-devops/lists"}