Deploy usando mina e Docker
tl;dr
ATENCÃO: O arquivo config/deploy.rb
aqui exposto é baseado num projeto que trabalhei, mas é uma PoC para o projeto escolhido. Use por sua conta e risco.
Este arquivo: isbn-vue-pg/config/deploy.rb.
$ mina setup
$ mina deploy
E tudo vai ficar configurado para você.
Faz muito tempo que meu ambiente de desenvolvimento é totalmente baseado em Docker. Acostumei e gosto muito do jeito que está.
Começei a fazer deploy usando mina e Docker em Setembro de 2017, sempre quiz compartilhar o meu config/deploy.rb
, mas por causa de alguns defeitos (próximo tópico) nunca o fiz.
Mas recentemente fui desafiado, a converça foi algo como:
Por que não usa ansible/chef?
(eu) Faço tudo usando mina e Docker, incluindo atualizar a versão do Ruby.
Mas ainda é necessário instalar Docker usando ssh, não é? Aí você vai precisar do ansible/chef.
Eu pensei muito sobre isso, sim, é uma limitação, mas pera, mina setup
faz o setup de tudo que é necessário para arquivos e diretórios, então, por que não fazer com que instale o Docker? 🤔
Grande lista de falhas e features não testadas
- Não testei rollback, razão: eu prefiro fazer um outro “revert commit”, PR para o master e fazer deploy novamente;
- Não testei chamar o
rails console
da máquina da minha máquina para o servidor, apenas façossh
edocker exec
; - O código desse
config/deploy.rb
não ficou muito dry, outro projeto que participo também inicia o sidekiq, lá eu fiz com que ficasse mais dry; - Não estou compilando os assets nesse projeto, pois o projeto do exemplo é apenas uma api Rails, mas estou compilando o Vue.js em outro estágio;
- Não tem zero-downtime deploy, mais uma vez: não é necessário para esse projeto;
Funcionalidades
A única dependência da máquina é o Docker, mas com esse config/deploy.rb
quando o desenvolvedor roda o mina setup
o mina já instala o Docker para vocé.
Tudo o mais é baixado usando o Docker. E é muito mais rápido já a imagem tem todas as dependências para rodar o projeto.
A imagem Ruby é a minha “general purpose Ruby image” que já está pronta para rodar qualquer projeto Ruby (incluindo testes automatizados).
A imagem para o Nodejs é uma imagem padrão do Nodejs. Para minha sorte 😉.
Outro ponto é que ao invés de copiar os arquivos para dentro da imagem Docker, como todo mundo faz, eu apenas monto o diretório como binding para o container. Todo o resto é to “jeito mina”.
Outras funcionalidades:
- Uso um Docker volume para instalar as gems;
- Se precisa atualizar a versão do Ruby basta mudar a chamada de
dmitryrck/ruby
para outra que queira; - Para este projeto eu testei usando Amazon EC2 (Ubuntu);
- O projeto do exemplo é um repo público no GitHub, você precisa mudar o
config/deploy.rb
para fazer deploy de projeto privado, nada muito complexo;
Não duvido que tenha outros (melhores) jeitos de fazer o mesmo, mas meu projeto já tava usando o mina, então fazia sentido apenas hackear o mina para fazer deploy usando o Docker. Se estiver fazendo algo similar poste nos comentários, é sempre interessante ver o que as outras pessoas estão fazendo 😉.
P. S.: Outra razão que usei o mina e Docker é que assim eu não preciso publicar uma imagem privada no Docker hub ou outro serviço.