capistrano3-puma 1.2.1 → 6.0.0.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +328 -0
- data/LICENSE.txt +1 -1
- data/README.md +44 -103
- data/lib/capistrano/puma/nginx.rb +22 -1
- data/lib/capistrano/puma/systemd.rb +63 -0
- data/lib/capistrano/puma.rb +123 -1
- data/lib/capistrano/tasks/nginx.rake +12 -2
- data/lib/capistrano/tasks/systemd.rake +139 -0
- data/lib/capistrano/templates/nginx_conf.erb +43 -28
- data/lib/capistrano/templates/puma.service.erb +40 -0
- data/lib/capistrano/templates/puma.socket.erb +22 -0
- data/lib/generators/capistrano/nginx_puma/config_generator.rb +0 -1
- metadata +39 -32
- data/.gitignore +0 -18
- data/Gemfile +0 -4
- data/Rakefile +0 -1
- data/capistrano3-puma.gemspec +0 -23
- data/lib/capistrano/puma/jungle.rb +0 -2
- data/lib/capistrano/puma/monit.rb +0 -2
- data/lib/capistrano/puma/version.rb +0 -5
- data/lib/capistrano/puma/workers.rb +0 -2
- data/lib/capistrano/tasks/jungle.rake +0 -81
- data/lib/capistrano/tasks/monit.rake +0 -72
- data/lib/capistrano/tasks/puma.rake +0 -197
- data/lib/capistrano/tasks/workers.rake +0 -38
- data/lib/capistrano/templates/puma-deb.erb +0 -336
- data/lib/capistrano/templates/puma-rpm.erb +0 -328
- data/lib/capistrano/templates/puma.rb.erb +0 -42
- data/lib/capistrano/templates/puma_monit.conf.erb +0 -7
- data/lib/capistrano/templates/run-puma.erb +0 -9
@@ -1,81 +0,0 @@
|
|
1
|
-
namespace :load do
|
2
|
-
task :defaults do
|
3
|
-
set :puma_jungle_conf, '/etc/puma.conf'
|
4
|
-
set :puma_run_path, '/usr/local/bin/run-puma'
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
|
9
|
-
namespace :puma do
|
10
|
-
namespace :jungle do
|
11
|
-
|
12
|
-
desc 'Install Puma jungle'
|
13
|
-
task :install do
|
14
|
-
on roles(fetch(:puma_role)) do |role|
|
15
|
-
@role = role
|
16
|
-
template_puma 'run-puma', "#{fetch(:tmp_dir)}/run-puma", role
|
17
|
-
execute "chmod +x #{fetch(:tmp_dir)}/run-puma"
|
18
|
-
sudo "mv #{fetch(:tmp_dir)}/run-puma #{fetch(:puma_run_path)}"
|
19
|
-
if test '[ -f /etc/redhat-release ]'
|
20
|
-
#RHEL flavor OS
|
21
|
-
rhel_install
|
22
|
-
elsif test '[ -f /etc/lsb-release ]'
|
23
|
-
#Debian flavor OS
|
24
|
-
debian_install
|
25
|
-
else
|
26
|
-
#Some other OS
|
27
|
-
error 'This task is not supported for your OS'
|
28
|
-
end
|
29
|
-
sudo "touch #{fetch(:puma_jungle_conf)}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def debian_install
|
35
|
-
template_puma 'puma-deb', "#{fetch(:tmp_dir)}/puma", @role
|
36
|
-
execute "chmod +x #{fetch(:tmp_dir)}/puma"
|
37
|
-
sudo "mv #{fetch(:tmp_dir)}/puma /etc/init.d/puma"
|
38
|
-
sudo 'update-rc.d -f puma defaults'
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
def rhel_install
|
43
|
-
template_puma 'puma-rpm', "#{fetch(:tmp_dir)}/puma" , @role
|
44
|
-
execute "chmod +x #{fetch(:tmp_dir)}/puma"
|
45
|
-
sudo "mv #{fetch(:tmp_dir)}/puma /etc/init.d/puma"
|
46
|
-
sudo 'chkconfig --add puma'
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
desc 'Setup Puma config and install jungle script'
|
51
|
-
task :setup do
|
52
|
-
invoke 'puma:config'
|
53
|
-
invoke 'puma:jungle:install'
|
54
|
-
invoke 'puma:jungle:add'
|
55
|
-
end
|
56
|
-
|
57
|
-
desc 'Add current project to the jungle'
|
58
|
-
task :add do
|
59
|
-
on roles(fetch(:puma_role)) do|role|
|
60
|
-
sudo "/etc/init.d/puma add '#{current_path}' #{fetch(:puma_user, role.user)}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
desc 'Remove current project from the jungle'
|
65
|
-
task :remove do
|
66
|
-
on roles(fetch(:puma_role)) do
|
67
|
-
sudo "/etc/init.d/puma remove '#{current_path}'"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
%w[start stop restart status].each do |command|
|
72
|
-
desc "#{command} puma"
|
73
|
-
task command do
|
74
|
-
on roles(fetch(:puma_role)) do
|
75
|
-
sudo "service puma #{command} #{current_path}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
namespace :load do
|
2
|
-
task :defaults do
|
3
|
-
set :puma_monit_conf_dir, -> { "/etc/monit/conf.d/#{puma_monit_service_name}.conf" }
|
4
|
-
set :puma_monit_use_sudo, true
|
5
|
-
set :puma_monit_bin, '/usr/bin/monit'
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
namespace :puma do
|
10
|
-
namespace :monit do
|
11
|
-
desc 'Config Puma monit-service'
|
12
|
-
task :config do
|
13
|
-
on roles(fetch(:puma_role)) do |role|
|
14
|
-
@role = role
|
15
|
-
template_puma 'puma_monit.conf', "#{fetch(:tmp_dir)}/monit.conf", @role
|
16
|
-
sudo_if_needed "mv #{fetch(:tmp_dir)}/monit.conf #{fetch(:puma_monit_conf_dir)}"
|
17
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} reload"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
desc 'Monitor Puma monit-service'
|
22
|
-
task :monitor do
|
23
|
-
on roles(fetch(:puma_role)) do
|
24
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} monitor #{puma_monit_service_name}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
desc 'Unmonitor Puma monit-service'
|
29
|
-
task :unmonitor do
|
30
|
-
on roles(fetch(:puma_role)) do
|
31
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} unmonitor #{puma_monit_service_name}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
desc 'Start Puma monit-service'
|
36
|
-
task :start do
|
37
|
-
on roles(fetch(:puma_role)) do
|
38
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} start #{puma_monit_service_name}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
desc 'Stop Puma monit-service'
|
43
|
-
task :stop do
|
44
|
-
on roles(fetch(:puma_role)) do
|
45
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} stop #{puma_monit_service_name}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
desc 'Restart Puma monit-service'
|
50
|
-
task :restart do
|
51
|
-
on roles(fetch(:puma_role)) do
|
52
|
-
sudo_if_needed "#{fetch(:puma_monit_bin)} restart #{puma_monit_service_name}"
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
before 'deploy:updating', 'puma:monit:unmonitor'
|
57
|
-
after 'deploy:published', 'puma:monit:monitor'
|
58
|
-
|
59
|
-
def puma_monit_service_name
|
60
|
-
fetch(:puma_monit_service_name, "puma_#{fetch(:application)}_#{fetch(:stage)}")
|
61
|
-
end
|
62
|
-
|
63
|
-
def sudo_if_needed(command)
|
64
|
-
if fetch(:puma_monit_use_sudo)
|
65
|
-
sudo command
|
66
|
-
else
|
67
|
-
execute command
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
|
2
|
-
namespace :load do
|
3
|
-
task :defaults do
|
4
|
-
set :puma_default_hooks, -> { true }
|
5
|
-
set :puma_role, :app
|
6
|
-
set :puma_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
|
7
|
-
# Configure "min" to be the minimum number of threads to use to answer
|
8
|
-
# requests and "max" the maximum.
|
9
|
-
set :puma_threads, [0, 16]
|
10
|
-
set :puma_workers, 0
|
11
|
-
set :puma_rackup, -> { File.join(current_path, 'config.ru') }
|
12
|
-
set :puma_state, -> { File.join(shared_path, 'tmp', 'pids', 'puma.state') }
|
13
|
-
set :puma_pid, -> { File.join(shared_path, 'tmp', 'pids', 'puma.pid') }
|
14
|
-
set :puma_bind, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'puma.sock') }
|
15
|
-
set :puma_default_control_app, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'pumactl.sock') }
|
16
|
-
set :puma_conf, -> { File.join(shared_path, 'puma.rb') }
|
17
|
-
set :puma_access_log, -> { File.join(shared_path, 'log', 'puma_access.log') }
|
18
|
-
set :puma_error_log, -> { File.join(shared_path, 'log', 'puma_error.log') }
|
19
|
-
set :puma_init_active_record, false
|
20
|
-
set :puma_preload_app, false
|
21
|
-
|
22
|
-
# Rbenv and RVM integration
|
23
|
-
set :rbenv_map_bins, fetch(:rbenv_map_bins).to_a.concat(%w{ puma pumactl })
|
24
|
-
set :rvm_map_bins, fetch(:rvm_map_bins).to_a.concat(%w{ puma pumactl })
|
25
|
-
|
26
|
-
# Nginx and puma configuration
|
27
|
-
set :nginx_config_name, -> { "#{fetch(:application)}_#{fetch(:stage)}" }
|
28
|
-
set :nginx_sites_available_path, -> { '/etc/nginx/sites-available' }
|
29
|
-
set :nginx_sites_enabled_path, -> { '/etc/nginx/sites-enabled' }
|
30
|
-
set :nginx_server_name, -> { "localhost #{fetch(:application)}.local" }
|
31
|
-
set :nginx_flags, -> { 'fail_timeout=0' }
|
32
|
-
set :nginx_http_flags, -> { fetch(:nginx_flags) }
|
33
|
-
set :nginx_socket_flags, -> { fetch(:nginx_flags) }
|
34
|
-
set :nginx_use_ssl, false
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
namespace :deploy do
|
39
|
-
before :starting, :check_puma_hooks do
|
40
|
-
invoke 'puma:add_default_hooks' if fetch(:puma_default_hooks)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
namespace :puma do
|
45
|
-
|
46
|
-
desc 'Setup Puma config file'
|
47
|
-
task :config do
|
48
|
-
on roles(fetch(:puma_role)) do |role|
|
49
|
-
template_puma 'puma', fetch(:puma_conf), role
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
desc 'Start puma'
|
54
|
-
task :start do
|
55
|
-
on roles (fetch(:puma_role)) do |role|
|
56
|
-
puma_switch_user(role) do
|
57
|
-
if test "[ -f #{fetch(:puma_conf)} ]"
|
58
|
-
info "using conf file #{fetch(:puma_conf)}"
|
59
|
-
else
|
60
|
-
invoke 'puma:config'
|
61
|
-
end
|
62
|
-
within current_path do
|
63
|
-
with rack_env: fetch(:puma_env) do
|
64
|
-
execute :bundle, 'exec', :puma, "-C #{fetch(:puma_conf)} --daemon"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
%w[halt stop status].map do |command|
|
72
|
-
desc "#{command} puma"
|
73
|
-
task command do
|
74
|
-
on roles (fetch(:puma_role)) do |role|
|
75
|
-
within current_path do
|
76
|
-
puma_switch_user(role) do
|
77
|
-
with rack_env: fetch(:puma_env) do
|
78
|
-
if test "[ -f #{fetch(:puma_pid)} ]"
|
79
|
-
if test "kill -0 $( cat #{fetch(:puma_pid)} )"
|
80
|
-
execute :bundle, 'exec', :pumactl, "-S #{fetch(:puma_state)} #{command}"
|
81
|
-
else
|
82
|
-
# delete invalid pid file , process is not running.
|
83
|
-
execute :rm, fetch(:puma_pid)
|
84
|
-
end
|
85
|
-
else
|
86
|
-
#pid file not found, so puma is probably not running or it using another pidfile
|
87
|
-
warn 'Puma not running'
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
%w[phased-restart restart].map do |command|
|
97
|
-
desc "#{command} puma"
|
98
|
-
task command do
|
99
|
-
on roles (fetch(:puma_role)) do |role|
|
100
|
-
within current_path do
|
101
|
-
puma_switch_user(role) do
|
102
|
-
with rack_env: fetch(:puma_env) do
|
103
|
-
if test "[ -f #{fetch(:puma_pid)} ]" and test "kill -0 $( cat #{fetch(:puma_pid)} )"
|
104
|
-
# NOTE pid exist but state file is nonsense, so ignore that case
|
105
|
-
execute :bundle, 'exec', :pumactl, "-S #{fetch(:puma_state)} #{command}"
|
106
|
-
else
|
107
|
-
# Puma is not running or state file is not present : Run it
|
108
|
-
invoke 'puma:start'
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
task :check do
|
118
|
-
on roles (fetch(:puma_role)) do |role|
|
119
|
-
#Create puma.rb for new deployments
|
120
|
-
unless test "[ -f #{fetch(:puma_conf)} ]"
|
121
|
-
warn 'puma.rb NOT FOUND!'
|
122
|
-
#TODO DRY
|
123
|
-
template_puma 'puma', fetch(:puma_conf), role
|
124
|
-
info 'puma.rb generated'
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
task :smart_restart do
|
131
|
-
if !puma_preload_app? && puma_workers.to_i > 1
|
132
|
-
invoke 'puma:phased-restart'
|
133
|
-
else
|
134
|
-
invoke 'puma:restart'
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def puma_switch_user(role, &block)
|
139
|
-
user = puma_user(role)
|
140
|
-
if user == role.user
|
141
|
-
block.call
|
142
|
-
else
|
143
|
-
as user do
|
144
|
-
block.call
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def puma_user(role)
|
150
|
-
properties = role.properties
|
151
|
-
properties.fetch(:puma_user) || # local property for puma only
|
152
|
-
properties.fetch(:run_as) || # global property across multiple capistrano gems
|
153
|
-
role.user
|
154
|
-
end
|
155
|
-
|
156
|
-
def puma_workers
|
157
|
-
fetch(:puma_workers, 0)
|
158
|
-
end
|
159
|
-
|
160
|
-
def puma_preload_app?
|
161
|
-
fetch(:puma_preload_app)
|
162
|
-
end
|
163
|
-
|
164
|
-
def puma_bind
|
165
|
-
Array(fetch(:puma_bind)).collect do |bind|
|
166
|
-
"bind '#{bind}'"
|
167
|
-
end.join("\n")
|
168
|
-
end
|
169
|
-
|
170
|
-
def template_puma(from, to, role)
|
171
|
-
[
|
172
|
-
"lib/capistrano/templates/#{from}-#{role.hostname}-#{fetch(:stage)}.rb",
|
173
|
-
"lib/capistrano/templates/#{from}-#{role.hostname}.rb",
|
174
|
-
"lib/capistrano/templates/#{from}-#{fetch(:stage)}.rb",
|
175
|
-
"lib/capistrano/templates/#{from}.rb.erb",
|
176
|
-
"lib/capistrano/templates/#{from}.rb",
|
177
|
-
"lib/capistrano/templates/#{from}.erb",
|
178
|
-
"config/deploy/templates/#{from}.rb.erb",
|
179
|
-
"config/deploy/templates/#{from}.rb",
|
180
|
-
"config/deploy/templates/#{from}.erb",
|
181
|
-
File.expand_path("../../templates/#{from}.rb.erb", __FILE__),
|
182
|
-
File.expand_path("../../templates/#{from}.erb", __FILE__)
|
183
|
-
].each do |path|
|
184
|
-
if File.file?(path)
|
185
|
-
erb = File.read(path)
|
186
|
-
upload! StringIO.new(ERB.new(erb).result(binding)), to
|
187
|
-
break
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
task :add_default_hooks do
|
193
|
-
after 'deploy:check', 'puma:check'
|
194
|
-
after 'deploy:finished', 'puma:smart_restart'
|
195
|
-
end
|
196
|
-
|
197
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
namespace :puma do
|
2
|
-
namespace :workers do
|
3
|
-
desc 'Add a worker'
|
4
|
-
task :count do
|
5
|
-
on roles (fetch(:puma_role)) do |role|
|
6
|
-
puma_switch_user(role) do
|
7
|
-
#TODO
|
8
|
-
# cleanup
|
9
|
-
# add host name/ip
|
10
|
-
workers_count = capture("ps ax | grep -c 'puma: cluster worker: `cat #{fetch(:puma_pid)}`'").to_i - 1
|
11
|
-
log "Workers count : #{workers_count}"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# TODO
|
17
|
-
# Add/remove workers to specific host/s
|
18
|
-
# Define # of workers to add/remove
|
19
|
-
# Refactor
|
20
|
-
desc 'Worker++'
|
21
|
-
task :more do
|
22
|
-
on roles (fetch(:puma_role)) do |role|
|
23
|
-
puma_switch_user(role) do
|
24
|
-
execute("kill -TTIN `cat #{fetch(:puma_pid)}`")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
desc 'Worker--'
|
30
|
-
task :less do
|
31
|
-
on roles (fetch(:puma_role)) do |role|
|
32
|
-
puma_switch_user(role) do
|
33
|
-
execute("kill -TTOU `cat #{fetch(:puma_pid)}`")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|