Настройка автоматического запуска 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
Если статус показывает, что всё хорошо, можно проверять ваше приложение. Например, перезапустить сервер и проверить, что оно запускается корректно.