29 Дек

Настройка автоматического запуска puma при перезагрузке сервера

Для своих Rails-приложений я в последнее время использую связку puma+nginx. И достаточно продолжительное время я ленился настроить функционал автоматического старта приложений при ребуте сервера. Ну, типа, раз в месяц если он перезапустится, то и фиг с ним, вручную стартану. Благо, что особо критичных к простою проектов у меня нет (на самом деле есть, но там очень быстро мне сообщают о проблеме и я её очень быстро решал). Но надо что-то менять и я решил, что пришло то самое время.

Итак, перейдем к делу.
Для начала примем некоторые вещи в качестве дефолтных:

  • Используется ОС Debian выше 8 версии (как раз в последних версиях произошел переход на systemd)
  • Все окружение для запуска Rails-приложения, а также связка puma+nginx к этому моменту уже настроена (например, по вот этой инструкции).

Для начала, в каталоге с нашим приложением запустим команду:

bundle binstubs puma --path ./sbin

Эта команда сгенерирует нам исполняемые файлы для запуска пумы в каталоге sbin в папке приложения.

Далее создаем файл /etc/systemd/system/puma.service со следующим содержимым:

[Unit] 
# Описание службы
Description=Puma HTTP Server 
# После чего ее запускать
After=network.target 

[Service] 
# Тип запуска 
Type=simple 
# Пользователь, от имени которого запускать службу 
User=<username>
# Путь к приложению, которое будет запускать puma
WorkingDirectory=<path_to_your_rails_app>  
# Переменные окружения. Их можно посмотреть, запустив команду env
Environment=PATH=<переменная PATH вашего пользователя> 
Environment=GEM_PATH=<переменная для гемов>  
# если secret_key_base для Rails-приложения задается из переменной окружения, то ее обязательно нужно указать здесь
Environment=SECRET_KEY_BASE=<переменная secret_key>  
# Команда для запуска приложения (именно для нее мы генерировали исполняемые файлы для пумы)
ExecStart=/<path_to_your_rails_app>/sbin/puma -e production -C ./config/puma.rb
# Перезапускать службу, если она вдруг завершится 
Restart=always 

[Install] 
# Не совсем понял, для чего этот параметр, но он наверняка очень нужен
WantedBy=multi-user.target 

Подробнее про параметры можно посмотреть вот здесь, а также в мане systemd.service.

После того, как мы создали файл, внесли в него свои параметры и сохранили его, выполняем следующие команды:

# эту команду нужно выполнять каждый раз, когда вносятся изменения в файл puma.service
sudo systemctl daemon-reload

# включаем нашу службу
sudo systemctl enable puma.service

# запускаем службу
sudo systemctl start puma.service

# проверяем статус
sudo systemctl status puma.service

Если статус показывает, что всё хорошо, можно проверять ваше приложение. Например, перезапустить сервер и проверить, что оно запускается корректно.