AppNode
├── app
│ ├── Dockerfile
│ ├── package.json
│ └── server.js
├── chamadas.txt
├── docker-compose.yml
├── mysql
│ ├── db
│ │ └── database_schema.sql
│ └── Dockerfile
├── README.md
├── reverse
│ ├── Dockerfile
│ ├── nginx.conf
│ └── SSL
│ ├── cacert.pem
│ ├── servidor.crt
│ └── servidor.key
├── startProject.sh
└── testeAPI.sh
5 directories, 15 files
todo o ambiente foi projetado em Linux
porém como utilizaremos o Docker para deploy,
toda estrutura funcionará perfeitamente no windows/Linux/mac;
Aplicações necessárias:
Docker
Docker-compose
Openssl (para gerar o certificado proprietário)
Ansible (para chamada do ambiente na AWS)
:::Sobre o projeto:::
consiste em uma API, onde utiliza um banco de dados Mysql para armazenamento de dados,
e um proxy reverso para redirecionamento dos HTTP request.
O que foi feito para funcionamento do ambiente:
primeiramente a verificação do código server.js
no mesmo foi verificado variáveis de ambiente para o NODE.js
observando que não havia a chamada do dotenv,
foi adicionado ao inicio do código para o funcionamento correto.
Diretórios/arquivos:
foi criado um diretório /app organizando os docs referente a aplicação/servidor NODE.js,
no diretório terá seu dockerfile, server.js e package.json contendo a instalação das dependências para funcionamento do node.js
e dotenv a partir do npm, expondo a porta 8080 para funcionamento do servidor NODE.js.
foi criado um diretório /mysql organizando os docs referente ao banco mysql
contendo uma subpasta /db onde está o banco da aplicação, seu dockerfile na raiz na mesma estrutura,
no momento do build realizando a copia do banco para o entripoynt.d do mysql,
para que todo o banco seja criado automaticamente deixando tudo mais prático.
foi criado um diretorio /reverser organizando os docs referente ao proxy reverso
e uma subpasta /SSL nela contém os certificados para funcionamento do SSL
em o seu dockerfile os parametros fazendo o build e copiando os certificados,
junto também a copia do nginx.conf onde possui a config para o proxy reverso e funcionamento do SSL.
Sobre o Docker-compose.yaml:
nele terá todo código de deploy da aplicação,
em primeiro faço que o container MySQL inicie, preparando o banco junto de suas variáveis;
em segundo com uma dependecia do MySQL, ele somente inicia após o SQL está ok, container do servidor NODE.js
em terceiro o proxy reverso, utilizo um Nginx para tal, somente inicia após o container do servidor NODE.js está operante;
Iniciando tudo automaticamente em ambiente Linux:
no terminal ao realizar o git clone do projeto,
navegue até /AppNode, onde está localizado o script de inicialização.
ainda no terminal precisaremos dar permissão de execução ao shell-script de inicialização;
$ chmod +x ./startProject.sh
após conceder permissão de execução apenas execute o script:
$ ./startProject.sh
será relizada toda verificação necessária, se já possui imagens ou buildś
após as verificação ira iniciar todo ambiente em docker, ao fim disponibilizando para uso.
para inciar o Ambiente manualmente com $ docker-compose up
em Linux/Windows/Mac:
recomendado remover qualquer versão das seguintes imagens em seu docker:
ngix , mysql:5.7, node:10
-- Evitando qualquer conflito, para isso utilize:
$ docker image rm nginx:latest mysql:5.7 node:10
após a verificação e limpeza das imagens, iniciar todo o build e deploy com:
$ docker-compose up
Teste automatizado:
Precisamos realizar o mesmo procedimento de permissão de execução para o testeAPI.sh
dentro do diretorio raiz do projeto: /AppNode, realize o seguinte:
$ chmod +x ./testeAPI.sh
Após basta chamar o Shell-Script:
$ ./testeAPI.sh
Referente ao SSL
SSL adicionado, https funcionando para o projeto.
Projeto/API operando tanto na porta 80 quanto 443
- Para implementação do SSL foi gerado um certificado proprietário assinado pela CApŕopria,
utilizando o openssl com os seguintes comandos:
Gerar a chave privada com 4096 bits da CA:
$ openssl genrsa -des3 -out cacert.key 4096
Gerar o certificado auto-assinado da CA com validade de 10 anos:
$ openssl req -new -x509 -days 3650 -key cacert.key -out cacert.pem
Criar a chave privada do servidor que será assinado pela CA:
$ openssl genrsa -out servidor.key 4096
Gerar a requisição de certificado do servidor que será assinado pela CA:
$ openssl req -new -key servidor.key -out servidor.csr
Assinar o certificado do servidor pela CA com validade de 10 anos:
$ openssl x509 -req -in servidor.csr -out servidor.crt -sha1 -CA cacert.pem -CAkey cacert.key -CAcreateserial -days 3650
Foi adicionado a seção SSL no arquivo de config do nginx.
rodando o projeto em Stack para cluster SWARM
Dentro do diretório principal basta chamar o seguinte:
docker swarm init ( iniciará o cluster swarm )
docker stack deploy -c docker-compose.yml DevOpsChallenge
para verificar o cluster:
docker stack ls <br/>
verificar os serviços:
docker service ls
caso queira escalar a quantidade de serviços para que o swarm realize o balancemento de carga:
docker service update "nome do serviço que deseja escalar" --replicas "quantidade"