Автозапуск 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

Вышеприведённые команды выполняют следующее:

  • создаёт /etc/thin и /etc/init.d/thin;
  • устанавливает дефолтные ссылки сценариев инициализации;
  • устанавливает настройки thin для приложения (в данном случае — production, N серверов) в файл /etc/thin/APPNAME.yml;
  • создаёт враппер для запуска 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 командой:

service thin start|stop|restart