capistrano3-puma 5.2.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98e0fb64cfd73c2183c8ac641ec0e426f1721657254eeae1b6cebea4d9b34e78
4
- data.tar.gz: 658219686493acef08d13c050c6d3c8536c980a6820d3d1165dcb5c3e3c80f89
3
+ metadata.gz: 8d2f6376b7e7c2838e8d06d7acb249e7b4cca75982bd440e2ad8952f80941132
4
+ data.tar.gz: 24ca957bc88c4f06d7a11dea7c70b72f77ca275bc46a77b6eb44f98bc51b5a3e
5
5
  SHA512:
6
- metadata.gz: 2423e9acfe501fe4404592ae5099e619aa168e055372ea7e56762a001e59cbefbdf6d32373e7c003a6abe2fefcde429887bddb5d02d7806b8969fa92297d70ad
7
- data.tar.gz: f629c899266cbc6a97b40243c1edfdfa7ba23e6f519f837e6c05209de2845261ca25a823a84ecbf1045fe8566845deff8fb71c7fee967e1c9b46d67896f9652b
6
+ metadata.gz: e0d445a032ad196fd65b8aa863c1fb049aec6f9e8f47f22cd2d05993555c354e110bfb397d1a001b6ee0b3cb9b19e38c3d6fe76bba47d5682b17992910a5717c
7
+ data.tar.gz: 9bba6960b9246b4877b02baa6339baf7a940caf16bcf54be2c0148850f96b7af1e68a07a97d03ac07bbc978275e1ea6ca44812587da942e176b674d230d2a88c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ [Unreleased](https://github.com/seuros/capistrano-puma/compare/v5.2.0...master)
4
+ - Removed support for support for monit and upstart. (will add them back if someone is willing to maintain them)
5
+ - Sync configuration with capistrano-sidekiq
6
+ - Support for notify systemd service. Add sd_notify gem to your Gemfile.
7
+ - Add example application for easier testing.
8
+ - Deprecate Nginx support. (configuration tools should be preferred over capistrano tasks)
9
+
3
10
  ## [5.2.0](https://github.com/seuros/capistrano-puma/tree/5.2.0) (2021-09-11)
4
11
 
5
12
  [Full Changelog](https://github.com/seuros/capistrano-puma/compare/v5.1.1...5.2.0)
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2013-2020 Abdelkader Boudih
3
+ Copyright (c) 2013-2022 Abdelkader Boudih
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -21,27 +21,14 @@ And then execute:
21
21
 
22
22
  require 'capistrano/puma'
23
23
  install_plugin Capistrano::Puma # Default puma tasks
24
- install_plugin Capistrano::Puma::Workers # if you want to control the workers (in cluster mode)
25
- install_plugin Capistrano::Puma::Jungle # if you need the jungle tasks
26
- install_plugin Capistrano::Puma::Monit # if you need the monit tasks
27
- install_plugin Capistrano::Puma::Nginx # if you want to upload a nginx site template
28
- ```
29
- You will need to select your service manager
30
- ```ruby
31
- install_plugin Capistrano::Puma::Daemon # If you using puma daemonized (not supported in Puma 5+)
32
- ```
33
- or
34
- ```ruby
35
- install_plugin Capistrano::Puma::Systemd # if you use SystemD
24
+ install_plugin Capistrano::Puma::Systemd
36
25
  ```
37
26
 
38
27
  To prevent loading the hooks of the plugin, add false to the load_hooks param.
39
28
  ```ruby
40
29
  # Capfile
41
30
 
42
- require 'capistrano/puma'
43
31
  install_plugin Capistrano::Puma, load_hooks: false # Default puma tasks without hooks
44
- install_plugin Capistrano::Puma::Monit, load_hooks: false # Monit tasks without hooks
45
32
  ```
46
33
 
47
34
  To make it work with rvm, rbenv and chruby, install the plugin after corresponding library inclusion.
@@ -55,84 +42,12 @@ To make it work with rvm, rbenv and chruby, install the plugin after correspondi
55
42
 
56
43
  ### Config
57
44
 
58
- To list available tasks use `cap -T`
59
-
60
- To upload puma config use:
61
- ```ruby
62
- cap production puma:config
63
- ```
64
- By default the file located in `shared/puma.rb`
65
-
66
-
67
- Ensure that `tmp/pids` and ` tmp/sockets log` are shared (via `linked_dirs`):
68
-
69
- `This step is mandatory before deploying, otherwise puma server won't start`
70
-
71
- ### Nginx
72
-
73
- To upload a nginx site config (eg. /etc/nginx/sites-enabled/) use:
74
- ```ruby
75
- cap production puma:nginx_config
76
- ```
77
-
78
- To customize these two templates locally before uploading use:
79
- ```
80
- rails g capistrano:nginx_puma:config
81
- ```
82
-
83
- if your nginx server configuration is not located in `/etc/nginx`, you may need to customize:
84
- ```ruby
85
- set :nginx_sites_available_path, "/etc/nginx/sites-available"
86
- set :nginx_sites_enabled_path, "/etc/nginx/sites-enabled"
87
- ```
88
-
89
- By default, `nginx_config` will be executed with `:web` role. But you can assign it to a different role:
90
- ```ruby
91
- set :puma_nginx, :foo
92
- ```
93
- or define a standalone one:
94
- ```ruby
95
- role :puma_nginx, %w{root@example.com}
96
- ```
97
-
98
- ### Jungle
45
+ Puma configuration is expected to be in `config/puma.rb` or `config/puma/#{fetch(:puma_env)}.rb` and checked in your repository.
46
+ Uploading the configuration via capistrano was removed as it was causing problems with custom configurations.
99
47
 
100
- For Jungle tasks (beta), these options exist:
101
- ```ruby
102
- set :puma_jungle_conf, '/etc/puma.conf'
103
- set :puma_run_path, '/usr/local/bin/run-puma'
104
- ```
105
-
106
- ### Systemd
107
-
108
- Install Systemd plugin in `Capfile`:
109
- ```ruby
110
- install_plugin Capistrano::Puma
111
- install_plugin Capistrano::Puma::Systemd
112
- ```
113
-
114
- To generate unit file use:
115
- ```
116
- cap production puma:systemd:config puma:systemd:enable
117
- ```
48
+ ## Example
118
49
 
119
- To use customize environment variables
120
-
121
- ```ruby
122
- set :puma_service_unit_env_file, '/etc/environment'
123
- ```
124
- ```ruby
125
- set :puma_service_unit_env_vars, %w[
126
- RAILS_ENV=development
127
- PUMA_METRICS_HTTP=tcp://0.0.0.0:9393
128
- ]
129
- ```
130
-
131
- To use [phased restart](https://github.com/puma/puma/blob/master/docs/restart.md) for zero downtime deployments:
132
-
133
- ```ruby
134
- set :puma_phased_restart, true
135
- ```
50
+ A sample application is provided to show how to use this gem at https://github.com/seuros/capistrano-example-app
136
51
 
137
52
  ### Systemd Socket Activation
138
53
 
@@ -150,68 +65,15 @@ cap puma:systemd:restart_socket
150
65
  ```
151
66
  This would also restart the puma instance as the puma service depends on the socket service being active
152
67
 
153
- ### Multi bind
154
-
155
- Multi-bind can be set with an array in the puma_bind variable
156
- ```ruby
157
- set :puma_bind, %w(tcp://0.0.0.0:9292 unix:///tmp/puma.sock)
158
- ```
159
- * Listening on tcp://0.0.0.0:9292
160
- * Listening on unix:///tmp/puma.sock
161
-
162
- ### Active Record
163
-
164
- For ActiveRecord the following line to your deploy.rb
165
- ```ruby
166
- set :puma_init_active_record, true
167
- ```
168
-
169
68
  ### Other configs
170
69
 
171
70
  Configurable options, shown here with defaults: Please note the configuration options below are not required unless you are trying to override a default setting, for instance if you are deploying on a host on which you do not have sudo or root privileges and you need to restrict the path. These settings go in the deploy.rb file.
172
71
 
173
72
  ```ruby
174
73
  set :puma_user, fetch(:user)
175
- set :puma_rackup, -> { File.join(current_path, 'config.ru') }
176
- set :puma_state, "#{shared_path}/tmp/pids/puma.state"
177
- set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
178
- set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock" #accept array for multi-bind
179
- set :puma_control_app, false
180
- set :puma_default_control_app, "unix://#{shared_path}/tmp/sockets/pumactl.sock"
181
- set :puma_conf, "#{shared_path}/puma.rb"
182
- set :puma_access_log, "#{shared_path}/log/puma_access.log"
183
- set :puma_error_log, "#{shared_path}/log/puma_error.log"
184
- set :puma_role, :app
185
- set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
186
- set :puma_threads, [0, 16]
187
- set :puma_workers, 0
188
- set :puma_worker_timeout, nil
189
- set :puma_init_active_record, false
190
- set :puma_preload_app, false
191
- set :puma_daemonize, false
192
- set :puma_plugins, [] #accept array of plugins
193
- set :puma_tag, fetch(:application)
194
- set :puma_restart_command, 'bundle exec puma'
195
- set :puma_service_unit_name, "puma_#{fetch(:application)}_#{fetch(:stage)}"
196
- set :puma_systemctl_user, :system # accepts :user
197
- set :puma_enable_lingering, fetch(:puma_systemctl_user) != :system # https://wiki.archlinux.org/index.php/systemd/User#Automatic_start-up_of_systemd_user_instances
198
- set :puma_lingering_user, fetch(:user)
199
- set :puma_service_unit_env_file, nil
74
+ set :puma_role, :web
75
+ set :puma_service_unit_env_files, []
200
76
  set :puma_service_unit_env_vars, []
201
- set :puma_phased_restart, false
202
-
203
- set :nginx_config_name, "#{fetch(:application)}_#{fetch(:stage)}"
204
- set :nginx_flags, 'fail_timeout=0'
205
- set :nginx_http_flags, fetch(:nginx_flags)
206
- set :nginx_server_name, "localhost #{fetch(:application)}.local"
207
- set :nginx_sites_available_path, '/etc/nginx/sites-available'
208
- set :nginx_sites_enabled_path, '/etc/nginx/sites-enabled'
209
- set :nginx_socket_flags, fetch(:nginx_flags)
210
- set :nginx_ssl_certificate, "/etc/ssl/certs/#{fetch(:nginx_config_name)}.crt"
211
- set :nginx_ssl_certificate_key, "/etc/ssl/private/#{fetch(:nginx_config_name)}.key"
212
- set :nginx_use_ssl, false
213
- set :nginx_use_http2, true
214
- set :nginx_downstream_uses_ssl, false
215
77
  ```
216
78
 
217
79
  __Notes:__ If you are setting values for variables that might be used by other plugins, use `append` instead of `set`. For example:
@@ -219,6 +81,9 @@ __Notes:__ If you are setting values for variables that might be used by other p
219
81
  append :rbenv_map_bins, 'puma', 'pumactl'
220
82
  ```
221
83
 
84
+ # Nginx documentation
85
+ Nginx documentation was moved to [nginx.md](docs/nginx.md)
86
+
222
87
  ## Contributing
223
88
 
224
89
  1. Fork it
@@ -11,13 +11,18 @@ module Capistrano
11
11
  end
12
12
 
13
13
  def set_defaults
14
- set_if_empty :puma_systemctl_bin, '/bin/systemctl'
15
- set_if_empty :puma_service_unit_name, -> { "puma_#{fetch(:application)}_#{fetch(:stage)}" }
16
- set_if_empty :puma_enable_socket_service, -> { false }
17
- set_if_empty :puma_systemctl_user, :system
14
+ set_if_empty :puma_systemctl_bin, -> { fetch(:systemctl_bin, '/bin/systemctl') }
15
+ set_if_empty :puma_service_unit_name, -> { "#{fetch(:application)}_puma_#{fetch(:stage)}" }
16
+ set_if_empty :puma_enable_socket_service, false
17
+
18
+ set_if_empty :puma_service_unit_env_files, -> { fetch(:service_unit_env_files, []) }
19
+ set_if_empty :puma_service_unit_env_vars, -> { fetch(:service_unit_env_vars, []) }
20
+
21
+ set_if_empty :puma_systemctl_user, -> { fetch(:systemctl_user, :user) }
18
22
  set_if_empty :puma_enable_lingering, -> { fetch(:puma_systemctl_user) != :system }
19
- set_if_empty :puma_lingering_user, -> { fetch(:user) }
20
- set_if_empty :puma_phased_restart, -> { false }
23
+ set_if_empty :puma_lingering_user, -> { fetch(:lingering_user, fetch(:user)) }
24
+
25
+ set_if_empty :puma_service_templates_path, fetch(:service_templates_path, 'config/deploy/templates')
21
26
  end
22
27
 
23
28
  def expanded_bundle_command
@@ -28,6 +28,15 @@ module Capistrano
28
28
  end.join("\n")
29
29
  end
30
30
 
31
+ def service_unit_type
32
+ ## Jruby don't support notify
33
+ return "simple" if RUBY_ENGINE == "jruby"
34
+ fetch(:puma_service_unit_type,
35
+ ## Check if sd_notify is available in the bundle
36
+ Gem::Specification.find_all_by_name("sd_notify").any? ? "notify" : "simple")
37
+
38
+ end
39
+
31
40
  def compiled_template_puma(from, role)
32
41
  @role = role
33
42
  file = [
@@ -44,7 +53,7 @@ module Capistrano
44
53
  File.expand_path("../templates/#{from}.rb.erb", __FILE__)
45
54
  ].detect { |path| File.file?(path) }
46
55
  erb = File.read(file)
47
- StringIO.new(ERB.new(erb, nil, '-').result(binding))
56
+ StringIO.new(ERB.new(erb, trim_mode: '-').result(binding))
48
57
  end
49
58
 
50
59
  def template_puma(from, to, role)
@@ -94,72 +103,21 @@ module Capistrano
94
103
  class Puma < Capistrano::Plugin
95
104
  include PumaCommon
96
105
 
97
- def define_tasks
98
- eval_rakefile File.expand_path('../tasks/puma.rake', __FILE__)
99
- end
100
-
101
106
  def set_defaults
102
- set_if_empty :puma_role, :app
107
+ set_if_empty :puma_role, :web
103
108
  set_if_empty :puma_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) }
104
- # Configure "min" to be the minimum number of threads to use to answer
105
- # requests and "max" the maximum.
106
- set_if_empty :puma_threads, [0, 16]
107
- set_if_empty :puma_workers, 0
108
- set_if_empty :puma_rackup, -> { File.join(current_path, 'config.ru') }
109
- set_if_empty :puma_state, -> { File.join(shared_path, 'tmp', 'pids', 'puma.state') }
110
- set_if_empty :puma_pid, -> { File.join(shared_path, 'tmp', 'pids', 'puma.pid') }
111
- set_if_empty :puma_bind, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'puma.sock') }
112
- set_if_empty :puma_control_app, false
113
- set_if_empty :puma_default_control_app, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'pumactl.sock') }
114
- set_if_empty :puma_conf, -> { File.join(shared_path, 'puma.rb') }
115
- set_if_empty :puma_access_log, -> { File.join(shared_path, 'log', 'puma_access.log') }
116
- set_if_empty :puma_error_log, -> { File.join(shared_path, 'log', 'puma_error.log') }
117
- set_if_empty :puma_init_active_record, false
118
- set_if_empty :puma_preload_app, false
119
- set_if_empty :puma_daemonize, false
120
- set_if_empty :puma_tag, ''
121
- set_if_empty :puma_restart_command, 'bundle exec puma'
109
+ set_if_empty :puma_access_log, -> { File.join(shared_path, 'log', "puma.log") }
110
+ set_if_empty :puma_error_log, -> { File.join(shared_path, 'log', "puma.log") }
122
111
 
