capistrano-sidekiq 2.3.1 → 3.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +6 -57
- data/lib/capistrano/sidekiq/systemd.rb +36 -9
- data/lib/capistrano/sidekiq/version.rb +1 -1
- data/lib/capistrano/sidekiq.rb +52 -4
- data/lib/capistrano/tasks/systemd.rake +72 -223
- data/lib/capistrano/templates/sidekiq.service.capistrano.erb +45 -0
- metadata +11 -18
- data/.gitignore +0 -19
- data/.tool-versions +0 -1
- data/Gemfile +0 -8
- data/Rakefile +0 -9
- data/capistrano-sidekiq.gemspec +0 -22
- data/lib/capistrano/sidekiq/helpers.rb +0 -53
- data/lib/capistrano/sidekiq/monit.rb +0 -21
- data/lib/capistrano/tasks/monit.rake +0 -127
- data/lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d2fab3d52e0ca2c2fdb94e71d21d87e543a3f605f4f822b4c8bf2794c5f8144
|
4
|
+
data.tar.gz: 2ede4bc9269188112bef354fc06e2fa7ddb6f1f8de1db57a3dc2cf24da10095f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6651700dda4403c8b3e23d2da8f2d7c685c8ae36311cfdea998a1e731de7b87279ad0a354ba9d9da537f10c6735a2e8277f24f04e4a6748d9f70ce63617232c
|
7
|
+
data.tar.gz: adacca94a04e2a3ae569e4e94152b1b0a75c345a182aa7595776d75f3c7df789942539ea280a1545361b4610e4ba8e8cb23d72962ab1482a8a2ae26f2a3568e0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [Unreleased](https://github.com/seuros/capistrano-sidekiq/compare/v2.3.0...master)
|
4
|
+
- Rewrite to match capistrano3-puma api
|
5
|
+
- Add support for multiple sidekiq configs (processes and queues can be configured with erb)
|
6
|
+
- Add support to multiple EnvironmentFile
|
7
|
+
- Add support to multiple EnvironmentVariables
|
8
|
+
- Default role for sidekiq is now :worker instead of :app
|
9
|
+
|
3
10
|
## [2.3.0](https://github.com/seuros/capistrano-sidekiq/tree/2.3.0) (2022-05-17)
|
4
11
|
|
5
12
|
[Full Changelog](https://github.com/seuros/capistrano-sidekiq/compare/v2.2.0...2.3.0)
|
data/README.md
CHANGED
@@ -16,78 +16,27 @@ And then execute:
|
|
16
16
|
## Usage
|
17
17
|
```ruby
|
18
18
|
# Capfile
|
19
|
-
|
20
19
|
require 'capistrano/sidekiq'
|
21
20
|
install_plugin Capistrano::Sidekiq # Default sidekiq tasks
|
22
21
|
# Then select your service manager
|
23
22
|
install_plugin Capistrano::Sidekiq::Systemd
|
24
|
-
# or
|
25
|
-
install_plugin Capistrano::Sidekiq::Monit # tests needed
|
26
23
|
```
|
27
24
|
|
28
|
-
|
29
25
|
Configurable options - Please ensure you check your version's branch for the available settings - shown here with defaults:
|
30
26
|
|
31
27
|
```ruby
|
32
|
-
:sidekiq_roles => :
|
28
|
+
:sidekiq_roles => :worker
|
33
29
|
:sidekiq_default_hooks => true
|
34
|
-
:sidekiq_pid => File.join(shared_path, 'tmp', 'pids', 'sidekiq.pid') # ensure this path exists in production before deploying.
|
35
30
|
:sidekiq_env => fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
|
36
|
-
:sidekiq_log => File.join(shared_path, 'log', 'sidekiq.log')
|
37
31
|
# single config
|
38
|
-
:
|
39
|
-
#
|
40
|
-
:
|
41
|
-
'config/sidekiq_config1.yml',
|
42
|
-
'config/sidekiq_config2.yml'
|
43
|
-
]
|
44
|
-
:sidekiq_concurrency => 25
|
45
|
-
:sidekiq_queue => %w(default high low)
|
46
|
-
:sidekiq_processes => 1 # number of systemd processes you want to start
|
47
|
-
|
48
|
-
# sidekiq systemd options
|
49
|
-
:sidekiq_service_templates_path => 'config/deploy/templates' # to be used if a custom template is needed (filaname should be #{fetch(:sidekiq_service_unit_name)}.service.capistrano.erb or sidekiq.service.capistrano.erb
|
50
|
-
:sidekiq_service_unit_name => 'sidekiq'
|
51
|
-
:sidekiq_service_unit_user => :user # :system
|
52
|
-
:sidekiq_enable_lingering => true
|
53
|
-
:sidekiq_lingering_user => nil
|
54
|
-
|
55
|
-
# sidekiq monit
|
56
|
-
:sidekiq_monit_templates_path => 'config/deploy/templates'
|
57
|
-
:sidekiq_monit_conf_dir => '/etc/monit/conf.d'
|
58
|
-
:sidekiq_monit_use_sudo => true
|
59
|
-
:monit_bin => '/usr/bin/monit'
|
60
|
-
:sidekiq_monit_default_hooks => true
|
61
|
-
:sidekiq_monit_group => nil
|
62
|
-
:sidekiq_service_name => "sidekiq_#{fetch(:application)}"
|
63
|
-
|
64
|
-
:sidekiq_user => nil #user to run sidekiq as
|
65
|
-
```
|
66
|
-
See `capistrano/sidekiq/helpers.rb` for other undocumented configuration settings.
|
67
|
-
|
68
|
-
## Bundler
|
69
|
-
|
70
|
-
If you'd like to prepend `bundle exec` to your sidekiq and sidekiqctl calls, modify the SSHKit command maps
|
71
|
-
in your deploy.rb file:
|
72
|
-
```ruby
|
73
|
-
SSHKit.config.command_map[:sidekiq] = "bundle exec sidekiq"
|
74
|
-
SSHKit.config.command_map[:sidekiqctl] = "bundle exec sidekiqctl"
|
75
|
-
```
|
76
|
-
|
77
|
-
|
78
|
-
## Customizing the monit sidekiq templates
|
79
|
-
|
80
|
-
If you need change some config in redactor, you can
|
81
|
-
|
82
|
-
```
|
83
|
-
bundle exec rails generate capistrano:sidekiq:monit:template
|
32
|
+
:sidekiq_config_files, ['sidekiq.yml']
|
33
|
+
# multiple configs
|
34
|
+
:sidekiq_config_files, ['sidekiq.yml', 'sidekiq-2.yml'] # you can also set it per server
|
84
35
|
```
|
85
36
|
|
86
|
-
|
37
|
+
## Example
|
87
38
|
|
88
|
-
|
89
|
-
set :sidekiq_monit_use_sudo, false
|
90
|
-
```
|
39
|
+
A sample application is provided to show how to use this gem at https://github.com/seuros/capistrano-example-app
|
91
40
|
|
92
41
|
## Configuring the log files on systems with less recent Systemd versions
|
93
42
|
|
@@ -2,18 +2,45 @@
|
|
2
2
|
|
3
3
|
module Capistrano
|
4
4
|
class Sidekiq::Systemd < Capistrano::Plugin
|
5
|
-
include
|
6
|
-
|
5
|
+
include SidekiqCommon
|
6
|
+
def define_tasks
|
7
|
+
eval_rakefile File.expand_path('../tasks/systemd.rake', __dir__)
|
8
|
+
end
|
7
9
|
def set_defaults
|
8
|
-
set_if_empty :
|
9
|
-
set_if_empty :
|
10
|
-
set_if_empty :
|
11
|
-
|
12
|
-
set_if_empty :
|
10
|
+
set_if_empty :systemctl_bin, '/bin/systemctl'
|
11
|
+
set_if_empty :service_unit_user, :user
|
12
|
+
set_if_empty :systemctl_user, fetch(:service_unit_user, :user) == :user
|
13
|
+
|
14
|
+
set_if_empty :sidekiq_service_unit_name, -> { "#{fetch(:application)}_sidekiq_#{fetch(:stage)}" }
|
15
|
+
set_if_empty :sidekiq_lingering_user, -> { fetch(:lingering_user, fetch(:user)) }
|
16
|
+
|
17
|
+
## Sidekiq could have a stripped down or more complex version of the environment variables
|
18
|
+
set_if_empty :sidekiq_service_unit_env_files, -> { fetch(:service_unit_env_files, []) }
|
19
|
+
set_if_empty :sidekiq_service_unit_env_vars, -> { fetch(:service_unit_env_vars, []) }
|
20
|
+
|
21
|
+
set_if_empty :sidekiq_service_templates_path, fetch(:service_templates_path, 'config/deploy/templates')
|
13
22
|
end
|
14
23
|
|
15
|
-
def
|
16
|
-
|
24
|
+
def systemd_command(*args)
|
25
|
+
command = [fetch(:systemctl_bin)]
|
26
|
+
|
27
|
+
unless fetch(:service_unit_user) == :system
|
28
|
+
command << "--user"
|
29
|
+
end
|
30
|
+
|
31
|
+
command + args
|
32
|
+
end
|
33
|
+
|
34
|
+
def sudo_if_needed(*command)
|
35
|
+
if fetch(:service_unit_user) == :system
|
36
|
+
backend.sudo command.map(&:to_s).join(" ")
|
37
|
+
else
|
38
|
+
backend.execute(*command)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_systemd(*args)
|
43
|
+
sudo_if_needed(*systemd_command(*args))
|
17
44
|
end
|
18
45
|
end
|
19
46
|
end
|
data/lib/capistrano/sidekiq.rb
CHANGED
@@ -4,6 +4,51 @@ require 'capistrano/bundler'
|
|
4
4
|
require 'capistrano/plugin'
|
5
5
|
|
6
6
|
module Capistrano
|
7
|
+
module SidekiqCommon
|
8
|
+
def compiled_template(config_file = "sidekiq.yml")
|
9
|
+
@config_file = config_file
|
10
|
+
local_template_directory = fetch(:sidekiq_service_templates_path)
|
11
|
+
search_paths = [
|
12
|
+
File.join(local_template_directory, 'sidekiq.service.capistrano.erb'),
|
13
|
+
File.expand_path(
|
14
|
+
File.join(*%w[.. templates sidekiq.service.capistrano.erb]),
|
15
|
+
__FILE__
|
16
|
+
)
|
17
|
+
]
|
18
|
+
template_path = search_paths.detect { |path| File.file?(path) }
|
19
|
+
template = File.read(template_path)
|
20
|
+
ERB.new(template, trim_mode: '-').result(binding)
|
21
|
+
end
|
22
|
+
|
23
|
+
def expanded_bundle_path
|
24
|
+
backend.capture(:echo, SSHKit.config.command_map[:bundle]).strip
|
25
|
+
end
|
26
|
+
|
27
|
+
def sidekiq_config
|
28
|
+
"--config config/#{@config_file}" if @config_file != "sidekiq.yml"
|
29
|
+
end
|
30
|
+
|
31
|
+
def switch_user(role, &block)
|
32
|
+
su_user = sidekiq_user(role)
|
33
|
+
if su_user == role.user
|
34
|
+
yield
|
35
|
+
else
|
36
|
+
as su_user, &block
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def sidekiq_user(role = nil)
|
41
|
+
if role.nil?
|
42
|
+
fetch(:sidekiq_user)
|
43
|
+
else
|
44
|
+
properties = role.properties
|
45
|
+
properties.fetch(:sidekiq_user) || # local property for sidekiq only
|
46
|
+
fetch(:sidekiq_user) ||
|
47
|
+
properties.fetch(:run_as) || # global property across multiple capistrano gems
|
48
|
+
role.user
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
7
52
|
class Sidekiq < Capistrano::Plugin
|
8
53
|
def define_tasks
|
9
54
|
eval_rakefile File.expand_path('tasks/sidekiq.rake', __dir__)
|
@@ -13,9 +58,14 @@ module Capistrano
|
|
13
58
|
set_if_empty :sidekiq_default_hooks, true
|
14
59
|
|
15
60
|
set_if_empty :sidekiq_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:rake_env, fetch(:stage)))) }
|
16
|
-
set_if_empty :sidekiq_roles, fetch(:sidekiq_role, :
|
61
|
+
set_if_empty :sidekiq_roles, fetch(:sidekiq_role, :worker)
|
62
|
+
set_if_empty :sidekiq_configs, %w[sidekiq] # sidekiq.yml
|
63
|
+
|
17
64
|
set_if_empty :sidekiq_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
|
18
|
-
set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.
|
65
|
+
set_if_empty :sidekiq_error_log, -> { File.join(shared_path, 'log', 'sidekiq.log') }
|
66
|
+
|
67
|
+
set_if_empty :sidekiq_config_files, ['sidekiq.yml']
|
68
|
+
|
19
69
|
# Rbenv, Chruby, and RVM integration
|
20
70
|
append :rbenv_map_bins, 'sidekiq', 'sidekiqctl'
|
21
71
|
append :rvm_map_bins, 'sidekiq', 'sidekiqctl'
|
@@ -26,6 +76,4 @@ module Capistrano
|
|
26
76
|
end
|
27
77
|
end
|
28
78
|
|
29
|
-
require_relative 'sidekiq/helpers'
|
30
79
|
require_relative 'sidekiq/systemd'
|
31
|
-
require_relative 'sidekiq/monit'
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
git_plugin = self
|
@@ -7,59 +6,17 @@ namespace :sidekiq do
|
|
7
6
|
standard_actions = {
|
8
7
|
start: 'Start Sidekiq',
|
9
8
|
stop: 'Stop Sidekiq (graceful shutdown within timeout, put unfinished tasks back to Redis)',
|
10
|
-
status: 'Get Sidekiq Status'
|
9
|
+
status: 'Get Sidekiq Status',
|
10
|
+
restart: 'Restart Sidekiq'
|
11
11
|
}
|
12
12
|
standard_actions.each do |command, description|
|
13
13
|
desc description
|
14
14
|
task command do
|
15
15
|
on roles fetch(:sidekiq_roles) do |role|
|
16
16
|
git_plugin.switch_user(role) do
|
17
|
-
git_plugin.
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
desc 'Restart Sidekiq (Quiet, Wait till workers finish or 30 seconds, Stop, Start)'
|
24
|
-
task :restart do
|
25
|
-
on roles fetch(:sidekiq_roles) do |role|
|
26
|
-
git_plugin.switch_user(role) do
|
27
|
-
git_plugin.quiet_sidekiq
|
28
|
-
git_plugin.process_block do |process|
|
29
|
-
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
30
|
-
running = nil
|
31
|
-
|
32
|
-
# get running workers
|
33
|
-
while (running.nil? || running > 0) && git_plugin.duration(start_time) < 30 do
|
34
|
-
command_args =
|
35
|
-
if fetch(:sidekiq_service_unit_user) == :system
|
36
|
-
[:sudo, 'systemd-cgls']
|
37
|
-
else
|
38
|
-
['systemd-cgls', '--user']
|
39
|
-
end
|
40
|
-
# need to pipe through tr -cd... to strip out systemd colors or you
|
41
|
-
# get log error messages for non UTF-8 characters.
|
42
|
-
command_args.push(
|
43
|
-
'-u', "#{git_plugin.sidekiq_service_unit_name(process: process)}.service",
|
44
|
-
'|', 'tr -cd \'\11\12\15\40-\176\''
|
45
|
-
)
|
46
|
-
status = capture(*command_args, raise_on_non_zero_exit: false)
|
47
|
-
status_match = status.match(/\[(?<running>\d+) of (?<total>\d+) busy\]/)
|
48
|
-
break unless status_match
|
49
|
-
|
50
|
-
running = status_match[:running]&.to_i
|
51
|
-
|
52
|
-
colors = SSHKit::Color.new($stdout)
|
53
|
-
if running.zero?
|
54
|
-
info colors.colorize("✔ Process ##{process}: No running workers. Shutting down for restart!", :green)
|
55
|
-
else
|
56
|
-
info colors.colorize("⧗ Process ##{process}: Waiting for #{running} workers.", :yellow)
|
57
|
-
sleep(1)
|
58
|
-
end
|
17
|
+
git_plugin.config_files(role).each do |config_file|
|
18
|
+
git_plugin.execute_systemd(command, git_plugin.sidekiq_service_file_name(config_file))
|
59
19
|
end
|
60
|
-
|
61
|
-
git_plugin.systemctl_command(:stop, process: process)
|
62
|
-
git_plugin.systemctl_command(:start, process: process)
|
63
20
|
end
|
64
21
|
end
|
65
22
|
end
|
@@ -69,229 +26,121 @@ namespace :sidekiq do
|
|
69
26
|
task :quiet do
|
70
27
|
on roles fetch(:sidekiq_roles) do |role|
|
71
28
|
git_plugin.switch_user(role) do
|
72
|
-
git_plugin.quiet_sidekiq
|
29
|
+
git_plugin.quiet_sidekiq(role)
|
73
30
|
end
|
74
31
|
end
|
75
32
|
end
|
76
33
|
|
77
|
-
desc 'Install systemd
|
34
|
+
desc 'Install Sidekiq systemd service'
|
78
35
|
task :install do
|
79
36
|
on roles fetch(:sidekiq_roles) do |role|
|
80
37
|
git_plugin.switch_user(role) do
|
81
|
-
git_plugin.create_systemd_template
|
82
|
-
if git_plugin.config_per_process?
|
83
|
-
git_plugin.process_block do |process|
|
84
|
-
git_plugin.create_systemd_config_symlink(process)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
git_plugin.systemctl_command(:enable)
|
88
|
-
|
89
|
-
if fetch(:sidekiq_service_unit_user) != :system && fetch(:sidekiq_enable_lingering)
|
90
|
-
execute :loginctl, 'enable-linger', fetch(:sidekiq_lingering_user)
|
91
|
-
end
|
38
|
+
git_plugin.create_systemd_template(role)
|
92
39
|
end
|
93
40
|
end
|
41
|
+
invoke 'sidekiq:enable'
|
94
42
|
end
|
95
43
|
|
96
|
-
desc 'Uninstall systemd
|
44
|
+
desc 'Uninstall Sidekiq systemd service'
|
97
45
|
task :uninstall do
|
46
|
+
invoke 'sidekiq:disable'
|
98
47
|
on roles fetch(:sidekiq_roles) do |role|
|
99
48
|
git_plugin.switch_user(role) do
|
100
|
-
git_plugin.
|
101
|
-
git_plugin.systemctl_command(:disable)
|
102
|
-
if git_plugin.config_per_process?
|
103
|
-
git_plugin.process_block do |process|
|
104
|
-
git_plugin.delete_systemd_config_symlink(process)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
execute :sudo, :rm, '-f', File.join(
|
108
|
-
fetch(:service_unit_path, git_plugin.fetch_systemd_unit_path),
|
109
|
-
git_plugin.sidekiq_service_file_name
|
110
|
-
)
|
49
|
+
git_plugin.rm_systemd_service(role)
|
111
50
|
end
|
112
51
|
end
|
113
52
|
end
|
114
53
|
|
115
|
-
desc '
|
116
|
-
task :
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
54
|
+
desc 'Enable Sidekiq systemd service'
|
55
|
+
task :enable do
|
56
|
+
on roles(fetch(:sidekiq_roles)) do |role|
|
57
|
+
git_plugin.config_files(role).each do |config_file|
|
58
|
+
git_plugin.execute_systemd("enable", git_plugin.sidekiq_service_file_name(config_file))
|
59
|
+
end
|
121
60
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
'/etc/systemd/system/'
|
126
|
-
else
|
127
|
-
home_dir = backend.capture :pwd
|
128
|
-
File.join(home_dir, '.config', 'systemd', 'user')
|
61
|
+
if fetch(:systemctl_user) && fetch(:sidekiq_lingering_user)
|
62
|
+
execute :loginctl, "enable-linger", fetch(:puma_lingering_user)
|
63
|
+
end
|
129
64
|
end
|
130
65
|
end
|
131
66
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
__FILE__
|
140
|
-
)
|
141
|
-
]
|
142
|
-
template_path = search_paths.detect { |path| File.file?(path) }
|
143
|
-
template = File.read(template_path)
|
144
|
-
ERB.new(template).result(binding)
|
67
|
+
desc 'Disable Sidekiq systemd service'
|
68
|
+
task :disable do
|
69
|
+
on roles(fetch(:sidekiq_roles)) do |role|
|
70
|
+
git_plugin.config_files(role).each do |config_file|
|
71
|
+
git_plugin.execute_systemd("disable", git_plugin.sidekiq_service_file_name(config_file))
|
72
|
+
end
|
73
|
+
end
|
145
74
|
end
|
146
75
|
|
147
|
-
def
|
148
|
-
|
149
|
-
|
150
|
-
backend.execute :mkdir, '-p', systemd_path if fetch(:sidekiq_service_unit_user) == :user
|
151
|
-
|
152
|
-
if sidekiq_processes > 1
|
153
|
-
range = 1..sidekiq_processes
|
76
|
+
def fetch_systemd_unit_path
|
77
|
+
if fetch(:puma_systemctl_user) == :system
|
78
|
+
"/etc/systemd/system/"
|
154
79
|
else
|
155
|
-
|
156
|
-
|
157
|
-
range.each do |index|
|
158
|
-
temp_file_name = File.join('/tmp', sidekiq_service_file_name(index))
|
159
|
-
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(index))
|
160
|
-
backend.upload!(StringIO.new(ctemplate), temp_file_name)
|
161
|
-
|
162
|
-
if fetch(:sidekiq_service_unit_user) == :system
|
163
|
-
backend.execute :sudo, :mv, temp_file_name, systemd_file_name
|
164
|
-
backend.execute :sudo, :systemctl, 'daemon-reload'
|
165
|
-
else
|
166
|
-
backend.execute :mv, temp_file_name, systemd_file_name
|
167
|
-
backend.execute :systemctl, '--user', 'daemon-reload'
|
168
|
-
end
|
80
|
+
home_dir = backend.capture :pwd
|
81
|
+
File.join(home_dir, ".config", "systemd", "user")
|
169
82
|
end
|
170
83
|
end
|
171
84
|
|
172
|
-
def
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
85
|
+
def create_systemd_template(role)
|
86
|
+
systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
|
87
|
+
backend.execute :mkdir, '-p', systemd_path if fetch(:systemctl_user)
|
88
|
+
|
89
|
+
config_files(role).each do |config_file|
|
90
|
+
ctemplate = compiled_template(config_file)
|
91
|
+
temp_file_name = File.join('/tmp', "sidekiq.#{config_file}.service")
|
92
|
+
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
|
93
|
+
backend.upload!(StringIO.new(ctemplate), temp_file_name)
|
94
|
+
if fetch(:systemctl_user)
|
95
|
+
warn "Moving #{temp_file_name} to #{systemd_file_name}"
|
96
|
+
backend.execute :mv, temp_file_name, systemd_file_name
|
97
|
+
else
|
98
|
+
warn "Installing #{systemd_file_name} as root"
|
99
|
+
backend.execute :sudo, :mv, temp_file_name, systemd_file_name
|
100
|
+
end
|
183
101
|
end
|
184
|
-
|
185
|
-
base_path = fetch(:deploy_to)
|
186
|
-
config_link_base_path = File.join(base_path, 'shared', 'sidekiq_systemd')
|
187
|
-
config_link_path = File.join(
|
188
|
-
config_link_base_path, sidekiq_systemd_config_name(process)
|
189
|
-
)
|
190
|
-
process_config_path = File.join(base_path, 'current', process_config)
|
191
|
-
|
192
|
-
backend.execute :mkdir, '-p', config_link_base_path
|
193
|
-
backend.execute :ln, '-sf', process_config_path, config_link_path
|
194
102
|
end
|
195
103
|
|
196
|
-
def
|
197
|
-
|
198
|
-
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
199
|
-
sidekiq_systemd_config_name(process)
|
200
|
-
)
|
201
|
-
backend.execute :rm, config_link_path, raise_on_non_zero_exit: false
|
202
|
-
end
|
104
|
+
def rm_systemd_service(role)
|
105
|
+
systemd_path = fetch(:service_unit_path, fetch_systemd_unit_path)
|
203
106
|
|
204
|
-
|
205
|
-
|
206
|
-
if fetch(:
|
207
|
-
|
107
|
+
config_files(role).each do |config_file|
|
108
|
+
systemd_file_name = File.join(systemd_path, sidekiq_service_file_name(config_file))
|
109
|
+
if fetch(:systemctl_user)
|
110
|
+
warn "Deleting #{systemd_file_name}"
|
111
|
+
backend.execute :rm, "-f", systemd_file_name
|
208
112
|
else
|
209
|
-
|
113
|
+
warn "Deleting #{systemd_file_name} as root"
|
114
|
+
backend.execute :sudo, :rm, "-f", systemd_file_name
|
210
115
|
end
|
211
|
-
if process && sidekiq_processes > 1
|
212
|
-
execute_array.push(
|
213
|
-
*args, sidekiq_service_unit_name(process: process)
|
214
|
-
).flatten
|
215
|
-
else
|
216
|
-
execute_array.push(*args, sidekiq_service_unit_name).flatten
|
217
116
|
end
|
218
|
-
backend.execute(*execute_array, raise_on_non_zero_exit: false)
|
219
|
-
end
|
220
|
-
|
221
|
-
def quiet_sidekiq
|
222
|
-
systemctl_command(:kill, '-s', :TSTP)
|
223
117
|
end
|
224
118
|
|
225
|
-
def
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
backend.as su_user, &block
|
119
|
+
def quiet_sidekiq(role)
|
120
|
+
config_files(role).each do |config_file|
|
121
|
+
sidekiq_service = sidekiq_service_unit_name(config_file)
|
122
|
+
warn "Quieting #{sidekiq_service}"
|
123
|
+
execute_systemd("kill -s TSTP", sidekiq_service)
|
231
124
|
end
|
232
125
|
end
|
233
126
|
|
234
|
-
def
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
def sidekiq_config
|
239
|
-
config = fetch(:sidekiq_config)
|
240
|
-
return unless config
|
241
|
-
|
242
|
-
if config_per_process?
|
243
|
-
config = File.join(
|
244
|
-
fetch(:deploy_to), 'shared', 'sidekiq_systemd',
|
245
|
-
sidekiq_systemd_config_name
|
246
|
-
)
|
247
|
-
end
|
248
|
-
"--config #{config}"
|
249
|
-
end
|
250
|
-
|
251
|
-
def sidekiq_concurrency
|
252
|
-
"--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
|
253
|
-
end
|
254
|
-
|
255
|
-
def sidekiq_processes
|
256
|
-
fetch(:sidekiq_processes, 1)
|
257
|
-
end
|
258
|
-
|
259
|
-
def sidekiq_queues
|
260
|
-
Array(fetch(:sidekiq_queue)).map do |queue|
|
261
|
-
"--queue #{queue}"
|
262
|
-
end.join(' ')
|
263
|
-
end
|
264
|
-
|
265
|
-
def sidekiq_service_file_name(index = nil)
|
266
|
-
return "#{fetch(:sidekiq_service_unit_name)}.service" if index.to_i.zero?
|
267
|
-
"#{fetch(:sidekiq_service_unit_name)}@#{index}.service"
|
268
|
-
end
|
269
|
-
|
270
|
-
def sidekiq_service_unit_name(process: nil)
|
271
|
-
if process && sidekiq_processes > 1
|
272
|
-
"#{fetch(:sidekiq_service_unit_name)}@#{process}"
|
127
|
+
def sidekiq_service_unit_name(config_file)
|
128
|
+
if config_file != "sidekiq.yml"
|
129
|
+
fetch(:sidekiq_service_unit_name) + "." + config_file.split(".")[0..-2].join(".")
|
273
130
|
else
|
274
131
|
fetch(:sidekiq_service_unit_name)
|
275
132
|
end
|
276
133
|
end
|
277
134
|
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
"sidekiq_systemd_#{(process&.to_s || '%i')}.yaml"
|
282
|
-
end
|
135
|
+
def sidekiq_service_file_name(config_file)
|
136
|
+
## Remove the extension
|
137
|
+
config_file = config_file.split('.')[0..-1].join('.')
|
283
138
|
|
284
|
-
|
285
|
-
fetch(:sidekiq_config).is_a?(Array)
|
286
|
-
end
|
287
|
-
|
288
|
-
def process_block
|
289
|
-
(1..sidekiq_processes).each do |process|
|
290
|
-
yield(process)
|
291
|
-
end
|
139
|
+
"#{sidekiq_service_unit_name(config_file)}.service"
|
292
140
|
end
|
293
141
|
|
294
|
-
def
|
295
|
-
|
142
|
+
def config_files(role)
|
143
|
+
role.properties.fetch(:sidekiq_config_files) ||
|
144
|
+
fetch(:sidekiq_config_files)
|
296
145
|
end
|
297
146
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Source: https://github.com/mperham/sidekiq/blob/master/examples/systemd/sidekiq.service
|
2
|
+
#
|
3
|
+
# This file tells systemd how to run Sidekiq as a 24/7 long-running daemon.
|
4
|
+
|
5
|
+
# Then run:
|
6
|
+
# - systemctl enable <%= sidekiq_service_unit_name(@config_file) %>
|
7
|
+
# - systemctl {start,stop,restart} <%= sidekiq_service_unit_name(@config_file) %>
|
8
|
+
#
|
9
|
+
# Use `journalctl -u <%= sidekiq_service_unit_name(@config_file) %> -rn 100` to view the last 100 lines of log output.
|
10
|
+
#
|
11
|
+
[Unit]
|
12
|
+
Description=Sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
|
13
|
+
# start us only once the network and logging subsystems are available,
|
14
|
+
# consider adding redis-server.service if Redis is local and systemd-managed.
|
15
|
+
After=syslog.target network.target
|
16
|
+
|
17
|
+
[Service]
|
18
|
+
Type=notify
|
19
|
+
# If your Sidekiq process locks up, systemd's watchdog will restart it within seconds.
|
20
|
+
WatchdogSec=10
|
21
|
+
<%="User=#{sidekiq_user}" if fetch(:sidekiq_systemctl_user) == :system %>
|
22
|
+
WorkingDirectory=<%= current_path %>
|
23
|
+
ExecStart=<%= expanded_bundle_path %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %>
|
24
|
+
|
25
|
+
# Use `systemctl kill -s TSTP <% sidekiq_service_unit_name(@config_file) %>` to quiet the Sidekiq process
|
26
|
+
UMask=0002
|
27
|
+
|
28
|
+
<%- Array(fetch(:sidekiq_service_unit_env_files)).each do |file| %>
|
29
|
+
<%="EnvironmentFile=#{file}" %>
|
30
|
+
<% end -%>
|
31
|
+
<% Array(fetch(:sidekiq_service_unit_env_vars)).each do |environment_variable| %>
|
32
|
+
<%="Environment=\"#{environment_variable}\"" %>
|
33
|
+
<% end -%>
|
34
|
+
|
35
|
+
# if we crash, restart
|
36
|
+
RestartSec=1
|
37
|
+
Restart=on-failure
|
38
|
+
|
39
|
+
<%="StandardOutput=append:#{fetch(:sidekiq_log)}" if fetch(:sidekiq_log) -%>
|
40
|
+
|
41
|
+
<%="StandardError=append:#{fetch(:sidekiq_error_log)}" if fetch(:sidekiq_error_log) -%>
|
42
|
+
|
43
|
+
SyslogIdentifier=<%= sidekiq_service_unit_name(@config_file) %>
|
44
|
+
[Install]
|
45
|
+
WantedBy=<%=(fetch(:sidekiq_systemctl_user) == :system) ? "multi-user.target" : "default.target"%>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.alpha.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abdelkader Boudih
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 6.0.6
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 6.0.6
|
55
55
|
description: Sidekiq integration for Capistrano
|
56
56
|
email:
|
57
57
|
- terminale@gmail.com
|
@@ -59,31 +59,24 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- ".gitignore"
|
63
|
-
- ".tool-versions"
|
64
62
|
- CHANGELOG.md
|
65
|
-
- Gemfile
|
66
63
|
- LICENSE.txt
|
67
64
|
- README.md
|
68
|
-
- Rakefile
|
69
|
-
- capistrano-sidekiq.gemspec
|
70
65
|
- lib/capistrano-sidekiq.rb
|
71
66
|
- lib/capistrano/sidekiq.rb
|
72
|
-
- lib/capistrano/sidekiq/helpers.rb
|
73
|
-
- lib/capistrano/sidekiq/monit.rb
|
74
67
|
- lib/capistrano/sidekiq/systemd.rb
|
75
68
|
- lib/capistrano/sidekiq/version.rb
|
76
|
-
- lib/capistrano/tasks/monit.rake
|
77
69
|
- lib/capistrano/tasks/sidekiq.rake
|
78
70
|
- lib/capistrano/tasks/systemd.rake
|
71
|
+
- lib/capistrano/templates/sidekiq.service.capistrano.erb
|
79
72
|
- lib/generators/capistrano/sidekiq/monit/template_generator.rb
|
80
73
|
- lib/generators/capistrano/sidekiq/monit/templates/sidekiq_monit.conf.erb
|
81
|
-
- lib/generators/capistrano/sidekiq/systemd/templates/sidekiq.service.capistrano.erb
|
82
74
|
homepage: https://github.com/seuros/capistrano-sidekiq
|
83
75
|
licenses:
|
84
76
|
- LGPL-3.0
|
85
77
|
metadata: {}
|
86
|
-
post_install_message:
|
78
|
+
post_install_message: "\n Version 3.0.0 is a major release. Please see README.md,
|
79
|
+
breaking changes are listed in CHANGELOG.md\n "
|
87
80
|
rdoc_options: []
|
88
81
|
require_paths:
|
89
82
|
- lib
|
@@ -91,14 +84,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
84
|
requirements:
|
92
85
|
- - ">="
|
93
86
|
- !ruby/object:Gem::Version
|
94
|
-
version: 2.
|
87
|
+
version: 2.5.0
|
95
88
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
89
|
requirements:
|
97
|
-
- - "
|
90
|
+
- - ">"
|
98
91
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
92
|
+
version: 1.3.1
|
100
93
|
requirements: []
|
101
|
-
rubygems_version: 3.
|
94
|
+
rubygems_version: 3.1.6
|
102
95
|
signing_key:
|
103
96
|
specification_version: 4
|
104
97
|
summary: Sidekiq integration for Capistrano
|
data/.gitignore
DELETED
data/.tool-versions
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby 2.7.6
|
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
2
|
-
require 'github_changelog_generator/task'
|
3
|
-
|
4
|
-
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
5
|
-
config.user = 'seuros'
|
6
|
-
config.project = 'capistrano-sidekiq'
|
7
|
-
config.issues = false
|
8
|
-
config.future_release = '2.3.0'
|
9
|
-
end
|
data/capistrano-sidekiq.gemspec
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
lib = File.expand_path('../lib', __FILE__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'capistrano/sidekiq/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'capistrano-sidekiq'
|
7
|
-
spec.version = Capistrano::SidekiqVERSION
|
8
|
-
spec.authors = ['Abdelkader Boudih']
|
9
|
-
spec.email = ['terminale@gmail.com']
|
10
|
-
spec.summary = %q{Sidekiq integration for Capistrano}
|
11
|
-
spec.description = %q{Sidekiq integration for Capistrano}
|
12
|
-
spec.homepage = 'https://github.com/seuros/capistrano-sidekiq'
|
13
|
-
spec.license = 'LGPL-3.0'
|
14
|
-
|
15
|
-
spec.required_ruby_version = '>= 2.0.0'
|
16
|
-
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.require_paths = ['lib']
|
18
|
-
|
19
|
-
spec.add_dependency 'capistrano', '>= 3.9.0'
|
20
|
-
spec.add_dependency 'capistrano-bundler'
|
21
|
-
spec.add_dependency 'sidekiq', '>= 6.0'
|
22
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Capistrano
|
4
|
-
module Sidekiq::Helpers
|
5
|
-
|
6
|
-
def sidekiq_require
|
7
|
-
"--require #{fetch(:sidekiq_require)}" if fetch(:sidekiq_require)
|
8
|
-
end
|
9
|
-
|
10
|
-
def sidekiq_config
|
11
|
-
"--config #{fetch(:sidekiq_config)}" if fetch(:sidekiq_config)
|
12
|
-
end
|
13
|
-
|
14
|
-
def sidekiq_concurrency
|
15
|
-
"--concurrency #{fetch(:sidekiq_concurrency)}" if fetch(:sidekiq_concurrency)
|
16
|
-
end
|
17
|
-
|
18
|
-
def sidekiq_queues
|
19
|
-
Array(fetch(:sidekiq_queue)).map do |queue|
|
20
|
-
"--queue #{queue}"
|
21
|
-
end.join(' ')
|
22
|
-
end
|
23
|
-
|
24
|
-
def sidekiq_logfile
|
25
|
-
fetch(:sidekiq_log)
|
26
|
-
end
|
27
|
-
|
28
|
-
def switch_user(role, &block)
|
29
|
-
su_user = sidekiq_user(role)
|
30
|
-
if su_user == role.user
|
31
|
-
yield
|
32
|
-
else
|
33
|
-
as su_user, &block
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def sidekiq_user(role = nil)
|
38
|
-
if role.nil?
|
39
|
-
fetch(:sidekiq_user)
|
40
|
-
else
|
41
|
-
properties = role.properties
|
42
|
-
properties.fetch(:sidekiq_user) || # local property for sidekiq only
|
43
|
-
fetch(:sidekiq_user) ||
|
44
|
-
properties.fetch(:run_as) || # global property across multiple capistrano gems
|
45
|
-
role.user
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def expanded_bundle_path
|
50
|
-
backend.capture(:echo, SSHKit.config.command_map[:bundle]).strip
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Capistrano
|
4
|
-
class Sidekiq::Monit < Capistrano::Plugin
|
5
|
-
include Sidekiq::Helpers
|
6
|
-
|
7
|
-
def set_defaults
|
8
|
-
set_if_empty :monit_bin, '/usr/bin/monit'
|
9
|
-
set_if_empty :sidekiq_monit_conf_dir, '/etc/monit/conf.d'
|
10
|
-
set_if_empty :sidekiq_monit_conf_file, -> { "#{sidekiq_service_name}.conf" }
|
11
|
-
set_if_empty :sidekiq_monit_use_sudo, true
|
12
|
-
set_if_empty :sidekiq_monit_default_hooks, true
|
13
|
-
set_if_empty :sidekiq_monit_templates_path, 'config/deploy/templates'
|
14
|
-
set_if_empty :sidekiq_monit_group, nil
|
15
|
-
end
|
16
|
-
|
17
|
-
def define_tasks
|
18
|
-
eval_rakefile File.expand_path('../tasks/monit.rake', __dir__)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,127 +0,0 @@
|
|
1
|
-
git_plugin = self
|
2
|
-
|
3
|
-
namespace :deploy do
|
4
|
-
before :starting, :check_sidekiq_monit_hooks do
|
5
|
-
if fetch(:sidekiq_default_hooks) && fetch(:sidekiq_monit_default_hooks)
|
6
|
-
invoke 'sidekiq:monit:add_default_hooks'
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
namespace :sidekiq do
|
12
|
-
namespace :monit do
|
13
|
-
task :add_default_hooks do
|
14
|
-
before 'deploy:updating', 'sidekiq:monit:unmonitor'
|
15
|
-
after 'deploy:published', 'sidekiq:monit:monitor'
|
16
|
-
end
|
17
|
-
|
18
|
-
desc 'Config Sidekiq monit-service'
|
19
|
-
task :config do
|
20
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
21
|
-
@role = role
|
22
|
-
git_plugin.upload_sidekiq_template 'sidekiq_monit', "#{fetch(:tmp_dir)}/monit.conf", @role
|
23
|
-
|
24
|
-
git_plugin.switch_user(role) do
|
25
|
-
mv_command = "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:sidekiq_monit_conf_dir)}/#{fetch(:sidekiq_monit_conf_file)}"
|
26
|
-
|
27
|
-
git_plugin.sudo_if_needed mv_command
|
28
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} reload"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
desc 'Monitor Sidekiq monit-service'
|
34
|
-
task :monitor do
|
35
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
36
|
-
git_plugin.switch_user(role) do
|
37
|
-
begin
|
38
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} monitor #{git_plugin.sidekiq_service_name}"
|
39
|
-
rescue
|
40
|
-
invoke 'sidekiq:monit:config'
|
41
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} monitor #{git_plugin.sidekiq_service_name}"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
desc 'Unmonitor Sidekiq monit-service'
|
48
|
-
task :unmonitor do
|
49
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
50
|
-
git_plugin.switch_user(role) do
|
51
|
-
begin
|
52
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} unmonitor #{git_plugin.sidekiq_service_name}"
|
53
|
-
rescue
|
54
|
-
# no worries here
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
desc 'Start Sidekiq monit-service'
|
62
|
-
task :start do
|
63
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
64
|
-
git_plugin.switch_user(role) do
|
65
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} start #{git_plugin.sidekiq_service_name}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
desc 'Stop Sidekiq monit-service'
|
71
|
-
task :stop do
|
72
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
73
|
-
git_plugin.switch_user(role) do
|
74
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} stop #{git_plugin.sidekiq_service_name}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
desc 'Restart Sidekiq monit-service'
|
80
|
-
task :restart do
|
81
|
-
on roles(fetch(:sidekiq_roles)) do |role|
|
82
|
-
git_plugin.sudo_if_needed "#{fetch(:monit_bin)} restart #{git_plugin.sidekiq_service_name}"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def sidekiq_service_name
|
87
|
-
fetch(:sidekiq_service_name, "sidekiq_#{fetch(:application)}_#{fetch(:sidekiq_env)}")
|
88
|
-
end
|
89
|
-
|
90
|
-
def sudo_if_needed(command)
|
91
|
-
if use_sudo?
|
92
|
-
backend.execute :sudo, command
|
93
|
-
else
|
94
|
-
backend.execute command
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def use_sudo?
|
99
|
-
fetch(:sidekiq_monit_use_sudo)
|
100
|
-
end
|
101
|
-
|
102
|
-
def upload_sidekiq_template(from, to, role)
|
103
|
-
template = sidekiq_template(from, role)
|
104
|
-
backend.upload!(StringIO.new(ERB.new(template).result(binding)), to)
|
105
|
-
end
|
106
|
-
|
107
|
-
def sidekiq_template(name, role)
|
108
|
-
local_template_directory = fetch(:sidekiq_monit_templates_path)
|
109
|
-
|
110
|
-
search_paths = [
|
111
|
-
"#{name}-#{role.hostname}-#{fetch(:stage)}.erb",
|
112
|
-
"#{name}-#{role.hostname}.erb",
|
113
|
-
"#{name}-#{fetch(:stage)}.erb",
|
114
|
-
"#{name}.erb"
|
115
|
-
].map { |filename| File.join(local_template_directory, filename) }
|
116
|
-
|
117
|
-
global_search_path = File.expand_path(
|
118
|
-
File.join(*%w[.. .. .. generators capistrano sidekiq monit templates], "#{name}.conf.erb"),
|
119
|
-
__FILE__
|
120
|
-
)
|
121
|
-
|
122
|
-
search_paths << global_search_path
|
123
|
-
|
124
|
-
template_path = search_paths.detect { |path| File.file?(path) }
|
125
|
-
File.read(template_path)
|
126
|
-
end
|
127
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# Source: https://github.com/mperham/sidekiq/blob/master/examples/systemd/sidekiq.service
|
2
|
-
#
|
3
|
-
# This file tells systemd how to run Sidekiq as a 24/7 long-running daemon.
|
4
|
-
#
|
5
|
-
# Customize this file based on your bundler location, app directory, etc.
|
6
|
-
# Customize and copy this into /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu).
|
7
|
-
# Then run:
|
8
|
-
# - systemctl enable <%= sidekiq_service_unit_name %>
|
9
|
-
# - systemctl {start,stop,restart} <%= sidekiq_service_unit_name %>
|
10
|
-
#
|
11
|
-
# This file corresponds to a single Sidekiq process. Add multiple copies
|
12
|
-
# to run multiple processes (sidekiq-1, sidekiq-2, etc).
|
13
|
-
#
|
14
|
-
# Use `journalctl -u <%= sidekiq_service_unit_name %> -rn 100` to view the last 100 lines of log output.
|
15
|
-
#
|
16
|
-
[Unit]
|
17
|
-
Description=sidekiq for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
|
18
|
-
# start us only once the network and logging subsystems are available,
|
19
|
-
# consider adding redis-server.service if Redis is local and systemd-managed.
|
20
|
-
After=syslog.target network.target
|
21
|
-
|
22
|
-
# See these pages for lots of options:
|
23
|
-
#
|
24
|
-
# https://www.freedesktop.org/software/systemd/man/systemd.service.html
|
25
|
-
# https://www.freedesktop.org/software/systemd/man/systemd.exec.html
|
26
|
-
#
|
27
|
-
# THOSE PAGES ARE CRITICAL FOR ANY LINUX DEVOPS WORK; read them multiple
|
28
|
-
# times! systemd is a critical tool for all developers to know and understand.
|
29
|
-
#
|
30
|
-
[Service]
|
31
|
-
#
|
32
|
-
# !!!! !!!! !!!!
|
33
|
-
#
|
34
|
-
# As of v6.0.6, Sidekiq automatically supports systemd's `Type=notify` and watchdog service
|
35
|
-
# monitoring. If you are using an earlier version of Sidekiq, change this to `Type=simple`
|
36
|
-
# and remove the `WatchdogSec` line.
|
37
|
-
#
|
38
|
-
# !!!! !!!! !!!!
|
39
|
-
#
|
40
|
-
Type=notify
|
41
|
-
# If your Sidekiq process locks up, systemd's watchdog will restart it within seconds.
|
42
|
-
WatchdogSec=10
|
43
|
-
|
44
|
-
WorkingDirectory=<%= File.join(fetch(:deploy_to), 'current') %>
|
45
|
-
ExecStart=<%= expanded_bundle_path %> exec sidekiq -e <%= fetch(:sidekiq_env) %> <%= sidekiq_config %> <%= sidekiq_concurrency %> <%= sidekiq_queues %>
|
46
|
-
|
47
|
-
# Use `systemctl kill -s TSTP <%= sidekiq_service_unit_name %>` to quiet the Sidekiq process
|
48
|
-
<%="User=#{sidekiq_user}" if sidekiq_user %>
|
49
|
-
UMask=0002
|
50
|
-
|
51
|
-
<%="EnvironmentFile=#{File.join(fetch(:deploy_to), 'current')}/#{fetch(:sidekiq_service_unit_env_file)}" if fetch(:sidekiq_service_unit_env_file) %>
|
52
|
-
|
53
|
-
<% fetch(:sidekiq_service_unit_env_vars, []).each do |environment_variable| %>
|
54
|
-
<%="Environment=#{environment_variable}" %>
|
55
|
-
<% end %>
|
56
|
-
|
57
|
-
# if we crash, restart
|
58
|
-
RestartSec=1
|
59
|
-
Restart=on-failure
|
60
|
-
|
61
|
-
# output goes to /var/log/syslog (Ubuntu) or /var/log/messages (CentOS)
|
62
|
-
<%="StandardOutput=append:#{fetch(:sidekiq_log)}" if fetch(:sidekiq_log) %>
|
63
|
-
<%="StandardError=append:#{fetch(:sidekiq_error_log)}" if fetch(:sidekiq_error_log) %>
|
64
|
-
|
65
|
-
SyslogIdentifier=<%= sidekiq_service_unit_name %>
|
66
|
-
|
67
|
-
[Install]
|
68
|
-
WantedBy=default.target
|