Задача
Необходимо настроить автозапуск 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