我已经苦恼了一个星期,但似乎找不到答案。我使用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
这行不通。我开始认为问题出在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 )
。如果我使用上述命令,我会收到来自Systemd的错误,指出缺少参数。所以我写了一个脚本,并让服务文件调用此脚本来启动应用程序。
那也不行。请注意,如果我从服务器的任何位置调用脚本,脚本确实会启动应用程序,因此这是在配置Systemd时出现的问题,但我无法弄清楚问题出在哪里,也不知道如何进行调试。我已经看过System网站上的调试页面,但没有帮助我。如果我运行systemctl status puma.service
,它告诉我服务处于失败状态,但它没有告诉我如何或为什么出错。
还值得注意的是:如果我从我的应用程序文件夹中运行bundle exec puma -C /home/my-user/apps/MyApp/shared/puma.rb
,它可以正常工作,所以我该如何使用Systemd服务复制此命令?