{"id":22868354,"url":"https://github.com/deirofelippe/agenda-telefonica","last_synced_at":"2026-04-10T06:34:40.275Z","repository":{"id":43465987,"uuid":"462619280","full_name":"deirofelippe/agenda-telefonica","owner":"deirofelippe","description":"Agenda telefonica com: Nodejs, React (contextAPI), CSS responsivo, S3 com Serverless Framework e Localstack, Testes no backend e Docker Compose","archived":false,"fork":false,"pushed_at":"2025-01-20T20:56:31.000Z","size":4214,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-06T15:53:19.662Z","etag":null,"topics":["aws","css","docker-compose","ec2","express","html","localstack","mysql","nodejs","rds","reactjs","responsive","s3","terraform","test","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/deirofelippe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2022-02-23T07:03:13.000Z","updated_at":"2025-01-20T20:56:35.000Z","dependencies_parsed_at":"2025-01-20T21:43:02.462Z","dependency_job_id":"d52e2d8e-522c-4eb7-9962-e8447df756f9","html_url":"https://github.com/deirofelippe/agenda-telefonica","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fagenda-telefonica","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fagenda-telefonica/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fagenda-telefonica/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deirofelippe%2Fagenda-telefonica/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deirofelippe","download_url":"https://codeload.github.com/deirofelippe/agenda-telefonica/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246458022,"owners_count":20780675,"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":["aws","css","docker-compose","ec2","express","html","localstack","mysql","nodejs","rds","reactjs","responsive","s3","terraform","test","typescript"],"created_at":"2024-12-13T12:33:30.411Z","updated_at":"2025-12-30T20:04:37.017Z","avatar_url":"https://github.com/deirofelippe.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Agenda telefônica\n\nEsse projeto foi um teste técnico feito em 3 dias com React, Nodejs, Express e MySQL. Posteriormente foi atualizado para fazer deploy na AWS S3 e usar seus serviços como AWS S3, AWS EC2 e AWS RDS, tudo provisionado com o Terraform. \n\nOutras mudanças foram:\n\n- a atualização de todas as libs\n- o uso do Docker\n- uso do Typescript no React\n- uso do useReducer no React\n- CI/CD com GitHub Actions e testar localmente com Act\n\nA aplicação sendo usada pode ser vista no youtube, abaixo:\n\n[![Vídeo da versão 1 sendo usada (Docker)](https://img.youtube.com/vi/V1DiE-N3WCM/0.jpg)](https://www.youtube.com/watch?v=V1DiE-N3WCM)\n\n## Sumário\n\n- [Ferramentas usadas](#ferramentas-usadas)\n- [Arquitetura do Sistema na AWS](#arquitetura-do-sistema-na-aws)\n- [Como executar com docker?](#como-executar-com-docker)\n    - [Executar os testes do backend e cobertura de código](#executar-os-testes-do-backend-e-cobertura-de-código)\n    - [Executar em desenvolvimento](#executar-em-desenvolvimento)\n- [Testar o CI/CD local com Act](#testar-o-cicd-local-com-act)\n- [Testar os scripts para o backend sempre rodar no vagrant](#testar-os-scripts-para-o-backend-sempre-rodar-no-vagrant)\n- [Deploy na AWS](#deploy-na-aws)\n- [Screenshots](#screenshots)\n\n## Ferramentas usadas\n\n| Nome | Versão |\n| :-: | :-: |\n| Docker | 27.3.1, build ce12230 |\n| Docker Compose | v2.29.7 |\n| Localstack | 3.1.10 |\n| MySQL | 8.0 |\n| Act (GH Actions) | v0.2.61 |\n| Nodejs | 22.11.0 |\n| Reactjs | 18.13.1 |\n| Typescript | 5.6.2 |\n| Vite | 5.4.10 |\n\n## Arquitetura do Sistema na AWS\n\n\u003cdiv style=\"display: flex; justify-content: center; align-items: center;\"\u003e\n    \u003cimg width=\"672px\" height=\"749px\" src=\"./img/agenda-aws-arch.png\" /\u003e\n\u003c/div\u003e\n\n## Como executar com docker?\n\n- `make init-all`: inicia os containers e terraform\n- As urls para acessar os serviços do docker são:\n    - Frontend: `http://localhost:3001/`\n    - Backend: `http://localhost:3000/`\n    - Bucket agenda-images: `http://localhost:4566/agenda-images`\n    - PhpMyAdmin: `http://localhost:8081/`\n- Finalize os containeres `make down`\n- Delete os recursos no Localstack: `make terraform-destroy-local`\n\n### Executar os testes do backend e cobertura de código\n\n- `make backend-test`\n\n### Testar o build do frontend localmente\n\n- `make frontend-express`\n\n### Executar em desenvolvimento\n\n- Abre o vscode na pasta da aplicação\n- Abrir o vscode no docker: `ctrl+shift+p` \u003e `\"Dev Containers: Rebuild and Reopen in Container\"` \u003e `enter`\n\n## Testar o CI/CD local com Act\n\n- `make ci-cd`\n\n## Testar os scripts para o backend sempre rodar no vagrant\n\n\u003e Não vai funcionar, pois o banco de dados não está configurado, mas pode ser testado o funcionamento do systemd. Se deletar ou parar o container, o script irá executar para deixar o container de 'novamente.\n\n- Crie a máquina virtual (VM): `vagrant up`\n- Copie o path absoluto do pivate key `vagrant ssh-config | grep IdentityFile`\n- Substitua o \u003cFILE_PATH\u003e pelo que foi copiado e execute: `rsync -vahz -e 'ssh -i \u003cFILE_PATH\u003e -p 2222' ./aws-scripts vagrant@127.0.0.1:/home/ubuntu/`\n- Execute `ssh -p 2222 -i \u003cFILE_PATH\u003e vagrant@127.0.0.1 bash /home/ubuntu/aws-scripts/init-all.sh` para configurar o backend na VM\n- Acesse a VM `vagrant ssh`\n    - `cd /home/ubuntu/aws-scripts`\n    - Veja o status do service criado `systemctl status agenda-backend`\n    - Veja os logs do service agenda-backend `sudo journalctl -u agenda-backend`\n    - Liste os containeres `make ls`\n    - Caso o container tenha sido criado, remova ele `make rm`\n    - Liste de novo `make ls`, ele deve ser criado automaticamente pelo script do systemd\n- Destrua a VM: `vagrant destroy`\n\n## Deploy na AWS\n\n- Gere a chave SSH para o EC2\n    - `ssh-keygen -t rsa -b 2048 -f ./agenda_ec2_key -N \"\"`\n    - `chmod 400 ./agenda_ec2_key`\n- `make terraform-init`\n- `make terraform-plan`\n- `make terraform-apply`\n    - Espere uns 5 segundos e execute novamente o comando de novo para exibir o IP do EC2 no output\n- Copie output que o terraform irá exibir para trocar as variáveis de ambiente do backend e do frontend:\n    - Copie o `ec2_public_ip` e cole na variável `prodBackendUrl` que está no arquivo `./frontend/src/env.ts`.\n    - Duplique o env file com `cp ./aws-scripts/agenda-backend/.env.backend.example ./aws-scripts/agenda-backend/.env.backend`.\n    - Copie o `rds_address` e `s3_frontend_endpoint` e substitua os valores `DB_HOST_PROD` e `FRONTEND_URL` no `.env.backend`.\n- Gere o build do frontend do frontend com as variáveis de ambiente já setadas do IP do EC2.\n    - `make frontend-pull-and-build`\n- Execute novamente o `make terraform-apply` para fazer upload do build gerado do frontend.\n- Deploy do backend\n    - Substitua o `\u003cPUBLIC-IP\u003e` dos comandos abaixo pelo IP do EC2.\n    - Faça upload do diretório aws-scripts para o EC2 via rsync com ssh `rsync -vahz -e 'ssh -i ./agenda_ec2_key -p 22' ./aws-scripts ubuntu@\u003cPUBLIC-IP\u003e:/home/ubuntu`\n    - Execute o script `init-all.sh` que está no EC2 `ssh -i ./agenda_ec2_key ubuntu@\u003cPUBLIC-IP\u003e bash /home/ubuntu/aws-scripts/init-all.sh`\n- Limpar os recursos criados na AWS\n    - Delete todos os objetos que existem o bucket `agenda-images` pela GUI ou pela CLI `aws s3 rm --recursive s3://agenda-images`\n    - Delete todos os recursos criados com `make terraform-destroy`\n\n## Screenshots\n\n\u003cdiv style=\"display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 25px 0px;\"\u003e\n    \u003cimg width=\"655px\" height=\"406px\" src=\"./img/1.png\" /\u003e\n    \u003cimg width=\"655px\" height=\"406px\" src=\"./img/2.png\" /\u003e\n    \u003cimg width=\"655px\" height=\"406px\" src=\"./img/3.png\" /\u003e\n    \u003cimg width=\"429px\" height=\"609px\" src=\"./img/4.png\" /\u003e\n    \u003cimg width=\"429px\" height=\"609px\" src=\"./img/5.png\" /\u003e\n    \u003cimg width=\"429px\" height=\"609px\" src=\"./img/6.png\" /\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeirofelippe%2Fagenda-telefonica","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeirofelippe%2Fagenda-telefonica","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeirofelippe%2Fagenda-telefonica/lists"}