Запуск Node.JS приложений при старте сервера

HELP-ME-24.COM (Freelance Team), Черноусов Антон
На этапе разработки, Node.JS приложение обычно запускается вручную, а сегодня мы рассмотрим как решить проблему автоматического запуска приложения при старте сервера.

Обычно для запуска такого типа приложений используется команда:

# npm run start

В файле package.json прописаны команды запуска для различных вариантов старта и моем случае имеются типы запуска:

"start": "node index.js | ./node_modules/.bin/bunyan -o short",
"dev": "nodemon index.js | ./node_modules/.bin/bunyan -o short",
"data": "node index.js data"

Нам необходимо автоматизировать тип запуска start, аналогично представленной выше команды. Вообще, ручной запуск допустим исключительно на этапе разработки, а на этапе внедрения  или тестирования перед внедрением на площадку заказчика необходимо автоматически запускать приложение при старте сервера и тестировать его запуск от имени непривилегированного пользователя (вообще, по нормальному, все приложения тестируются от имени пользователя, но я видел и ряд исключений).

Для автоматического запуска специализированных WEB-приложений таких как Django и Node.JS существует несколько подходов и сегодня мы рассмотрим один из наиболее распространенных с использованием демона Supervisor.

Для установки пакета приложения в Ubuntu Linux используется команда:

# aptitude install supervisor

Supervisor - это система для контроля состояния процессов и основным ее назначением является запускать заданные конфигурацией процессы и отслеживать их состояние. Каждое запускаемое приложение (не обязательно web-приложение) описывается или в центральном конфигурационном файле /etc/supervisor/supervisord.conf или в виде отдельных файлов с расширением .conf в каталоге /etc/supervisor/conf.d/, причем второй способ предпочтительнее.

Мы рассмотрим в качестве примера конфигурационный файл для запуска Node.JS-приложения от имени пользователя user в его домашнем каталоге.

Файл расположен в файле /etc/supervisor/conf.d/tracking-server.conf и содержит следующие записи:

command=node /home/user/tracking-server/index.js | /home/user/tracking-server/node_modules/.bin/bunyan -o short
autostart=true
autorestart=true
environment=
stderr_logfile=/var/log/tracking-server.err.log
stdout_logfile=/var/log/tracking-server.out.log
user=user

Параметр command содержит команду запуска из файла package.json, а остальные параметры понятны из без особых объяснений:

  • command - команда запуска
  • autostart - активируем автозапуск
  • autorestart - автоматический перезапуск при "падении" приложения
  • environment - параметры переменных окружения (если используются, например NODE_ENV=production)
  • stderr_logfile - файл вывода лога ошибок
  • stdout_logfile - основной файл вывода консольных сообщений
  • user - пользователь от имени которого приложение запускается

Для управления демоном supervisor используется команда supervisorctl и у нее очень много параметров (о которых вы можете почитать в инструкции), а нас сейчас интересует как перезапустить одно приложение.

Для перезапуска описанного в конфигурационном файле приложения используется команда:

# supervisorctl restart tracking-server

Команда не может быть выполнена от имени непривелигированного пользователя и вам придется добавить исключение в правила sudo для запуска этой команды пользователем user.

Для добавления резрешения пользователю на выполнение одной команды sudo с строго определенными параметрами без ввода пароля используется следующая запись в файле /etc/sudoers:

user ALL=(root) NOPASSWD:/usr/bin/supervisorctl restart tracking-server

Обратите внимание, что путь к supervisorctl указывается полностью и так же полностью указываются разрешенные аргументы. Теперь вы можете строить скрипты автоматизации любой сложности не предоставляя разработчиками полноценного root или sudo доступа к серверу.

Собственно на этом все, ваше приложение работает и в случае сбоя будет перезапускаться.

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий