Ruby on Rails + Linux Service: Descomplicando o Systemd / Systemctl
Veja como criar um serviço e iniciar automaticamente seu aplicativo Ruby on Rails em servidor com Linux.
App Ruby on Rails: Como iniciar automaticamente no Linux
Cenário: Você fez Deploy de um aplicativo Ruby on Rails em um servidor Linux e você precisa configurar seu software para iniciar automaticamente junto com o sistema operacional.
Uma opção bem comum é iniciar seu aplicativo por algum script de inicialização, como no arquivo /etc/bash.bashrc. Eu não gosto desse tipo de inicialização, uma vez que pode dificultar a manutenção do aplicativo, principalmente quando você precisa parar ou reiniciar o seu programa.
Uma ótima maneira para controlar aplicativos que rodam em background é por meio de serviços e você pode configurar (ou não) para eles iniciarem automaticamente junto com o sistema operacional.
Linux Service: Systemd e Systemctl
O Systemd é um gerenciador de serviços para Linux que surgiu dentro projeto Fedora/RedHat. Embora ele não seja unanimidade e existam boas alternativas, o Systemd está presente na maioria das distribuições (inclusive no Debian e Ubuntu).
O Systemctl é comando para controlar e gerenciar o serviços do Systemd. Existem excelentes tutoriais mostrando várias funcionalidades, separei dois tutoriais que consulto quando surge alguma dúvida:
Ruby on Rails e Systemd / Systemctl
Para configurar um aplicativo Ruby on Rails no Systemd é muito fácil. Primeiramente você precisa criar um arquivo na pasta /etc/systemd/system. Este arquivo pode possuir qualquer nome, mas sempre com o sufixo .service .
Por exemplo, vou criar um arquivo com o nome myprogram.service e com o seguinte conteúdo:
[Unit]
Description=Meu Programa Ruby on Rails
[Service]
SyslogIdentifier=myprogram
User=myuser
Group=root
WorkingDirectory=/srv/myprogram/
ExecStart=/bin/bash /srv/myprogram/start.sh
[Install]
WantedBy=multi-user.target
Neste arquivo contem a descrição do serviço, um identificador (preferencialmente sem caracteres especiais), usuário e grupo de acesso (preferencialmente root para evitar problemas com privilégios).
É possível perceber que meu software está na pasta /srv
. Normalmente eu coloco meus aplicativos nesta pasta, uma vez que ela é direcionada para "serviços prestados/fornecidos". Para mais informações veja este link.
Veja que no fim do arquivo existe o item WantedBy=multi-user.target
e isso quer dizer que seu aplicativo iniciará com nível 2 de execução. Caso você deseje iniciar o seu aplicativo com outro nível, recomendo que você leia está discussão no Stack Exchange.
Pronto! Seu serviço foi criado e configurado, para iniciar o aplicativo execute este comando:
sudo systemctl start myprogram.service
Além deste, existem outros comandos importantes
# Parar o serviço
sudo systemctl stop myprogram.service
# Mostra a situação atual do serviço e é muito útil para obter mensagens de erro.
sudo systemctl status myprogram.service
# Habilitar para o serviço iniciar automaticamente junto com o sistema operacional.
sudo systemctl enable myprogram.service
# Desabilitar a inicialização automática.
sudo systemctl disable myprogram.service
Por fim, é necessário criar o arquivo /srv/myprogram/start.sh
. Muita atenção com este arquivo, uma vez que é preciso carregar tudo que você necessita (variáveis de ambientes, funções de shell, etc.). Segue o conteúdo do arquivo:
source /home/USERNAME/.rvm/bin/rvm
export RAILS_ENV=production
rails s
O Systemd possui várias outras funcionalidades, mas estas são as mais básicas e que você usará no seu dia-a-dia.
Dúvidas ou sugestões é só entrar em contato. Abraço.