如何让systemd重新启动与Puma的Rails应用程序

我一直在这一个星期挣扎,似乎无法find答案。 我已经用Capistrano部署了我的Rails应用程序。 我使用Puma作为服务器。

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

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

[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和我的用户。

看看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抱怨缺less参数的错误。 所以我写了一个脚本,并得到了服务文件来调用这个脚本来启动应用程序。

那也行不通。 请注意,如果我从服务器上的任何地方调用脚本,脚本确实会启动应用程序,所以它在configurationSystemd时遇到问题,但我无法弄清楚什么是错误的,我不知道如何debugging它。 我已经看到系统网站上的debugging页面,但它并没有帮助我。 如果我运行systemctl status puma.service它告诉我的是服务处于失败状态,但它不告诉我如何或为什么。

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

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

因为你已经在使用capistrano,你可以使用capistrano-foreman将这一切与capistrano完美地结合在一起。

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

最后问题有两个: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