Как получить 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