Как получить systemd для перезапуска приложения Rails с помощью Puma

я боролся с этим неделю и действительно не могу найти ответ. Я развернул приложение Rails с Capistrano. Я использую Puma в качестве сервера.

когда я развертываю, все работает нормально. Проблема заключается в том, чтобы заставить Puma запускаться при перезагрузке и/или при сбое.

чтобы получить настройку развертывания, я использовал это учебник. Я также использую RVM. Проблема, которую я, кажется, получаю, - это заставить службу запустить Puma. Вот что я использовал (service файл):

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

#User=my-user

WorkingDirectory=/home/my-user/apps/MyApp/current

ExecStart=/home/my-user/apps/MyApp/current/sbin/puma -C /home/my-user/apps/MyApp/shared/puma.rb

Restart=always

[Install]
WantedBy=multi-user.target

это не сработает. Я начал думать, что проблема в том, что Ruby не устанавливается для всех пользователей, поэтому я установил RVM для всех пользователей и по-прежнему получаю ту же проблему. Мой сервер имеет только root и my-user.

глядя на то, как Capistrano развертывается, команда, которую он запускает:cd /home/my-user/apps/MyApp/current && ( RACK_ENV=production /home/my-user/.rvm/bin/rvm default do bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb --daemon ). Если я использую вышеупомянутую команду, я получаю ошибку от Systmd, жалующегося на отсутствующие параметры. Поэтому я написал сценарий с ним и получил файл службы, чтобы вызвать это скрипт для запуска приложения.

это тоже не работает. Обратите внимание, что если я вызываю скрипт из любого места на сервере, скрипт запускает приложение, поэтому его проблема в настройке Systemd, но я не могу понять, что не так, и я не уверен, как отладить его. Я видел страницу отладки на веб-сайте системы, но это не помогло мне. Если я побегу systemctl status puma.service все, что он говорит мне, что служба находится в состоянии сбоя, но он не говорит мне, как и почему.

также стоит отметить: если я запускаю bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb из моей папки приложения он работает нормально, так как я могу дублировать эту команду с Systemd service?

2 ответов


вы заглянули в старшина ? Foreman позволяет легко запускать и останавливать приложение, если оно имеет несколько процессов. Кстати, он также предоставляет экспорт функция, которая может генерировать некоторые systemd или upstart скрипты для запуска и остановки приложения.

поскольку вы уже используете capistrano, вы можете использовать Капистрано-прораб интегрировать все это красиво с capistrano.

Я надеюсь, что вы найдете некоторое использование в этих ресурсах


в конце проблема была двоякой: 1) rvm не был установлен должным образом для всех пользователей, что означало, что у пользователя deployer не было ruby/bundle/etc, и во-вторых, сценарий также был неправильным. Для справки ниже приведен пересмотренный скрипт, который работал для меня:

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

User=deployer

WorkingDirectory=/var/www/apps/MRCbe/current

ExecStart=/bin/bash -lc 'bundle exec puma -C /var/www/apps/MRCbe/shared/puma.rb'

Restart=always

[Install]
WantedBy=multi-user.target