O projeto consiste em provisionamento de máquinas automatizado e deploy blue/green para aplicações nodes Servidores para a aplicação e servidor de load balancer com haproxy.
E alguns scripts para teste de carga e parseamento de logs.
Este é apenas um exemplo simples, poderia ter usado o sistema de cluster provido pelo node, mas como é exemplo utilizamos para cada CPU disponível na máquina um novo processo da aplicação em uma porta diferente.
- Ansible
- Capistrano
gem install capistrano
- Capistrano npm (
gem install capistrano-npm
)
- Capistrano npm (
- Vagrant (Apenas para testes locais)
Para provisionar os servidores basta configurar o arquivo ansible/hosts
com os domínios/ips,
para o propósito de testes locais a pasta local/servers
contém Vagrants files para app e load balancer.
Primeiro baixamos as dependecias que são
- geerlingguy.certbot para certificados ssl
- hashbangcode.sendmail para envio de email simples
command: cd ansible && ansible-galaxy install -r requirements.yml
Agora basta aplicar os playbooks
command: ansible-playbook playbooks/site.yml
Para o deploy utilizamos o Capistrano, uma ferramente extremamente flexível para deploys e robusta.
A configuração de servidores deve ser feita em config/deploy/production.rb
e config/deploy/staging.rb
e a configuração do repositório git deve ser feita no arquivo config/deploy.rb
command: cap production deploy
A partir deste momento já deve estar acessivel pelo domínio/ip do servidor de load balancer (192.168.33.29 local) na porta 80.
Há um cron configurado para rodar o teste de carga usando Apache Benchmark todos os dias as 3:00AM parseamento de logs e envio por email.
Para o funcionamento de https é necessário um domínio válido para o certboot funcionar, e deve adicionar a variável cerboot: true
dentro do arquivo ansible/group_vars/lb/bootstrap.yml
.
Com o avanço de tecnologias como docker e kubernetes é muito mais viável utilizar destas.
Com containers é possível isolar toda a aplicação e deixar disponível o mesmo envirorment para todos, devs, qas, staging e production. Além de ser praticamente indispensável quando se trabalha com microservices.
E com kubernetes todo o gerenciamento de carga, auto scaling e monitoramento é muito mais simples, além de contar com o helm para facilitar o processo de deployment.