procsd 0.5.4 → 0.5.5

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: '09e6c1faceca84dc0337311001b11397aa338b25bc285960175e4537d3a38f71'
4
- data.tar.gz: e1fc39db9a119b15d2042558b093ec222aed03baa67d75f824c3da8b99464e72
3
+ metadata.gz: 595c0d49250c7eb5075f7c01b7e6f28814bdc319cca686ad0ee0b5a5cea09c28
4
+ data.tar.gz: de7f7d1df76a9ec2cfdb7c55a90ca87c89fcb387afb28addd52734f42bcf2193
5
5
  SHA512:
6
- metadata.gz: d321a3cb39f9a5c442a6c088682b020fafa6fc59e6f03b892bd438df4a10b0fcc3490e5651e20eb060e920de22b7364425da07368f73305b089d63a791f4246c
7
- data.tar.gz: ce218eae99a2bd36cbc771e3ba199e0ac9b68cb8736202f0ec171c74f36cef22bca84d89f7704d356c2ee29fb9cb2d7ac935e98cf76079500bd8ed6799067033
6
+ metadata.gz: c410272886ffe376089154a6499ccb9da9634732b01b8c84c45627e6a3c5ff73b47106c6680095a3529f01d3f94ab928828c882a50b8f39e5164004063c14bae
7
+ data.tar.gz: 6d9d84f9fd041b28a543dad0d458a5feed9ac0867062a82cd2af7926adda5d2e91be0162f972154b87cbb51442f1c49aadfb76dee30932406e593648568e0207
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
1
  # CHANGELOG
2
+ ## 0.5.5
3
+ * Add: Allow to start/stop/restart particular service in the app target (example: `$ procsd start web`)
4
+ * Add: RuntimeMaxSec option for process
5
+
2
6
  ## 0.5.4
3
7
  * Add: information how to use SSL integration with Cloudflare CDN enabled
4
8
  * Add: procsd config certbot_command command
data/README.md CHANGED
@@ -70,13 +70,14 @@ You can provide additional options for `create` command:
70
70
  ### Start application
71
71
  > Other control commands: `stop` and `restart`
72
72
 
73
+ > You can start/stop/restart a particular process by providing it's name, i.e.: `$ procsd restart worker`
74
+
73
75
  ```
74
76
  deploy@server:~/sample_app$ procsd start
75
77
 
76
78
  Started app services (sample_app.target)
77
79
  ```
78
80
 
79
-
80
81
  ### Check the status
81
82
  > You can filter processes, like `$ procsd status worker` (show status only for worker processes) or `$ procsd status worker.2` (show status only for worker.2 process)
82
83
 
@@ -320,7 +321,7 @@ Everything is done. Start app services (`procsd start`) and go to `http://my-dom
320
321
 
321
322
  #### Auto SSL using Certbot
322
323
 
323
- To generate Nginx config with free SSL certificate (from [Let’s Encrypt](https://letsencrypt.org/)) included, you need to install [Certbot](https://certbot.eff.org/) on the remote server first:
324
+ To generate Nginx config with free SSL certificate (from [Let’s Encrypt](https://letsencrypt.org/)) included, you need to install [Certbot](https://certbot.eff.org/) on the remote server first. For Ubuntu 18.04 (check here instructions for other versions https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx):
324
325
 
325
326
  ```bash
326
327
  $ sudo apt install software-properties-common
@@ -519,9 +520,9 @@ Execute: journalctl --no-pager --no-hostname --all --output short-iso -n 3 --uni
519
520
 
520
521
  * You can use extended format of processes commands inside `procsd.yml` to provide additional restart/stop commands for each process:
521
522
 
522
- > All possible options: `ExecStart`, `ExecReload` and `ExecStop`
523
+ > All possible options: [ExecStart](https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=) (default command to start a process), [ExecReload](https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecReload=), and [ExecStop](https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStop=).
523
524
 
524
- > If procsd.yml has `processes:` option defined, then content of Procfile will be ignored
525
+ > If procsd.yml has `processes:` option defined, then content of Procfile (if it exists) will be ignored.
525
526
 