123
112
  # Chruby, Rbenv and RVM integration
124
- append :chruby_map_bins, 'puma', 'pumactl'
125
- append :rbenv_map_bins, 'puma', 'pumactl'
126
- append :rvm_map_bins, 'puma', 'pumactl'
113
+ append :chruby_map_bins, 'puma', 'pumactl' if fetch(:chruby_map_bins)
114
+ append :rbenv_map_bins, 'puma', 'pumactl' if fetch(:rbenv_map_bins)
115
+ append :rvm_map_bins, 'puma', 'pumactl' if fetch(:rvm_map_bins)
127
116
 
128
117
  # Bundler integration
129
118
  append :bundle_bins, 'puma', 'pumactl'
130
119
  end
131
-
132
- def register_hooks
133
- after 'deploy:check', 'puma:check'
134
- end
135
-
136
- def puma_workers
137
- fetch(:puma_workers, 0)
138
- end
139
-
140
- def puma_preload_app?
141
- fetch(:puma_preload_app)
142
- end
143
-
144
- def puma_daemonize?
145
- fetch(:puma_daemonize)
146
- end
147
-
148
- def puma_plugins
149
- Array(fetch(:puma_plugins)).collect do |bind|
150
- "plugin '#{bind}'"
151
- end.join("\n")
152
- end
153
-
154
- def upload_puma_rb(role)
155
- template_puma 'puma', fetch(:puma_conf), role
156
- end
157
120
  end
