Настройка и деплой Sidekiq 6.0.0 при помощи Capistrano
Сначала думал дополнить предыдущую статью по деплою ассетов, но в итоге решил вынести этот пункт отдельно.
Дело в том, что помимо компиляции ассетов я столкнулся с проблемой деплоя Sidekiq для фоновых задач в с своём рельсовом приложении.
Проблема capistrano/sidekiq
Для капистрано есть гем, который запускает весь процесс из коробки (capistrano/sidekiq), но у него поломана совместимость с sidekiq версии 6. Он работает только для версии 5, а тот пулл-реквест, который фиксит баг до сих пор не принят. Есть отдельный форк этого гема (который вроде как решает проблему), но видимо я слишком туп, чтобы он у меня заработал.
Изучая документацию Sidekiq в части деплоя, я выяснил, что можно воспользоваться системной утилитой управления сервисами: systemd
И для меня это был выход, потому что Redis (который работает в связке с Sidekiq и уже должен быть установлен у вас на сервере) запускается / останавливается / рестартуеся при помощи этой утилиты (и я хочу сказать, что это очень удобно).
Ниже я описал, что нужно сделать, чтобы и на вашем сервере работал Sidekiq тоже.
Настройка systemd
Для начала вам нужно настроить конфиг для работы Sidekiq на вашем сервере.
- Заходим на сервер и создаем файл конфига:
sudo nano /lib/systemd/system/sidekiq.service
Вот ссылка на конфиг: https://gist.github.com/mkhuda/132787f9d54890a183d665eb4560f196
Несмотря на то, что он написан для Ubuntu 16, он прекрасно работает и на Ubuntu 18.04. Но его конечно нужно будет немного поправить.
Помещаем данные конфига в файл sidekiq.service и кое-что редактируем.
- Заменяем эти данные на свои:
User=deploy # Название пользователя, под которым вы заходите на сервер для деплоя
Group=deploy # Дублируем его же
WorkingDirectory=/home/deploy/my_app/current # Сюда вводим путь, где лежит текущая версия вашего приложения
ExecStart=/home/deploy/.rbenv/shims/bundle exec sidekiq -e production # Запускаем sidekiq используя rbenv
-C config/sidekiq.yml # Добавить к последней команде, чтобы подтянуть настройки
- Перезагружаем systemctl, чтобы новые настройки успешно подхватили:
sudo systemctl daemon-reload
- Включаем sidekiq:
sudo systemctl enable sidekiq
- Теперь мы можем его стартовать/останавливать/рестартовать/проверять текущий статус:
sudo systemctl start|stop|restart|status sidekiq
Таск для Capistrano
- В config/deploy нужно добавить следующую таску, которая каждый раз после деплоя будет рестартовать sidekiq:
after :deploy, "deploy:sidekiq_restart"
namespace :deploy do
desc 'Sidekiq restart'
task :sidekiq_restart do
on roles(:app) do
execute :sudo, :systemctl, :restart, :sidekiq
end
end
end
- Чтобы наша таска корректно отработала, нужно дать ей доступ на сервере:
sudo visudo # Находясь на сервере, введите эту команду
%deploy ALL=NOPASSWD:/bin/systemctl restart sidekiq # Введите в самому внизу файла, это команду, сохраните изменения
- Всё. Комитим изменения, пушим в репозиторий и запускаем деплой:
cap production deploy
После чего заходим на сервер и проверяем работоспособность сайдика:
sudo systemctl status sidekiq
Status должен быть «active». Обратите внимание на время, когда был совершен последний запуск:
Active: active (running) since Wed 2020-03-11 19:19:07 UTC; 6s ago
Как видите всё работает. Теперь можете гонять свои фоновые задачи в хвост и в гриву)