Ubuntu – Setting up Thin, Bundler and Ubuntu

bundlercapistranorubythinUbuntu

I have a very simple Ruby application which uses Thin and Bundler that I need to stick on an Ubuntu box.

I've got as far as getting Ruby, bundler etc installed on the server, but am having trouble running the application itself.

Essentially I need a nice way of starting, stopping and restarting the application via capistrano.

My init.d script looks pretty much like this:

DAEMON=/home/ubuntu/apps/my_app/shared/bundle/ruby/1.8/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
        cd /home/ubuntu/apps/my_app/current && bundle exec thin start -d -C /etc/thin/my_app.yml
        ;;
  stop)
        cd /home/ubuntu/apps/my_app/current && bundle exec thin stop -d -C /etc/thin/my_app.yml
        ;;
  restart)
        cd /home/ubuntu/apps/my_app/current && bundle exec thin restart -d -C /etc/thin/my_app.yml
        ;;
  *)
        echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

This results in:

/home/ubuntu/apps/my_app/shared/bundle/ruby/1.8/gems/thin-1.3.1/lib/thin/daemonizing.rb:51:in `daemonize': uninitialized constant Thin::Daemonizable::Daemonize (NameError)

Running sudo bundle exec thin start from the application root on the server works just fine (although not as a daemon).

Therefore, how can I set this application up so that it'll start up as a daemon and be controllable via an init.d script / monit etc?

Best Answer

You could create binstubs. using these the init-script should be like any other. thin just needs --damonize as parameter if you do not specify it in your thin.yaml. With thin install thin generates an init-script for you

BUNDLE INSTALL --BINSTUBS

If you use the --binstubs flag in bundle install(1), Bundler will automatically create a directory (which defaults to app_root/bin) containing all of the executables available from gems in the bundle.

After using --binstubs, bin/rspec spec/my_spec.rb is identical to bundle exec rspec spec/my_spec.rb.

http://gembundler.com/man/bundle-exec.1.html

Based on these features this works for me:

bundle install --binstubs
./bin/thin install
/etc/init.d/thin start
Related Topic