158
121
  end
159
122
 
160
- require 'capistrano/puma/workers'
161
- require 'capistrano/puma/daemon'
162
123
  require 'capistrano/puma/systemd'
163
- require 'capistrano/puma/monit'
164
- require 'capistrano/puma/jungle'
165
- require 'capistrano/puma/nginx'
@@ -3,76 +3,65 @@
3
3
  git_plugin = self
4
4
 
5
5
  namespace :puma do
6
- namespace :systemd do
7
- desc 'Config Puma systemd service'
8
- task :config do
9
- on roles(fetch(:puma_role)) do |role|
10
-
11
- upload_compiled_template = lambda do |template_name, unit_filename|
12
- git_plugin.template_puma template_name, "#{fetch(:tmp_dir)}/#{unit_filename}", role
13
- systemd_path = fetch(:puma_systemd_conf_dir, git_plugin.fetch_systemd_unit_path)
14
- if fetch(:puma_systemctl_user) == :system
15
- sudo "mv #{fetch(:tmp_dir)}/#{unit_filename} #{systemd_path}"
16
- else
17
- execute :mkdir, "-p", systemd_path
18
- execute :mv, "#{fetch(:tmp_dir)}/#{unit_filename}", "#{systemd_path}"
19
- end
6
+ desc 'Install Puma systemd service'
7
+ task :install do
8
+ on roles(fetch(:puma_role)) do |role|
9
+
10
+ upload_compiled_template = lambda do |template_name, unit_filename|
11
+ git_plugin.template_puma template_name, "#{fetch(:tmp_dir)}/#{unit_filename}", role
12
+ systemd_path = fetch(:puma_systemd_conf_dir, git_plugin.fetch_systemd_unit_path)
13
+ if fetch(:puma_systemctl_user) == :system
14
+ sudo "mv #{fetch(:tmp_dir)}/#{unit_filename} #{systemd_path}"
15
+ else
16
+ execute :mkdir, "-p", systemd_path
17
+ execute :mv, "#{fetch(:tmp_dir)}/#{unit_filename}", "#{systemd_path}"
20
18
  end
