Skip to content
This repository was archived by the owner on Jul 3, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4bfb1db
docs: first overview on docker-compose file
userunknownn Feb 25, 2023
3921f7d
build: fixing database service name
userunknownn Feb 25, 2023
f6788c2
docs: explaining my network choices
userunknownn Feb 25, 2023
fa169e2
build: modifying and creating networks for the services
userunknownn Feb 25, 2023
7b9dada
docs: understanding the error on writer Dockerfile
userunknownn Feb 25, 2023
70267c0
build: fixing entrypoint on writer Dockerfile
userunknownn Feb 25, 2023
fe5e3b5
docs: finding dependency error on writer
userunknownn Feb 25, 2023
37c77df
build: installing redis dependency
userunknownn Feb 25, 2023
550bf29
docs: finding module error on reader
userunknownn Feb 25, 2023
fd0d977
build: initializing go module
userunknownn Feb 25, 2023
a0a0246
docs: understanding that i have to install redis and cors dependencie…
userunknownn Feb 25, 2023
ad55a74
build: installing cors and redis on reader
userunknownn Feb 25, 2023
01a15fe
docs: finding a error on reader code
userunknownn Feb 25, 2023
0435eee
fix: removing unnecessary argument on client.Get
userunknownn Feb 25, 2023
ae17b97
docs: finding inconsistencies in the web service
userunknownn Feb 25, 2023
34cba82
build: fixing inconsistencies about the port used on web service
userunknownn Feb 25, 2023
af9457b
docs: finding misplaced ports on services
userunknownn Feb 25, 2023
e2bb013
build: fixing misplaced ports
userunknownn Feb 25, 2023
0c1c5ce
docs: it seems its all working now
userunknownn Feb 25, 2023
8e386a6
chore: adding explanation image
userunknownn Feb 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 24 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,24 @@
# Desafio DevOps jr PicPay

Obrigado pelo interesse em fazer parte do nosso time! Preparamos este desafio com carinho para ajudar a entender um pouco mais dos seus conhecimentos na área de DevOps/SRE

Se não entender algum conceito ou parte do problema, não é motivo para se preocupar! Queremos que faça o desafio até onde souber.

No mais, divirta-se :D

## Conteúdo do repositório
Na pasta `services` deste repositório existem 3 aplicações, um frontend que se comunica com um backend go e um em python, e estes se comunicam com um Redis para troca de informações. Tudo isso é orquestrado pelo docker-compose na raiz do repositório.

As aplicações contém falhas propositais, de código, projeto, imagem docker, etc. Embora cada aplicação funcione individualmente, o conjunto não sobe...

## O que deve ser feito?

Faça um fork deste repositório e envie uma pull request contendo:
- ajustes que fazem todas as aplicações subirem e se comunicarem
- um README contendo os seus pensamentos ao longo do projeto
- um desenho contendo os serviços que explique o funcionamento

Faça commits ao longo do processo, queremos entender o seu modo de pensar! :)

Para a entrevista, separe também anotações contendo melhorias que faria em cada aplicação e o motivo. Não envie estas anotações na pull request.

## Bibliografia recomendada
https://docs.docker.com/engine/reference/builder/

https://docs.docker.com/compose/compose-file/

https://12factor.net/

https://conventionalcommits.org/
# Pensamentos durante o processo

