如何让systemd用Puma重启Rails App

Wag*_*sUK 11 linux ruby-on-rails nginx systemd puma

我一直在努力这一周,现在似乎找不到答案.我已经用Capistrano部署了我的Rails应用程序.我使用Puma作为服务器.

当我部署时,一切正常.问题是让Puma在重启和/或崩溃时启动.

为了获得部署设置,我使用了本教程.我也在使用RVM.我似乎得到的问题是让服务启动Puma.这是我用过的(服务文件):

[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
Run Code Online (Sandbox Code Playgroud)

这不起作用.我开始认为问题是没有为所有用户安装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一个问题,但我无法弄清楚什么是错的,我不知道如何调试它.我在System的网站上看过调试页面,但它对我没有帮助.如果我systemctl status puma.service全部运行它会告诉我该服务处于失败状态,但它没有告诉我如何或为什么.

另外值得注意的是:如果我bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb从我的App文件夹运行它可以正常工作,那么如何使用Systemd服务复制此命令?

Wag*_*sUK 25

最后问题是双重的:1)没有为所有用户正确安装rvm,这意味着部署用户没有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
Run Code Online (Sandbox Code Playgroud)


小智 4

你调查过福尔曼吗?如果应用程序有多个进程,Foreman 可以轻松启动和停止应用程序。顺便说一句,它还提供了导出功能,可以生成一些systemd脚本upstart供您(重新)启动和停止您的应用程序。

由于您已经在使用 capistrano,因此您可以使用capistrano-foreman将所有这些与 capistrano 完美集成。

我希望您能在这些资源中找到一些用处