19
+ end
21
20
 
22
- upload_compiled_template.call("puma.service", "#{fetch(:puma_service_unit_name)}.service")
23
-
24
- if fetch(:puma_enable_socket_service)
25
- upload_compiled_template.call("puma.socket", "#{fetch(:puma_service_unit_name)}.socket")
26
- end
21
+ upload_compiled_template.call("puma.service", "#{fetch(:puma_service_unit_name)}.service")
27
22
 
28
- # Reload systemd
29
- git_plugin.execute_systemd("daemon-reload")
23
+ if fetch(:puma_enable_socket_service)
24
+ upload_compiled_template.call("puma.socket", "#{fetch(:puma_service_unit_name)}.socket")
30
25
  end
31
- end
32
26
 
33
- desc 'Generate service configuration locally'
34
- task :generate_config_locally do
35
- fake_role = Struct.new(:hostname)
36
- run_locally do
37
- File.write('puma.service', git_plugin.compiled_template_puma("puma.service", fake_role.new("example.com")).string)
38
- if fetch(:puma_enable_socket_service)
39
- File.write('puma.socket', git_plugin.compiled_template_puma("puma.socket", fake_role.new("example.com")).string)
40
- end
41
- end
27
+ # Reload systemd
28
+ git_plugin.execute_systemd("daemon-reload")
29
+ invoke "puma:enable"
42
30
  end
