Deploy usando mina e Docker

#dev, #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ço ssh e docker 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.