Sidekiq integration for Capistrano
Add this line to your application's Gemfile:
gem 'capistrano-sidekiq', github: 'seuros/capistrano-sidekiq'
or:
gem 'capistrano-sidekiq', group: :development
And then execute:
$ bundle
# Capfile
require 'capistrano/sidekiq'
require 'capistrano/sidekiq/monit' #to require monit tasks # Only for capistrano3
Configurable options, shown here with defaults:
:sidekiq_default_hooks => true
:sidekiq_pid => File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') # ensure this path exists in production before deploying.
:sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
:sidekiq_log => File.join(shared_path, 'log', 'sidekiq.log')
:sidekiq_options => nil
:sidekiq_require => nil
:sidekiq_tag => nil
:sidekiq_config => nil # if you have a config/sidekiq.yml, do not forget to set this.
:sidekiq_queue => nil
:sidekiq_timeout => 10
:sidekiq_roles => :app
:sidekiq_processes => 1
:sidekiq_options_per_process => nil
:sidekiq_concurrency => nil
# sidekiq monit
:sidekiq_monit_templates_path => 'config/deploy/templates'
:sidekiq_monit_conf_dir => '/etc/monit/conf.d'
:sidekiq_monit_use_sudo => true
:monit_bin => '/usr/bin/monit'
:sidekiq_monit_default_hooks => true
:sidekiq_monit_group => nil
:sidekiq_service_name => "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}" + (index ? "_#{index}" : '')
:sidekiq_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" # Only for capistrano2.5
:sidekiqctl_cmd => "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" # Only for capistrano2.5
:sidekiq_user => nil #user to run sidekiq as
There is a known bug that prevents sidekiq from starting when pty is true on Capistrano 3.
set :pty, false
If you'd like to prepend bundle exec
to your sidekiq and sidekiqctl calls, modify the SSHKit command maps
in your deploy.rb file:
SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
You can configure sidekiq to start with multiple processes. Just set the proper amount in sidekiq_processes
.
You can also customize the configuration for every process. If you want to do that, just set
sidekiq_options_per_process
with an array of the configuration options that you want in string format.
This example should boot the first process with the queue high
and the second one with the queues default
and low
:
set :sidekiq_processes, 2
set :sidekiq_options_per_process, ["--queue high", "--queue default --queue low"]
You can configure how many processes you want to run on each host next way:
set :sidekiq_roles, [:sidekiq_small, :sidekiq_big]
set :sidekiq_small_processes, 1
set :sidekiq_big_processes, 4
server 'example-small.com', roles: [:sidekiq_small]
server 'example-big.com', roles: [:sidekiq_big]
Set init system to systemd in the cap deploy config:
set :init_system, :systemd
Enable lingering for systemd user account
loginctl enable-linger USERACCOUNT
Install systemd.service template file and enable the service with:
bundle exec cap sidekiq:install
Default name for the service file is sidekiq-stage.service
. This can be changed as needed, for example:
set :service_unit_name, "sidekiq-#{fetch(:application)}-#{fetch(:stage)}.service"
Set init system to upstart in the cap deploy config:
set :init_system, :upstart
Set upstart service name:
set :upstart_service_name, 'sidekiq'
If you need change some config in redactor, you can
bundle exec rails generate capistrano:sidekiq:monit:template
If your deploy user has no need in sudo
for using monit, you can disable it as follows:
set :sidekiq_monit_use_sudo, false
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request