31
+ end
43
32
 
44
- desc 'Enable Puma systemd service'
45
- task :enable do
46
- on roles(fetch(:puma_role)) do
47
- git_plugin.execute_systemd("enable", fetch(:puma_service_unit_name))
48
- git_plugin.execute_systemd("enable", fetch(:puma_service_unit_name) + ".socket") if fetch(:puma_enable_socket_service)
49
-
50
- if fetch(:puma_systemctl_user) != :system && fetch(:puma_enable_lingering)
51
- execute :loginctl, "enable-linger", fetch(:puma_lingering_user)
52
- end
33
+ desc 'Uninstall Puma systemd service'
34
+ task :uninstall do
35
+ invoke 'puma:disable'
36
+ on roles(fetch(:puma_role)) do |role|
37
+ systemd_path = fetch(:puma_systemd_conf_dir, git_plugin.fetch_systemd_unit_path)
38
+ if fetch(:puma_systemctl_user) == :system
39
+ sudo "rm -f #{systemd_path}/#{fetch(:puma_service_unit_name)}*"
40
+ else
41
+ execute :rm, "-f", "#{systemd_path}/#{fetch(:puma_service_unit_name)}*"
53
42
  end
43
+ git_plugin.execute_systemd("daemon-reload")
54
44
  end
