如何让使用Puma和Capistrano部署的Rails应用在重启后自动启动

3
我已成功部署了一个Rails 4,Puma,Nginx应用程序,使用Capistrano。当我执行cap production deploy时,一切都很顺利。我的问题是,如果服务器由于任何原因重新启动或崩溃,它不会重新启动。
我在DigitalOcean上使用Debian 8。看起来Debian 8使用systemd,所以我按照Puma的说明进行了操作,但没有成功。经过一些研究,我发现了一些更多的脚本,而最明智的脚本似乎是这个:
[Unit]
Description=Rails-Puma Webserver

[Service]
Type=simple
User=myuser
WorkingDirectory=/home/myuser/apps/myapp
ExecStart=/home/myuser/.rvm/rubies/ruby-2.2.2/bin/systemd_rails server -e production
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

我已经将上述文件保存在/etc/systemd/system/rails-puma.service中,然后启用它:sudo systemctl enable rails.service,最后启动它:sudo systemctl start rails-puma.service

不幸的是,这并没有起作用。 这是sudo systemctl status rails-puma.service的结果:

    ● rails-puma.service - Rails-Puma Webserver
   Loaded: loaded (/etc/systemd/system/rails-puma.service; enabled)
   Active: failed (Result: start-limit) since Thu 2016-07-07 12:11:58 EDT; 4s ago
  Process: 4373 ExecStart=/home/myuser/.rvm/rubies/ruby-2.2.2/bin/systemd_rails server -e production (code=exited, status=203/EXEC)
 Main PID: 4373 (code=exited, status=203/EXEC)

Jul 07 12:11:58 mrcProd systemd[1]: rails-puma.service: main process exited, code=exited, status=203/EXEC
Jul 07 12:11:58 mrcProd systemd[1]: Unit rails-puma.service entered failed state.
Jul 07 12:11:58 mrcProd systemd[1]: rails-puma.service start request repeated too quickly, refusing to start.
Jul 07 12:11:58 mrcProd systemd[1]: Failed to start Rails-Puma Webserver.
Jul 07 12:11:58 mrcProd systemd[1]: Unit rails-puma.service entered failed state.

我在这里做错了什么?


也许这个链接可以有所帮助:https://bbs.archlinux.org/viewtopic.php?id=149425。 - Wikiti
很遗憾,我已经尝试了各种组合,但是什么都行不通... - WagnerMatosUK
你的 Puma 错误日志文件中有没有有用的信息? - Wikiti
有一个/var/myapp/current/log/puma.error文件,它没有显示任何与启动/停止相关的内容。我猜想如果应用程序没有运行,这个文件就不会被使用,但是我不知道systemd的日志文件存放在哪里... - WagnerMatosUK
也许调试选项可以帮助您。另外,如果您手动运行/home/myuser/.rvm/rubies/ruby-2.2.2/bin/systemd_rails server -e production会发生什么? - Wikiti
显示剩余2条评论
1个回答

5

我有一个类似的服务,但是我声明了略微不同的/etc/systemd/system/puma.service

[Unit]
Description=Puma Control
After=network.target auditd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/puma/puma-start
ExecStop=/etc/puma/puma-stop

[Install]
WantedBy=multi-user.target

然后在/etc/puma/puma-start中进行操作。

#!/bin/bash -

cd /home/changeuser/apps/changeapp/current && ( export RACK_ENV="production" ; /home/changeuser/.rvm/bin/rvm default do bundle exec puma -C /home/changeuser/apps/changeapp/shared/puma.rb --daemon )

并且在 /etc/puma/puma-stop

#!/bin/bash -

cd /home/changeuser/apps/changeapp/current && ( export RACK_ENV="production" ; /home/changeuser/.rvm/bin/rvm default do bundle exec pumactl -S /home/changeuser/apps/changeapp/shared/tmp/pids/puma.state stop )

记得在设置完成后执行

chmod +x /etc/puma/puma-start
chmod +x /etc/puma/puma-stop
systemctl enable puma

然后进行测试

systemctl start puma
systemctl stop puma
systemctl restart puma
systemctl status puma

1
关于目前许多现有宝石处理启动和进程管理的状态的最新更新。看起来capistrano-foreman、foreman和RVM/Rubygems/Bundler的开发已经放缓,而宝石依赖关系也没有跟上。在尝试了一段时间后,我决定采用手动安装的方式,这被证明是最干净和最快捷的方法。 - Kosmonaut
1
在Ubuntu 16.04上,我在puma-start/stop中使用CD和export时遇到了问题,因此我现在使用以下命令:~/.rvm/bin/rvm default do bundle exec puma -C /home/deployer/apps/app_name/shared/config/puma.rb --daemon。这似乎在生产环境中加载。 - Kosmonaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接