menu

SHARKLABS

Ruby on Rails + Linux Service: Descomplicando o Systemd / Systemctl

/
/
Ruby on Rails + Linux Service: Descomplicando o Systemd / Systemctl
bookmark Ruby on Rails, Linux access_time

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.

Autor
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." Martin Fowler