capistrano-pumaio 0.0.18 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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) %>"