среда, 23 ноября 2011 г.

Автозапуск RoR-приложения в thin при загрузке операционной системы (Debian)

Задача

Необходимо настроить автозапуск RoR-приложения с веб-сервером thin при старте системы [Debian], осложняющими задачу факторами является: запуск из-под определённого пользователя, у которого Ruby & RoR установлены из-под юзерской инсталляции RVM, а само RoR-приложение установленно в определённом gemset.

Решение

Переходим в каталог приложения и выполняем следующие команды:
$ rvmsudo thin install
$ rvmsudo update-rc.d -f thin defaults
# sudo thin config -C /etc/thin/APPNAME.yml -c /PATH/TO/ROR/APP --servers N -e production
$ rvm wrapper RUBYVERSION@GEMSET bootup thin
Вышеприведённые команды выполняют следуещее:
  1. создаёт /etc/thin и /etc/init.d/thin;
  2. устанавливает дефолтные ссылки сценариев инициализации;
  3. устанавливает настройки thin для приложения (в данном случае — production, N серверов) в файл /etc/thin/APPNAME.yml;
  4. создаёт враппер для запуска thin с определённым для приложения гемсетом.
Правим файлик /etc/init.d/thin, чтобы thin запускался с соответсвующим враппером, меняем строку
DAEMON=/usr/local/rvm/gems/ruby-VERSION-VERSION@GEMSET/bin/thin
на
DAEMON=/home/USER/.rvm/bin/bootup_thin
После выполненных действий приложение уже автоматически запускается, но с правами root, чтобы сменить рута на пользователя RVM опять правим /etc/init.d/thin, модифицируя строки запуска/останова/рестарта в таком духе
$DAEMON start --all $CONFIG_PATH
на
su RVMUSER -c "$DAEMON start --all $CONFIG_PATH"
Готовый файл /etc/init.d/thin выглядит так:
DAEMON=/home/rubyworker/.rvm/bin/bootup_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)
        su rubyworker -c "$DAEMON start --all $CONFIG_PATH"
        ;;
  stop)
        su rubyworker -c "$DAEMON stop --all $CONFIG_PATH"
        ;;
  restart)
        su rubyworker -c "$DAEMON restart --all $CONFIG_PATH"
        ;;
  *)
        echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

:
Всё, теперь можно запускать/останавливать/перезапускать thin командой:
$ sudo service thin start|stop|restart