Ruby on Rails

Dokku: a melhor forma de hospedar projetos pessoais

17 Jan 2023

Desde que o Heroku acabou com planos gratuitos, ficou bem mais difícil hospedar pequenos projetos pessoais. No meu caso, como tenho projetos em Ruby on Rails, React, Next.js e HTML estático, acabava tendo que pagar diversos serviços de hospedagem. Usava Render e Hostgator, gastando em média uns R$ 100, mas agora troquei tudo por um container do Digital Ocean de $7 onde coloquei tudo (cerca de 40% de economia).

O que tornou isso possível foi o Dokku. É como se fosse um Heroku open-source que você que gerencia no seu próprio servidor. Parece meio assustador: como assim vou ficar responsável por gerenciar um Heroku inteiro? Isso me manteve distante e com medo, mas agora que fiz essa migração posso dizer que perdi muito tempo (e dinheiro).

É muito fácil, os passos são mais ou menos esses:

  1. 1. Cria uma conta no Digital Ocean e cria um novo droplet.
  2. 2. Acessa o seu servidor na sua máquina local com SSH.
  3. 3. Roda o script de instalação do Dokku.
  4. 4. Baixa os plugins necessários pra rodar o Rails (Ruby e Postgresql)
  5. 5. Cria um novo app com uma linha de código.
  6. 6. Cria um novo banco de dados com uma linha de código.
  7. 7. Linka o banco de dados ao Rails.
  8. 8. Adiciona o domínio.
  9. 9. Configura o repositório Git para poder enviar os arquivos.
  10. 10. Usa o Let's Encrypt para gerar certificados SSL.

Pronto. Repita quantas vezes quiser (até o servidor aguentar) com quantas aplicações quiser, de qualquer framework e linguagem.

Eu não fiz um tutorial completo, quis apenas mostrar os passos para mostrar que é simples. Na minha cabeça, eu só iria poder fazer algo do tipo depois de ler Deployment from Scratch, mas é tudo tão simplificado que você vai aprendendo os conceitos na hora.

Caso queira seguir um bom tutorial, tem dois em português: um do Lucas Caton em vídeo, e outro do Stephann em texto. O do Lucas é bem didático, mas vale a pena seguir o do Stephann em paralelo que está mais atualizado.

Acabei me esbarrando em alguns problemas que foram metade do meu tempo fazendo essa migração, vou colocar aqui para ajudar quem deparar com isso:

1. Não apareceu a tela de configuração inicial do Dokku depois de instalado. Pelo que andei lendo, eles removeram porque acabava deixando mais vulnerável. Eu pulei essa parte dos tutoriais porque achei que seria irrelevante, mas não é. Se você não configurar a chave pública do SSH, vai empacar na hora de fazer git push dokku. A solução é configurar isso manualmente pela linha de comando. Eu fiz isso assim:

echo 'minha-chave-publica' | dokku ssh-keys:add admin

2. Se você usa Amazon S3 para armazenar as mídias do seu site, muito cuidado! De preferência, entre nas suas credenciais do Rails por meio do comando EDITOR="code --wait" rails credentials:edit e guarde as chaves atuais. Eu acabei mudando as minhas e acho que isso que gerou o erro 3. Pegue as credenciais atuais (AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY) e adicione nas variáveis de ambiente da mesma forma que você adicionou a RAILS_MASTER_KEY.

3. Como eu acabei gerando novas credenciais (não sei se foi esse o problema), as imagens do meu blog não apareciam mais. Não achei uma solução, então acabei modificando-as manualmente. Mas imagina a dor de cabeça que seria se fossem várias imagens? Se alguém tiver alguma solução, seria bom saber por quê.

4. Para migrar os dados do banco antigo para o novo, o melhor caminho que achei foi fazendo o pg_dump para fazer o download do Render o dokku posgtres:import para importar no novo banco. Eis os códigos que utilizei:

# Para fazer download:
PGPASSWORD=<YOUR_DB_PASS> pg_dump \
  -h <HOST-URL> \
  -U <YOUR_DB_USER> \
  --format=custom --no-acl --no-owner \
  <YOUR_DB_NAME> > <YOUR_DUMP_NAME>.dump

# Para importar.
# Primeiro, enviei para o Amazon S3
# (ou qualquer outro lugar)
# Depois, fiz download numa nova
# pasta do servidor:
wget <link-do-dump-online> -P dump/

# Depois fiz a importação:
dokku postgres:import <nome_banco_de_dados> < dump/<nome_do_dump>.dump

Depois é só se divertir, enviar todos os projetinhos pra lá e ficar em paz. Umas 5 horas de trabalho me pouparam uns 70 reais mensais. Acho que vale a pena.

Receba atualizações por e-mail

Sempre que tiver novidades por aqui vou enviar aos inscritos.

Entre na conversa

Criei uma postagem lá no LinkedIn para receber comentários:

Comente