526
527
  ```yml
527
528
  app: sample_app
@@ -534,6 +535,18 @@ processes:
534
535
 
535
536
  Why? For example default Ruby on Rails application server [Puma](http://puma.io/) supports [Phased or Rolling restart](https://github.com/puma/puma/blob/master/docs/restart.md#normal-vs-hot-vs-phased-restart) feature. If you provide separate `ExecReload`command for a process, then this command will be called while executing `$ procsd restart` by systemd instead of just killing and starting process again.
536
537
 
538
+ * Another option you can provide for each process is [RuntimeMaxSec](https://www.freedesktop.org/software/systemd/man/systemd.service.html#RuntimeMaxSec=). It is used to automatically restart a process every N period of time. Could be useful for worker types of processes (like Sidekiq) where process memory could increase while running:
539
+
540
+ > Example values for RuntimeMaxSec: `30s` (30 seconds), `5m` (5 minutes), `3h` (3 hours), `1d` (1 day).
541
+
542
+ ```yml
543
+ app: sample_app
544
+ processes:
545
+ web:
546
+ ExecStart: bundle exec rails server -p $PORT
547
+ RuntimeMaxSec: 12h
548
+ ```
549
+
537
550
  * If you use Nginx integration but default Nginx requests timeout (60s) is too small for you, [you can set a custom timeout](https://serverfault.com/a/777753) in the global Nginx config.
538
551
 
539
552
 
data/lib/procsd/cli.rb CHANGED
@@ -105,44 +105,67 @@ module Procsd
105
105
  end
106
106
 
107
107
  desc "start", "Start app services"
108
- def start
108
+ def start(service_name = nil)
109
109
  preload!
110
110
  say_target_not_exists and return unless target_exist?
111
111
 
112
- say "Note: app target #{target_name} already started/active" if target_active?
113
- if execute %W(sudo systemctl start #{target_name})
114
- say("Started app services (#{target_name})", :green)
112
+ if service_name
113
+ full_name = to_full_name(service_name)
114
+ say "Note: app service #{full_name} already started/active" if service_active?(full_name)
115
+ if execute %W(sudo systemctl start #{full_name} --all)
116
+ say("Started app service (#{full_name})", :green)
117
+ end
118
+ else
119
+ say "Note: app target #{target_name} already started/active" if target_active?
120
+ if execute %W(sudo systemctl start #{target_name})
121
+ say("Started app services (#{target_name})", :green)
122
+ end
115
123
  end
116
124
  end
117
125
 
118
126
  desc "stop", "Stop app services"
119
- def stop
127
+ def stop(service_name = nil)
120
128
  preload!
121
129
  say_target_not_exists and return unless target_exist?
122
130
 
123
- say "Note: app target #{target_name} already stopped/inactive" if !target_active?
124
- if execute %W(sudo systemctl stop #{target_name})
125
- say("Stopped app services (#{target_name})", :green)
131
+ if service_name
132
+ full_name = to_full_name(service_name)
133
+ say "Note: app service #{full_name} already stopped/inactive" if !service_active?(full_name)
134
+ if execute %W(sudo systemctl stop #{full_name} --all)
135
+ say("Stopped app service (#{full_name})", :green)
136
+ end
137
+ else
138
+ say "Note: app target #{target_name} already stopped/inactive" if !target_active?
139
+ if execute %W(sudo systemctl stop #{target_name})
140
+ say("Stopped app services (#{target_name})", :green)
141
+ end
126
142
  end
127
143
  end
128
144
 
129
145
  desc "restart", "Restart app services"
130
- def restart
146
+ def restart(service_name = nil)
131
147
  preload!
132
148
  say_target_not_exists and return unless target_exist?
133
149
 
134
- # If one of the child services of a target has `ExecReload` and `ReloadPropagatedFrom`
135
- # options defined, then use `reload-or-restart` to call all services (not the main target)
136
- # because of systemd bug https://github.com/systemd/systemd/issues/10638
137
- success =
138
- if has_reload?
139
- execute %W(sudo systemctl reload-or-restart #{app_name}-* --all)
140
- else
141
- execute %W(sudo systemctl restart #{target_name})
150
+ if service_name
151
+ full_name = to_full_name(service_name)
152
+ if execute %W(sudo systemctl reload-or-restart #{full_name} --all)
153
+ say("Restarted app service (#{full_name})", :green)
142
154
  end
155
+ else
156
+ # If one of the child services of a target has `ExecReload` and `ReloadPropagatedFrom`
157
+ # options defined, then use `reload-or-restart` to call all services (not the main target)
158
+ # because of systemd bug https://github.com/systemd/systemd/issues/10638
159
+ success =
160
+ if has_reload?
161
+ execute %W(sudo systemctl reload-or-restart #{app_name}-* --all)
162
+ else
163
+ execute %W(sudo systemctl restart #{target_name})
164
+ end
143
165
 
144
- if success
145
- say("Restarted app services (#{target_name})", :green)
166
+ if success
167
+ say("Restarted app services (#{target_name})", :green)
168
+ end
146
169
  end
147
170
  end
148
171
 
@@ -159,7 +182,7 @@ module Procsd
159
182
  command = %w(systemctl status --no-pager --output short-iso --all)
160
183
  end
161
184
 
162
- command << (options["target"] ? target_name : "#{app_name}-#{service_name}*")
185
+ command << (options["target"] ? target_name : to_full_name(service_name))
163
186
  execute command, type: :exec
164
187
  end
165
188
 
@@ -376,10 +399,18 @@ module Procsd
376
399
  system "systemctl", "is-active", "--quiet", target_name
377
400
  end
378
401
 
402
+ def service_active?(service_name)
403
+ system "systemctl", "is-active", "--quiet", service_name
404
+ end
405
+
379
406
  def target_name
380
407
  "#{app_name}.target"
381
408
  end
382
409
 
410
+ def to_full_name(service_name)
411
+ "#{app_name}-#{service_name}*"
412
+ end
413
+
383
414
  def app_name
384
415
  @config[:app]
385
416
  end
@@ -18,6 +18,10 @@ ExecStop=/bin/bash -lc '<%= stop %>'
18
18
  ExecReload=/bin/bash -lc '<%= reload %>'
19
19
  <% end -%>
20
20
 
21
+ <% if max_sec = config["commands"]["RuntimeMaxSec"] -%>
22
+ RuntimeMaxSec=<%= max_sec %>
23
+ <% end -%>
24
+
21
25
  Restart=always
22
26
  RestartSec=1
23
27
  TimeoutStopSec=30
@@ -1,3 +1,3 @@
1
1
  module Procsd
2
- VERSION = "0.5.4"
2
+ VERSION = "0.5.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Afanasev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-12 00:00:00.000000000 Z
11
+ date: 2021-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor