capistrano-pumaio 0.0.18 → 3.0.0

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.
@@ -1,56 +0,0 @@
1
- require 'capistrano/base_helper/base_helper'
2
- Capistrano::Configuration.instance(true).load do
3
- _cset :puma_runit_service_name, "puma"
4
- _cset :puma_workers, 2 # Must use a minimum of 1 worker (cluster mode, else restart/stop fails in the state file?)
5
- _cset :puma_min_threads, 2
6
- _cset :puma_max_threads, 8
7
-
8
- _cset :puma_bin, 'bundle exec puma'
9
- _cset :puma_control, 'bundle exec pumactl'
10
-
11
- # Control files
12
- _cset :puma_socket_file, defer { "#{File.join(fetch(:sockets_path), "puma.sock")}" }
13
- _cset :puma_socket_url, defer { "unix://#{fetch(:puma_socket_file)}" }
14
- _cset :puma_pid_file, defer { File.join(fetch(:pids_path), "puma.pid") }
15
- _cset :puma_state_file, defer { File.join(fetch(:sockets_path), "puma.state") }
16
- _cset :puma_control_file, defer { "#{File.join(fetch(:sockets_path), "pumactl.sock")}" }
17
- _cset :puma_control_url, defer { "unix://#{fetch(:puma_control_file)}" }
18
-
19
- _cset :puma_use_preload_app, true # This must be set to false if phased restarts should be used
20
-
21
- _cset :puma_activate_control_app, true
22
-
23
- _cset :puma_on_restart_active, true
24
-
25
- # Logging to path
26
- _cset :puma_log_path, defer {"/var/log/service/#{fetch(:user)}/#{fetch(:application)}_#{Capistrano::BaseHelper.environment}/puma"}
27
-
28
- # Configuration files
29
- _cset :puma_local_config, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "runit")), "config.rb.erb")
30
-
31
- # The remote location of puma's config file. Used by runit when starting puma
32
- _cset :puma_remote_config, defer {File.join(shared_path, "config", "puma.rb")}
33
-
34
- # runit defaults
35
- _cset :puma_restart_interval, defer {fetch(:runit_restart_interval)}
36
- _cset :puma_restart_count, defer {fetch(:runit_restart_count)}
37
- _cset :puma_autorestart_clear_interval, defer {fetch(:runit_autorestart_clear_interval)}
38
-
39
- # runit paths
40
- _cset :puma_runit_local_run, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "runit", )), "run.erb")
41
- _cset :puma_runit_local_finish, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "runit", )), "finish.erb")
42
- _cset :puma_runit_control_q, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "runit")), "control-q.erb")
43
- _cset :puma_runit_local_log_run, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "runit")), "log-run.erb")
44
-
45
- # monit configuration
46
- _cset :puma_monit_service_name, defer { "#{fetch(:user)}_#{fetch(:application)}_#{Capistrano::BaseHelper.environment}_puma" }
47
- _cset :puma_monit_start_command, defer {"/bin/bash -c '[ ! -h #{Capistrano::RunitBase.service_path(fetch(:puma_runit_service_name))}/run ] || /usr/bin/sv start #{Capistrano::RunitBase.service_path(fetch(:puma_runit_service_name))}'"}
48
- _cset :puma_monit_stop_command, defer {"/usr/bin/sv -w 12 force-stop #{Capistrano::RunitBase.service_path(fetch(:puma_runit_service_name))}"}
49
- _cset :puma_monit_memory_alert_threshold, "150.0 MB for 2 cycles"
50
- _cset :puma_monit_memory_restart_threshold, "175.0 MB for 3 cycles"
51
- _cset :puma_monit_cpu_alert_threshold, "90% for 2 cycles"
52
- _cset :puma_monit_cpu_restart_threshold, "95% for 5 cycles"
53
-
54
- _cset :puma_local_monit_config, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "monit")), "puma.conf.erb")
55
-
56
- end
@@ -1,70 +0,0 @@
1
- # Puma - Monit
2
- # Setup and management of Monit for Puma
3
- #
4
- require 'capistrano/puma/config'
5
- require 'capistrano/base_helper/monit_base'
6
-
7
- Capistrano::Configuration.instance(true).load do
8
- after "monit:setup", "puma:monit:setup"
9
- after "puma:monit:setup", "puma:monit:enable"
10
- after "puma:monit:enable", "monit:reload"
11
-
12
- before "puma:monit.disable", "puma:monit:unmonitor"
13
- after "puma:monit:disable", "monit:reload"
14
-
15
- # start service after update in case it has not been stopped
16
- # after "deploy:update", "puma:monit:start"
17
- # Not needed?
18
-
19
- namespace :puma do
20
- namespace :monit do
21
- desc "Setup Puma monit-service"
22
- task :setup, :roles => [:app, :web, :db] do
23
- # Upload configuration
24
- Capistrano::BaseHelper::generate_and_upload_config(puma_local_monit_config, File.join(fetch(:monit_available_path), "#{fetch(:puma_runit_service_name)}.conf"))
25
- # Enable monitor
26
- end
27
-
28
- desc "Enable monit services for Puma"
29
- task :enable, :roles => [:app, :web, :db] do
30
- Capistrano::MonitBase::Service.enable("#{fetch(:puma_runit_service_name)}.conf")
31
- end
32
-
33
- desc "Disable and stop monit services for Puma"
34
- task :disable, :roles => [:app, :web, :db] do
35
- Capistrano::MonitBase::Service.disable("#{fetch(:puma_runit_service_name)}.conf")
36
- end
37
-
38
- desc "Start monit services for Puma (will also try to start the service)"
39
- task :start, :roles => [:app, :web, :db] do
40
- Capistrano::MonitBase::Service.command_monit("start", fetch(:puma_monit_service_name))
41
- end
42
-
43
- desc "Stop monit services for Puma (will also stop the service)"
44
- task :stop, :roles => [:app, :web, :db] do
45
- Capistrano::MonitBase::Service.command_monit("stop", fetch(:puma_monit_service_name))
46
- end
47
-
48
- desc "Restart monit services for Puma"
49
- task :restart, :roles => [:app, :web, :db] do
50
- Capistrano::MonitBase::Service.command_monit("restart", fetch(:puma_monit_service_name))
51
- end
52
-
53
- desc "Monitor Puma"
54
- task :monitor, :roles => [:app, :web, :db] do
55
- Capistrano::MonitBase::Service.command_monit("monitor", fetch(:puma_monit_service_name))
56
- end
57
-
58
- desc "Unmonitor Puma"
59
- task :unmonitor, :roles => [:app, :web, :db] do
60
- Capistrano::MonitBase::Service.command_monit("unmonitor", fetch(:puma_monit_service_name))
61
- end
62
-
63
- desc "Purge Puma monit configuration"
64
- task :unmonitor, :roles => [:app, :web, :db], :on_error => :continue do
65
- end
66
-
67
- end
68
-
69
- end
70
- end
@@ -1,128 +0,0 @@
1
- require 'capistrano/puma/config'
2
- require 'capistrano/base_helper/monit_base'
3
-
4
- Capistrano::Configuration.instance.load do
5
-
6
- # Where your nginx lives. Usually /opt/nginx or /usr/local/nginx for source compiled.
7
- _cset :nginx_sites_enabled_path, "/etc/nginx/sites-enabled"
8
-
9
- # simple authorization in nginx recipe
10
- # Remember NOT to share your deployment file in case you have sensitive passwords stored in it...
11
- # This is added to make it easier to deploy staging sites with a simple htpasswd.
12
-
13
- _cset :nginx_use_simple_auth, false
14
- _cset :nginx_simple_auth_message, "Restricted site"
15
- _cset :nginx_simple_auth_user, "user"
16
- _cset :nginx_simple_auth_password, "password"
17
- _cset :nginx_simple_auth_salt, (0...8).map{ ('a'..'z').to_a[rand(26)] }.join
18
-
19
- # Server names. Defaults to application name.
20
- _cset :server_names, defer {"#{fetch(:application)}_#{Capistrano::BaseHelper.environment}"}
21
-
22
- # Path to the nginx erb template to be parsed before uploading to remote
23
- _cset :nginx_local_config, File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "nginx", )), "application.conf.erb")
24
-
25
- # Path to where your remote config will reside (I use a directory sites inside conf)
26
- _cset :nginx_remote_config, defer {File.join("#{fetch(:shared_path)}", "config", "nginx_#{fetch(:application)}_#{Capistrano::BaseHelper.environment}.conf")}
27
-
28
- # Path to local htpasswd template file
29
- _cset :nginx_local_htpasswd, defer {File.join(File.expand_path(File.join(File.dirname(__FILE__),"../../../templates", "nginx", )), "htpasswd.erb")}
30
-
31
- # Path to remote htpasswd file
32
- _cset :nginx_remote_htpasswd, defer {File.join("#{fetch(:shared_path)}", "config", ".htpasswd")}
33
-
34
- _cset :nginx_sites_enabled_symlink, defer {File.join(nginx_sites_enabled_path, "#{fetch(:application)}_#{Capistrano::BaseHelper.environment}")}
35
-
36
- _cset :nginx_uses_http, true
37
- _cset :nginx_uses_ssl, false
38
- _cset :nginx_port, 80
39
-
40
- _cset :nginx_log_path, File.join("/var", "log", "nginx", "#{fetch(:application)}")
41
-
42
- _cset :nginx_client_max_body_size, "10M"
43
-
44
- _cset :nginx_ssl_port, 443
45
- _cset :nginx_ssl_use_simple_auth, false
46
- _cset :nginx_ssl_client_max_body_size, "10M"
47
- _cset :nginx_ssl_public_crt, File.join("/etc", "certs", "server.crt")
48
- _cset :nginx_ssl_private_key, File.join("/etc", "certs", "server.key")
49
-
50
- # Nginx tasks are not *nix agnostic, they assume you're using Debian/Ubuntu.
51
- # Override them as needed.
52
- namespace :puma do
53
- namespace :nginx do
54
- desc "Parses and uploads nginx configuration for this app."
55
- task :setup, :roles => :app , :except => { :no_release => true } do
56
-
57
- Capistrano::BaseHelper.generate_and_upload_config(fetch(:nginx_local_config), fetch(:nginx_remote_config))
58
-
59
- # if auth is enabled, upload htpasswd file
60
- # Since passwords are stored in plaintext in the deployment file, you should use simple auth with care.
61
- # It is generally better to implement a full authorization stack like oauth, use devise on rails, or other login/auth system
62
- if fetch(:nginx_use_simple_auth) or fetch(:nginx_ssl_use_simple_auth)
63
- if Capistrano::CLI.ui.agree("Create .htpasswd configuration file? [Yn]")
64
- Capistrano::BaseHelper.generate_and_upload_config(fetch(:nginx_local_htpasswd), fetch(:nginx_remote_htpasswd))
65
- else
66
- set :nginx_use_simple_auth, false
67
- set :nginx_ssl_use_simple_auth, false
68
- end
69
- end
70
-
71
- # create log path, must sudo since path can have root-only permissions
72
- run "#{sudo} mkdir -p /var/log/nginx/#{fetch(:application)} && #{sudo} chown root:www-data /var/log/nginx/#{fetch(:application)}"
73
- end
74
-
75
- desc "Enable nginx site for the application"
76
- task :enable, :roles => :app , :except => { :no_release => true } do
77
- # symlink to nginx site configuration file
78
- run("[ -h #{fetch(:nginx_sites_enabled_symlink)} ] || #{sudo} ln -sf #{fetch(:nginx_remote_config)} #{fetch(:nginx_sites_enabled_symlink)}")
79
- end
80
-
81
- desc "Disable nginx site for the application"
82
- task :disable, :roles => :app , :except => { :no_release => true } do
83
- run("[ ! -h #{fetch(:nginx_sites_enabled_symlink)} ] || #{sudo} rm -f #{fetch(:nginx_sites_enabled_symlink)}")
84
- end
85
-
86
- desc "Purge nginx site config for the application"
87
- task :purge, :roles => :app , :except => { :no_release => true } do
88
- run("[ ! -h #{fetch(:nginx_sites_enabled_symlink)} ] || #{sudo} rm -f #{fetch(:nginx_sites_enabled_symlink)}")
89
- # must restart nginx to make sure site is disabled when config is purge
90
- run "#{sudo} service nginx restart"
91
- run "rm -f #{fetch(:nginx_remote_htpasswd)} && rm -f #{fetch(:nginx_remote_config)}"
92
- end
93
-
94
- end
95
- end
96
-
97
- namespace :nginx do
98
- desc "Restart nginx"
99
- task :restart, :roles => :app , :except => { :no_release => true } do
100
- run "#{sudo} service nginx restart"
101
- end
102
-
103
- desc "Stop nginx"
104
- task :stop, :roles => :app , :except => { :no_release => true } do
105
- run "#{sudo} service nginx stop"
106
- end
107
-
108
- desc "Start nginx"
109
- task :start, :roles => :app , :except => { :no_release => true } do
110
- run "#{sudo} service nginx start"
111
- end
112
-
113
- desc "Show nginx status"
114
- task :status, :roles => :app , :except => { :no_release => true } do
115
- run "#{sudo} service nginx status"
116
- end
117
-
118
- end
119
-
120
- after 'deploy:setup' do
121
- puma.nginx.setup if Capistrano::CLI.ui.agree("Create nginx configuration file? [Yn]")
122
- if Capistrano::CLI.ui.agree("Enable site in nginx? [Yn]")
123
- puma.nginx.enable
124
- nginx.restart # must restart after enable for nginx to pickup new site
125
- end
126
- end
127
-
128
- end
@@ -1,145 +0,0 @@
1
- # Puma - Runit
2
- require 'capistrano/puma/config'
3
- require 'capistrano/base_helper/runit_base'
4
-
5
- Capistrano::Configuration.instance(true).load do
6
- after "deploy:setup", "puma:runit:setup"
7
-
8
- # enable service after update in case it has not been setup or is disabled
9
- # Service should probably be started as well?
10
- after "deploy:update", "puma:runit:enable"
11
- before "puma:runit:setup", "puma:flush_sockets"
12
- before "puma:runit:setup", "puma:setup"
13
- before "puma:runit:quit", "puma:runit:stop"
14
-
15
- namespace :puma do
16
-
17
- desc "Setup Puma configuration"
18
- task :setup, :roles => :app do
19
- Capistrano::BaseHelper.prepare_path(File.join(fetch(:shared_path), "sockets"), fetch(:user), fetch(:group))
20
-
21
- # Create puma configuration file
22
- Capistrano::BaseHelper::generate_and_upload_config(fetch(:puma_local_config), fetch(:puma_remote_config))
23
- end
24
-
25
- desc "Flush Puma sockets, as they can end up 'hanging around'"
26
- task :flush_sockets, :roles => :app do
27
- run "rm -f #{fetch(:puma_socket_file)}; rm -f #{fetch(:puma_control_file)}"
28
- end
29
-
30
- namespace :runit do
31
- desc "Setup Puma runit-service"
32
- task :setup, :roles => :app do
33
-
34
-
35
- # Create runit config
36
- Capistrano::RunitBase.create_service_dir(puma_runit_service_name)
37
- Capistrano::BaseHelper::generate_and_upload_config(puma_runit_local_run, Capistrano::RunitBase.remote_run_config_path(puma_runit_service_name))
38
- Capistrano::BaseHelper::generate_and_upload_config(puma_runit_local_finish, Capistrano::RunitBase.remote_finish_config_path(puma_runit_service_name))
39
-
40
- #must use quit script for stop as well
41
- Capistrano::BaseHelper::generate_and_upload_config(puma_runit_control_q, Capistrano::RunitBase.remote_control_path(puma_runit_service_name, "q"))
42
- Capistrano::BaseHelper::generate_and_upload_config(puma_runit_control_q, Capistrano::RunitBase.remote_control_path(puma_runit_service_name, "s"))
43
- Capistrano::BaseHelper::generate_and_upload_config(puma_runit_local_log_run, Capistrano::RunitBase.remote_service_log_run_path(puma_runit_service_name))
44
-
45
- # Make scripts executable
46
- Capistrano::RunitBase.make_service_scripts_executeable(puma_runit_service_name)
47
- # Set correct permissions/owner on log path
48
- Capistrano::RunitBase.create_and_permissions_on_path(fetch(:puma_log_path))
49
- end
50
-
51
- desc "Enable Puma runit-service"
52
- task :enable, :roles => :app do
53
- Capistrano::RunitBase.enable_service(puma_runit_service_name)
54
- end
55
-
56
- desc "Disable Puma runit-service"
57
- task :disable, :roles => :app do
58
- Capistrano::RunitBase.disable_service(puma_runit_service_name)
59
- end
60
-
61
- desc "Start Puma runit-service"
62
- task :start, :roles => :app do
63
- Capistrano::RunitBase.start_service(puma_runit_service_name)
64
- end
65
-
66
- desc "Start Puma runit-service only ONCE (no supervision...)"
67
- task :once, :roles => :app do
68
- Capistrano::RunitBase.start_service_once(puma_runit_service_name)
69
- end
70
-
71
- desc "Stop Puma runit-service"
72
- task :stop, :roles => :app, :on_error => :continue do
73
- # have to use force-stop on failed stop, since puma might not terminate properly
74
- # will wait 25 seconds for puma to shut down, to allow it to serve any on-going requests
75
- Capistrano::RunitBase.control_service(puma_runit_service_name, "force-stop", false, "-w 25")
76
- end
77
-
78
- desc "Quit the puma runit-service"
79
- task :quit, :roles => :app, :on_error => :continue do
80
- Capistrano::RunitBase.control_service(puma_runit_service_name, "quit")
81
- end
82
-
83
- desc "Restart Puma runit-service"
84
- task :restart, :roles => :app do
85
- result = nil
86
- started = false
87
-
88
- # It is not possible to see if a restart is in progress using the pumactl tool as of now.
89
-
90
- # restarting = false
91
- # # check if puma is already performing a restart
92
- # invoke_command("cd #{fetch(:current_path)}; [[ $(#{fetch(:puma_control)} -S #{fetch(:puma_state_file)} status) == *restart* ]] && echo 'restarting';true") do |ch, stream, out|
93
- # result = (/restart/ =~ out)
94
- # end
95
- # restarting = true unless result.nil?
96
- # result = nil
97
-
98
- # if restarting == false
99
- # check if it is running
100
- invoke_command("cd #{fetch(:current_path)}; [[ $(#{fetch(:puma_control)} -S #{fetch(:puma_state_file)} status) == *started* ]] && echo 'started';true") do |ch, stream, out|
101
- result = (/started/ =~ out)
102
- end
103
- started = true unless result.nil?
104
-
105
- if started == true
106
- logger.info("\nRestarting puma")
107
- # Send USR2 to puma in order to restart it....
108
- Capistrano::RunitBase.control_service(puma_runit_service_name, "2")
109
- else
110
- logger.important("\nStarting puma, (wasn't running before)")
111
- Capistrano::RunitBase.start_service(puma_runit_service_name)
112
- end
113
- # end
114
- end
115
-
116
- desc "Phased Restart of Puma"
117
- task :phased_restart, :roles => :app do
118
- result = nil
119
- started = false
120
-
121
- # check if it is running
122
- invoke_command("cd #{fetch(:current_path)}; [[ $(#{fetch(:puma_control)} -S #{fetch(:puma_state_file)} status) == *started* ]] && echo 'started';true") do |ch, stream, out|
123
- result = (/started/ =~ out)
124
- end
125
- started = true unless result.nil?
126
-
127
- if started == true
128
- # Send USR1 to puma in order to restart it....
129
- logger.info("\nPhased restart of puma")
130
- Capistrano::RunitBase.control_service(puma_runit_service_name, "1")
131
- else
132
- logger.important("\nStarting puma, (wasn't running before)")
133
- Capistrano::RunitBase.start_service(puma_runit_service_name)
134
- end
135
- end
136
-
137
- desc "Purge Puma runit configuration"
138
- task :purge, :roles => :app, :on_error => :continue do
139
- Capistrano::RunitBase.force_control_service(puma_runit_service_name, "force-stop", true)
140
- Capistrano::RunitBase.purge_service(puma_runit_service_name)
141
- end
142
-
143
- end
144
- end
145
- end
@@ -1,20 +0,0 @@
1
- # Puma configuration for: <% c = Capistrano::BaseHelper::get_capistrano_instance %>
2
- # <%= "#{c.fetch(:application)} running as #{c.fetch(:user)} in environment #{Capistrano::BaseHelper.environment}" %>
3
- workers <%= c.fetch(:puma_workers) %>
4
- threads <%= c.fetch(:puma_min_threads) %>, <%= c.fetch(:puma_max_threads) %>
5
- bind '<%= c.fetch(:puma_socket_url) %>'
6
- pidfile '<%= c.fetch(:puma_pid_file) %>'
7
- state_path '<%= c.fetch(:puma_state_file) %>'
8
- environment '<%= "#{Capistrano::BaseHelper.environment}" %>'
9
- <%= "activate_control_app '#{c.fetch(:puma_control_url)}'" if c.fetch(:puma_activate_control_app) %>
10
-
11
- # In some cases preloading the app is best to avoid some infinite restart loops, however, it cannot be used in
12
- # combination with phased restart.
13
- <%= "preload_app!" if c.fetch(:puma_use_preload_app) %>
14
-
15
- directory '<%= File.join(c.fetch(:deploy_to), "current") %>'
16
-
17
- # TODO - fix restart block!
18
- # <%= "on_restart do" if c.fetch(:puma_on_restart_active) %>
19
- # <%= " puts \"Restarting puma\"" if c.fetch(:puma_on_restart_active) %>
20
- # <%= "end" if c.fetch(:puma_on_restart_active) %>
@@ -1,8 +0,0 @@
1
- #!/bin/bash --login
2
- <% c = Capistrano::BaseHelper.get_capistrano_instance %>
3
- # Announcing stop/abort
4
- echo "<%= "User: #{c.fetch(:user)} Application: #{c.fetch(:application)} Service: #{c.fetch(:puma_runit_service_name)}" %> stopping..."
5
-
6
- # The command used when puma is asked to quit/stop/exit, overridden here, as runit normal signal will not work with puma
7
- cd '<%= c.current_path %>'
8
- RAILS_ENV=<%= Capistrano::BaseHelper.environment %> exec <%= c.fetch(:puma_control) %> -S <%= c.fetch(:puma_state_file) %> stop
@@ -1,10 +0,0 @@
1
- #!/bin/sh -e
2
- <% c = Capistrano::BaseHelper::get_capistrano_instance %>
3
- # Log output for puma running on <%= c.fetch(:application) %> running as <%= c.fetch(:user) %>
4
- # make sure the log directory exists
5
- mkdir -p "<%= c.fetch(:puma_log_path) %>"
6
- # change path to the log directory
7
- cd "<%= c.fetch(:puma_log_path) %>"
8
- # start logging
9
- # exec chpst -u syslog svlogd -tt "<%= c.fetch(:puma_log_path) %>"
10
- exec svlogd -tt "<%= c.fetch(:puma_log_path) %>"