Debian, runit, chruby, bundler
Pretty much ever since I wrote it the software that powers this blog – a Ruby Sinatra app called “My Way” – has been running on a Bytemark VM inside a tmux session, and every time I’ve rebooted the server I’ve not only had to restart it by hand but first to remember how to restart it by hand.
I’m in the process of migrating the said VM to one of Bytemark’s new BigV VMs (New! Shiny! More RAM! Marginally Cheaper!) and taking the opportunity to clean it up a bit first. After reading Steve Kemp’s article on runit I decided to give that a go. This is notes-to-myself on what I’ve found so far
:; cat /etc/sv/my-way/run #!/bin/bash exec 2>&1 cd /home/my-way/my-way . /usr/local/share/chruby/chruby.sh chruby ruby-2.0.0 export LANG=en_GB.UTF-8 exec chpst -u my-way -v bundle exec ruby -I lib bin/my-way.rb :; sudo update-service --add /etc/sv/my-way Service my-way added.
This is the script that starts the blog server, and the installation procedure thereof
Worthy of note:
- per convention, the run scripts (and attendant files) live in
/etc/sv/someservicename, and these directories are are then symlinked into
- chruby doesn’t run in sh, so we run this script under bash
- it redirects stderr to stdout so the svlog process (see below) can see it
- it runs as root up until the chpst invocation, so the ruby that you
specify needs to be in
/opt/rubiesand not in
/home/yourusualuser/.rubies. If you ran
sudoit will have put it in the right place.
bundle installwith the
--deploymentflag when installing the ruby project will have sidestepped a whole class of “can’t find your gems” issues. So do that.
Next up is
:; cat /etc/sv/my-way/log/run #!/bin/sh exec svlogd /var/log/my-way
This is the script that makes sure logs go somewhere. Specifically,
they go to the file
/var/log/my-way/current, which svlog is able
(though as far as I know not yet configured) to rotate according to some
defined criteria, and without needing to restart the server. The log
files are owned by root, but maybe that’s changeable using
:; sudo sv status my-way down: my-way: 94s, normally up; run: log: (pid 13620) 48806s :; sudo sv start my-way ok: run: my-way: (pid 28343) 0s :; sudo sv status my-way run: my-way: (pid 28343) 8s; run: log: (pid 13620) 48818s :; pkill ruby :; sudo sv status my-way run: my-way: (pid 28379) 31s; run: log: (pid 13620) 48949s :; sudo sv stop my-way ok: down: my-way: 0s, normally up
And here’s how I start and stop it and stuff. Note that it magically
restarted after I ran
If you can read this, it works.