开发者

Problem deploying Ruby+RVM and daemontools

开发者 https://www.devze.com 2023-03-06 08:31 出处:网络
I am using daemontools in production to keep the services alive and want to run a Ruby server, not Rails, and without RVM it works well but with RVM I have some issues.

I am using daemontools in production to keep the services alive and want to run a Ruby server, not Rails, and without RVM it works well but with RVM I have some issues.

My goal is to start a process by root, make it drop root rights to get another user rights and then spawn a Ruby process with RVM and a specified Ruby version.

Here is the run script I was using until now:

#!/bin/sh
exec 2>&1
cd /app/src
. /usr/local/rvm/s开发者_如何学运维cripts/rvm
rvm use 1.9.1-p378
exec setuidgid app_user ruby main.rb

This script works but setuidgid has a major problem: the application will be run by user <x> and group <x> and only this group. If the user is in other groups the process will not have their rights.

So it led me to another approach:

#!/bin/sh
exec 2>&1
cd /app
exec sudo -u app_user rvm 1.9.1-p378 exec ruby main.rb

This one works fine except it is the RVM process which is spawned by daemontools and it does not react when it receives a SIGTERM which is not really nice. Basically it means the service cannot be restarted by hand, which is not good.


I found the answer but looking at the rvmsudo script installed with rvm, here is a working run script:

#!/bin/sh
# redirect stderr to stdout
exec 2>&1

cd /app
# load rvm
. /usr/local/rvm/scripts/rvm

# select ruby version for this application
rvm use 1.9.1
# # depending on your configuration you may need to provide the absolute path to rvm, like that:
# /usr/local/bin/rvm use 1.9.1

# build the exec command line preserving the rvm environment
command="exec sudo -u app_user /usr/bin/env PATH='$PATH'"

[[ -n "${GEM_HOME:-}" ]] && command="${command} GEM_HOME='$GEM_HOME' "
[[ -n "${GEM_PATH:-}" ]] && command="${command} GEM_PATH='$GEM_PATH' "

# this is where your real command line goes
command="${command} ruby main.rb"

# run the application
eval "${command}"
0

精彩评论

暂无评论...
验证码 换一张
取 消