Use Monit with Capistrano3 to monitor Puma and Sidekiq

Install and config Monit

On the server side, suppose we use deploy user for deployment, then it is neccessary to add deploy to sudo, no password group because monit requires to be run as root service


# add the following line under %sudo   ALL=(ALL:ALL) ALL

Install monit

sudo apt-get update
sudo apt-get install monit

monit has its own web server and interface, we need to enable it. Open /etc/monit/monitrc as root and uncomment these line

set httpd port 2812 and
    allow admin:monit      # require user 'admin' with password 'monit'

then reload monit with monit reload

You could now access monit web interface via your_server_ip_or_domain:2812.
Friendly reminder: if you using AWS make sure to allow remote access to server port 2812.

Config Monit for Puma

Use capistrano3-puma gem

Notice that we have to use master branch of the gem to be able to use monit plugin successfully as the gem latest version (3.1.0) has issue with monit plugin.

gem 'capistrano3-puma', github: 'seuros/capistrano-puma'

in the Capfile add monit plugin

install_plugin Capistrano::Puma::Monit

This will add following rake tasks to Capistrano

cap puma:monit:config              # Config Puma monit-service
cap puma:monit:monitor             # Monitor Puma monit-service
cap puma:monit:restart             # Restart Puma monit-service
cap puma:monit:start               # Start Puma monit-service
cap puma:monit:stop                # Stop Puma monit-service
cap puma:monit:unmonitor           # Unmonitor Puma monit-service

in config/deploy.rb add the following line:

set :puma_user, fetch(:user)

The first command to run after those config above is to upload monit config to server:

cap production puma:monit:config

Config Monit for Sidekiq

Similar to Puma, monit for Sidekiq is bundled into capistrano-sidekiq gem.

Make sure these 2 lines are in Capfile

require 'capistrano/sidekiq'
require 'capistrano/sidekiq/monit'

The Sidekiq monit module will add following tasks to Capistrano

cap sidekiq:monit:config           # Config Sidekiq monit-service
cap sidekiq:monit:monitor          # Monitor Sidekiq monit-service
cap sidekiq:monit:restart          # Restart Sidekiq monit-service
cap sidekiq:monit:start            # Start Sidekiq monit-service
cap sidekiq:monit:stop             # Stop Sidekiq monit-service
cap sidekiq:monit:unmonitor        # Unmonitor Sidekiq monit-service

And similar to Puma, set this config in config/deploy.rb

set :sidekiq_user, fetch(:user)

Finally upload monit config for Sidekiq to server

cap production sidekiq:monit:config