RVM and thin, root vs. local user

RVM comes with a handy wrapper generator that creates an intermediary loader for an init.d script. This allows you to load a service using a particular Ruby version and gemset. I use it like this (after installing the thin gem):

1 – create init.d entry for thin

sudo thin install 

2 – set up some defaults

sudo /usr/sbin/update-rc.d -f thin defaults 

3 – generate boot config for your rails app

sudo thin config -C /etc/thin/<appname>.yml -c /var/rails/<appdir> --servers 4 -e production

4 – generate rvm wrapper script

rvm wrapper <rubyversion>@<gemset> bootup thin

5 – If you’re using a global gemset, you can just use

rvm wrapper ruby-1.9.2-p125 bootup thin

6 – edit thin init

sudo nano /etc/init.d/thin

7 – change the original loader

DAEMON=/usr/local/rvm/gems/ruby-<rubyversion>-<rubyrevision>@<gemset>/bin/thin

8 – to point to the rvm wrapper instead

DAEMON=/usr/local/bin/bootup_thin

9 – start it up

sudo service thin start

If you’re running more than one app, just generate a boot config yml file for each one; when booting thin all yml files in /etc/thin/ are parsed. More info here:

http://wiki.rubyonrails.org/deployment/nginx-thin?rev=1233246014 nb: This is linking to a revision, the most current version has been edited to be empty. Consider looking at the link without the ?rev=... in the url, the current version may be back and potentially more up to date.

HTH

2013 BONUS EDIT

While I no longer use RVM in production, thin is still my production server of choice, and I still use steps 1-3 above to get started. But the default configuration it generates can do with a few tweaks, here are some of mine:

Set the user & group that thin runs as:

user: www-data
group: www-data

Remove the port config and switch to using sockets instead (a little faster):

# port: 3000
socket: tmp/sockets/<appname>.sock

Tell thin to restart instances one by one, instead of shutting them all down before starting up again (rolling restart):

onebyone: true

Give the server processes a “tag” to help identify them (in ps aux etc):

tag: <appname>

Leave a Comment