Usando o Foreman para iniciar o ambiente de seu projeto


Leia em 1 minuto

Todos sabemos que um projeto, por mais simples que seja, não fica somente em sua aplicação web e banco de dados. Se você tem a sorte de trabalhar em um projeto tão simples assim, agradeça.

Para os que não tem a mesma sorte, é muito comum termos que levantar serviços como Redis, Memcached, algum background job, além do próprio servidor de desenvolvimento do Rails. E, normalmente, fazemos isso manualmente, reservando uma aba do terminal para cada um deles. Sim, eu sei… uma bagunça!

Umas das soluções para este problema é usar o Foreman. Com ele você pode definir um arquivo manifesto com todos os serviços que serão levantados. Depois, basta executar um único comando e o Foreman se encarregará de iniciar estes serviços.

Para instalar o Foreman, basta executar o comando gem install foreman. Depois, precisamos criar o nosso arquivo de manifesto chamado Procfile, na raíz do projeto. Este arquivo precisa de uma chave definindo o nome do serviço e um comando que será executado. Veja, por exemplo, o arquivo que utilizo no Pingd.

redis: redis-server config/redis/development.conf
sidekiq: bundle exec sidekiq -v
sidekiq_web: bundle exec thin -R sidekiq.ru start -p 9292
mailcatcher: bundle exec mailcatcher --http-ip 0.0.0.0 -f
jasmine: bundle exec rake jasmine
web: bundle exec rails s

Bastante coisa! Como pode ver, é um ambiente de desenvolvimento um tanto quanto complexo. Se eu tivesse que levantar cada serviço manualmente, teria um bom trabalho.

Para iniciar o ambiente, basta executar o comando foreman start.

Foreman sendo executado no Terminal

O Foreman também é o modo como os serviços são levantados no Heroku. No entanto, nem todas as dependências podem ser levantadas da mesma maneira. Por exemplo, você irá ter alguma coisa como o servidor web e, talvez, um worker. Todas as outras dependências como Redis e MongoDB são configuradas através de variáveis de ambiente, que apontam para produtos externos; não é você quem inicia os serviços.

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec rake worker --trace

Neste caso, o arquivo precisa, necessariamente, ser diferente. Para resolver este problema, normalmente crio um arquivo chamado Procfile.development, que é iniciado com o comando foreman start -f Procfile.development. Assim, posso ter um arquivo específico para o Heroku—Procfile—e outro para desenvolvimento.