holamendi
8/23/2013 - 3:38 PM

Sidekiq + Capistrano + Ubuntu Upstart

Sidekiq + Capistrano + Ubuntu Upstart

# config/upstart/sidekiq.conf.erb

# /etc/init/sidekiq.conf - Sidekiq config for Ubuntu's Upstart

description "Sidekiq Background Workers"

start on runlevel [2345]
stop on runlevel [06]

respawn
respawn limit 3 30

exec su - <%= user %> -c 'cd <%= current_path %> && exec bundle exec sidekiq -i 0 -e <%= rails_env %> -C <%= current_path %>/config/sidekiq.yml'
# config/deploy.rb

namespace :upstart do
  desc 'Generate and upload Upstard configs for daemons needed by the app'
  task :update_configs, except: {no_release: true} do
    upstart_config_files = File.expand_path('../upstart/*.conf.erb', __FILE__)
    upstart_root         = '/etc/init'

    Dir[upstart_config_files].each do |upstart_config_file|
      config = ERB.new(IO.read(upstart_config_file)).result(binding)
      path   = "#{upstart_root}/#{File.basename upstart_config_file, '.erb'}"

      put config, path
    end
  end
end

after 'deploy:update_code', 'upstart:update_configs'

# Add this to your /etc/sudoers file in order to allow the user
# www-data to control the Sidekiq worker daemon via Upstart:
#
#   www-data ALL = (root) NOPASSWD: /sbin/start sidekiq, /sbin/stop sidekiq, /sbin/status sidekiq
namespace :sidekiq do
  desc 'Start the sidekiq workers via Upstart'
  task :start do
    sudo 'start sidekiq'
  end

  desc 'Stop the sidekiq workers via Upstart'
  task :stop do
    sudo 'stop sidekiq || true'
  end

  desc 'Restart the sidekiq workers via Upstart'
  task :restart do
    sudo 'stop sidekiq || true'
    sudo 'start sidekiq'
  end

  desc "Quiet sidekiq (stop accepting new work)"
  task :quiet do
    pid_file       = "#{current_path}/tmp/pids/sidekiq.pid"
    sidekiqctl_cmd = "bundle exec sidekiqctl"
    run "if [ -d #{current_path} ] && [ -f #{pid_file} ] && kill -0 `cat #{pid_file}`> /dev/null 2>&1; then cd #{current_path} && #{sidekiqctl_cmd} quiet #{pid_file} ; else echo 'Sidekiq is not running'; fi"
  end
end

before 'deploy:update_code', 'sidekiq:quiet'
after  'deploy:stop',        'sidekiq:stop'
after  'deploy:start',       'sidekiq:start'
before 'deploy:restart',     'sidekiq:restart'