55
45
 
56
- desc 'Disable Puma systemd service'
57
- task :disable do
58
- on roles(fetch(:puma_role)) do
59
- git_plugin.execute_systemd("disable", fetch(:puma_service_unit_name))
60
- git_plugin.execute_systemd("disable", fetch(:puma_service_unit_name) + ".socket") if fetch(:puma_enable_socket_service)
61
- end
62
- end
46
+ end
63
47
 
64
- desc 'Stop Puma socket via systemd'
65
- task :stop_socket do
66
- on roles(fetch(:puma_role)) do
67
- git_plugin.execute_systemd("stop", fetch(:puma_service_unit_name) + ".socket")
48
+ desc 'Enable Puma systemd service'
49
+ task :enable do
50
+ on roles(fetch(:puma_role)) do
51
+ git_plugin.execute_systemd("enable", fetch(:puma_service_unit_name))
52
+ git_plugin.execute_systemd("enable", fetch(:puma_service_unit_name) + ".socket") if fetch(:puma_enable_socket_service)
53
+
54
+ if fetch(:puma_systemctl_user) != :system && fetch(:puma_enable_lingering)
55
+ execute :loginctl, "enable-linger", fetch(:puma_lingering_user)
68
56
  end
69
57
  end
58
+ end
70
59
 
71
- desc 'Restart Puma socket via systemd'
72
- task :restart_socket do
73
- on roles(fetch(:puma_role)) do
74
- git_plugin.execute_systemd("restart", fetch(:puma_service_unit_name) + ".socket")
75
- end
60
+ desc 'Disable Puma systemd service'
61
+ task :disable do
62
+ on roles(fetch(:puma_role)) do
63
+ git_plugin.execute_systemd("disable", fetch(:puma_service_unit_name))
64
+ git_plugin.execute_systemd("disable", fetch(:puma_service_unit_name) + ".socket") if fetch(:puma_enable_socket_service)
76
65
  end
77
66
  end
78
67
 
@@ -90,6 +79,13 @@ namespace :puma do
90
79
  end
91
80
  end
92
81
 
82
+ desc 'Stop Puma socket via systemd'
83
+ task :stop_socket do
84
+ on roles(fetch(:puma_role)) do
85
+ git_plugin.execute_systemd("stop", fetch(:puma_service_unit_name) + ".socket")
86
+ end
87
+ end
88
+
93
89
  desc 'Restarts or reloads Puma service via systemd'
94
90
  task :smart_restart do
95
91
  if fetch(:puma_phased_restart)
@@ -106,16 +102,23 @@ namespace :puma do
106
102
  end
107
103
  end
108
104
 
105
+ desc 'Restart Puma socket via systemd'
106
+ task :restart_socket do
107
+ on roles(fetch(:puma_role)) do
108
+ git_plugin.execute_systemd("restart", fetch(:puma_service_unit_name) + ".socket")
109
+ end
110
+ end
111
+
109
112
  desc 'Reload Puma service via systemd'
110
113
  task :reload do
111
114
  on roles(fetch(:puma_role)) do
112
115
  service_ok = if fetch(:puma_systemctl_user) == :system
113
- execute("#{fetch(:puma_systemctl_bin)} status #{fetch(:puma_service_unit_name)} > /dev/null", raise_on_non_zero_exit: false)
114
- else
115
- execute("#{fetch(:puma_systemctl_bin)} --user status #{fetch(:puma_service_unit_name)} > /dev/null", raise_on_non_zero_exit: false)
116
- end
116
+ execute("#{fetch(:puma_systemctl_bin)} status #{fetch(:puma_service_unit_name)} > /dev/null", raise_on_non_zero_exit: false)
117
+ else
118
+ execute("#{fetch(:puma_systemctl_bin)} --user status #{fetch(:puma_service_unit_name)} > /dev/null", raise_on_non_zero_exit: false)
119
+ end
117
120
  cmd = 'reload'