* Visualizando o docker-compose é possível encontrar um serviço "reids" que utiliza uma imagem chamada redis:alpine, no reader e no writer que estão na pasta services, é utilizado redis_host: "redis" no reader e redishost = "redis", no write, então o nome deve ser redis para que o dns do docker permita a conexão.
* * *
* Ainda sem sair do docker-compose, é possivel ver que os serviços web e reader utilizam uma rede chamada frontend, que não está definida, e a rede backend também não possui um driver definido. Além disso, baseando-se no README original, o serviço web se comunica com os backends e os backends comunicam-se com o banco exclusivamente, o que indica a necessidade de outra rede para comunicação com redis. Para que se tenha a mesma definição de porta HOST:CONTAINER vou utilizar o driver bridge nas redes.
* * *
* Ao executar docker-compose up, o serviço de writer apresenta um erro, pelo docker logs, não é mostrada nenhuma informação pois o container não está em execução, mas
ao observar o Dockerfile do writer, o comando python abre o REPL do python não esperando por nenhum argumento, para que main.py seja executado é necessário ou usar CMD com python main.py ou ENTRYPOINT com python main.py, vou utilizar com ENTRYPOINT
* * *
* Após a mudança no ENTRYPOINT do writer o mesmo ainda apresenta erro na criação do container, neste caso um erro de dependencia, não foi instalado o modulo redis, para resolver isso vou adicionar pip install redis, no Dockerfile do writer.
* * *
* Depois da dependencia do redis ter sido, instalada, o writer está rodando, o que foi checado utilizando do comando "docker ps", no entanto o reader, não está executando, ao checar os logs do reader, é apresentado um erro "go.mod not found", para resolver este problema vou adicionar "go mod init", no Dockerfile do reader
* * *
* Ao executar o reader, uma vez que o modulo foi iniciado, este apresenta um erro de duas dependencias, redis e cors, a mensagem de erro diz como instala-las,
vou adicionar estes "go get ..." no Dockerfile do reader
* * *
* Depois de instalar cors e redis no reader, é apresentado um erro de código informando que foram passados dois argumentos onde somente um era necessário, é mostrado que isso ocorre na linha 27, no método client.cmdable.Get, onde são passados um context.Context como primeiro argumento e uma string como segundo argumento e que só é necessário o argumento string, vou remover o primeiro argumento do código.
* * *
* Agora que o código do reader foi alterado, todos os serviços estão executando, vou obter os logs de cada um e analisar. Nem o writer nem o reader possuem logs, os logs do redis dizem que ele está pronto para receber conexões e o do serviço web diz, que ele está executando na porta 3000, acredito que no docker-compose não tinha a porta 3000 ... . Não no docker-compose o serviço web é declarado na porta 5000, como está o Dockerfile ? Tem um Expose 5000 ... Neste caso, vou alterar o EXPOSE para o valor correto no Dockerfile e o serviço web para ser na porta 3000:3000, para seguir o padrão da mesma porta no host e no container.
* * *
* Com a modificação sobre a porta do serviço web, e os serivços rodando, vou acessar a aplicação e ver seu funcionamento ... Ao abrir no localhost:3000, encontro que os serviçoes writer e reader estão down ... Acessando o app.js vejo que o reader é na porta 8080, e o writer na porta 8081, no dockerfile do reader é exposta a porta 8080 e no dockerfile do writer é exposta a porta 8081, porém no docker-compose estas estão trocadas, o reader com a porta 8081 e o writer com a porta 8080, vou fazer a alteração para bater com as portas que forma expostas.
* * *
* Agora que as portas foram corrigidas, o frontend indica que o reader e o writer estão up, ao mesmo tempo ao clicar em enviar no writer este faz uma requisição, e no reader é preciso recarregar a página para que o conteúdo seja mostrado, vou parar o container do redis, para checar se realmente está sendo feito o uso dele... Ao parar o redis, e fazer uma submissão no writer, o conteúdo do reader fica vazio, ao reiniciar o redis o último valor antes da interrupção deste é mostrado, ao enviar outra coisa no writer e recarregar a pagina do reader o novo valor é inserido, o que significa que a comunição com o redis está funcionando.
* * *
17 changes: 13 additions & 4 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,33 @@ services:
web:
build: services/frontend
ports:
- "5000:5000"
- "3000:3000"
networks:
- frontend
- backend
reader:
build: services/reader
ports:
- "8081:8081"
- "8080:8080"
networks:
- frontend
- database
writer:
build: services/writer
ports:
- "8080:8080"
- "8081:8081"
networks:
- backend
reids:
- database
redis:
image: "redis:alpine"
networks:
- database

networks:
backend:
driver: bridge
frontend:
driver: bridge
database:
driver: bridge
Binary file added drawn services interaction explanation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions services/frontend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ FROM node:latest
WORKDIR /app
ADD . .
RUN npm install -g serve
EXPOSE 5000
CMD "serve"
EXPOSE 3000
CMD "serve"
5 changes: 4 additions & 1 deletion services/reader/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ WORKDIR /go/src/github.com/PicPay/picpay-jr-devops-challenge/services/go
ADD . /go/src/github.com/PicPay/picpay-jr-devops-challenge/services/go

EXPOSE 8080
CMD ["go","run","main.go"]
RUN ["go","mod","init"]
RUN ["go","get","github.com/rs/cors"]
RUN ["go","get","github.com/go-redis/redis"]
CMD ["go","run","main.go"]
4 changes: 2 additions & 2 deletions services/reader/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ func main() {

mux.HandleFunc("/data", func(writer http.ResponseWriter, request *http.Request) {
client := redis.NewClient(&redis.Options{Addr: redis_host+":"+redis_port})
key := client.Get(client.Context(),"SHAREDKEY")
key := client.Get("SHAREDKEY")
fmt.Fprintf(writer, key.Val())
})

Expand All @@ -35,4 +35,4 @@ func main() {

log.Fatal(http.ListenAndServe(":8080", handler))

}
}
4 changes: 2 additions & 2 deletions services/writer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ FROM python:3.9
WORKDIR /app
ADD . /app
EXPOSE 8081
CMD ["python"]
ENTRYPOINT ["main.py"]
RUN ["pip","install","redis"]
ENTRYPOINT ["python","main.py"]