Debian, runit, chruby, bundler#
Sun, 19 Jan 2014 11:18:31 +0000
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 More RAM) 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
directories
/etc/sv/someservicename
, and these directories are are then symlinked into/etc/service
byupdate-service
- 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/rubies
and not in/home/yourusualuser/.rubies
. If you ranruby-install
undersudo
it will have put it in the right place. - runing
bundle install
with the--deployment
flag 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 chpst
again.
:; 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 pkill ruby
.
If you can read this, it works.