118
- if !service_ok
121
+ unless service_ok
119
122
  cmd = 'restart'
120
123
  end
121
124
  if fetch(:puma_systemctl_user) == :system
@@ -1,28 +1,40 @@
1
+ # This file tells systemd how to run Puma as a 24/7 long-running daemon.
2
+ #
3
+ # Customize this file based on your bundler location, app directory, etc.
4
+ # Customize and copy this into /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu).
5
+ # Then run:
6
+ # - systemctl enable <%= fetch(:puma_service_unit_name) %>
7
+ # - systemctl {start,stop,restart} <%= fetch(:puma_service_unit_name) %>
8
+ #
9
+ #
10
+ # Use `journalctl -u <%= fetch(:puma_service_unit_name) %> -rn 100` to view the last 100 lines of log output.
11
+ #
1
12
  [Unit]
2
13
  Description=Puma HTTP Server for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
3
- After=network.target
4
14
  <%= "Requires=#{fetch(:puma_service_unit_name)}.socket" if fetch(:puma_enable_socket_service) %>
15
+ After=syslog.target network.target
5
16
 
6
17
  [Service]
7
- Type=simple
18
+ Type=<%= service_unit_type %>
19
+ WatchdogSec=10
8
20
  <%="User=#{puma_user(@role)}" if fetch(:puma_systemctl_user) == :system %>
9
21
  WorkingDirectory=<%= current_path %>
10
- # Support older bundler versions where file descriptors weren't kept
11
- # See https://github.com/rubygems/rubygems/issues/3254
12
- ExecStart=<%= expanded_bundle_command %> exec --keep-file-descriptors puma -C <%= fetch(:puma_conf) %>
22
+ ExecStart=<%= expanded_bundle_command %> exec puma -e <%= fetch(:puma_env) %>
13
23
  ExecReload=/bin/kill -USR1 $MAINPID
14
- StandardOutput=append:<%= fetch(:puma_access_log) %>
15
- StandardError=append:<%= fetch(:puma_error_log) %>
16
- <%="EnvironmentFile=#{fetch(:puma_service_unit_env_file)}" if fetch(:puma_service_unit_env_file) %>
24
+ <%- Array(fetch(:puma_service_unit_env_files)).each do |file| %>
25
+ <%="EnvironmentFile=#{file}" -%>
26
+ <% end -%>
27
+ <% Array(fetch(:puma_service_unit_env_vars)).each do |environment_variable| %>
28
+ <%="Environment=\"#{environment_variable}\"" -%>
29
+ <% end -%>
17
30
 
18
- <% fetch(:puma_service_unit_env_vars, []).each do |environment_variable| %>
19
- <%="Environment=#{environment_variable}" %>
20
- <% end %>
21
-
22
- Restart=always
31
+ # if we crash, restart
23
32
  RestartSec=1
33
+ Restart=on-failure
24
34
 
25
- SyslogIdentifier=puma
35
+ <%="StandardOutput=append:#{fetch(:puma_access_log)}" if fetch(:puma_access_log) %>
36
+ <%="StandardError=append:#{fetch(:puma_error_log)}" if fetch(:puma_error_log) %>
26
37
 
38
+ SyslogIdentifier=<%= fetch(:puma_service_unit_name) %>
27
39
  [Install]
28
40
  WantedBy=<%=(fetch(:puma_systemctl_user) == :system) ? "multi-user.target" : "default.target"%>
@@ -9,7 +9,6 @@ module Capistrano
9
9
  :banner => "path to templates"
10
10
 
11
11
  def copy_template
12
- copy_file "../../../../capistrano/templates/puma.rb.erb", "#{templates_path}/puma.rb.erb"
13
12
  copy_file "../../../../capistrano/templates/nginx_conf.erb", "#{templates_path}/nginx_conf.erb"
14
13
  # copy_file "puma.rb.erb", "#{templates_path}/puma.rb.erb"
15
14
  # copy_file "puma_init.erb", "#{templates_path}/puma_init.erb"