-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathfile.systemd.html
309 lines (239 loc) · 23.6 KB
/
file.systemd.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no'>
<meta name='apple-touch-fullscreen' content='yes'>
<meta name='apple-mobile-web-app-capable' content='yes'>
<meta name='apple-mobile-web-app-status-bar-style' content='rgba(228,228,228,1.0)'>
<title>File: systemd — Puma master</title>
<link rel='stylesheet' type='text/css' href='../css/y_fonts.css' />
<link rel='stylesheet' type='text/css' href='../css/highlight.github.css' />
<link rel='stylesheet' type='text/css' href='../css/y_style.css' />
<link rel='stylesheet' type='text/css' href='../css/y_list.css' />
<link rel='stylesheet' type='text/css' href='../css/y_color.css' />
<script type='text/javascript'>
var pathId = "systemd",
relpath = '';
var t2Info = {
CSEP: '.',
ISEP: '#',
NSEP: '::'
};
</script>
<script type='text/javascript' charset='utf-8' src='../js/highlight.pack.js'></script>
<script type='text/javascript' charset='utf-8' src='../js/y_app.js'></script>
</head>
<body>
<svg id='y_wait' class viewBox='0 0 90 90'></svg>
<div id='settings' class='hidden'></div>
<div id='y_list' class='d h'>
<header id='list_header'></header>
<nav id= 'list_nav' class='y_nav l_nav'>
<ul id='list_items'></ul>
</nav>
</div>
<div id='y_toc' class='f h'>
<header id='toc_header'></header>
<nav id= 'toc_nav' class='y_nav t_nav'>
<ol id='toc_items'></ol>
</nav>
</div>
<div id='y_main' tabindex='-1'>
<header id='y_header'>
<div id='y_menu'>
<a id='home_no_xhr' href='/'>Home</a> »
<a href='.'>Puma master</a> »
<a href='_index.html'>Index</a> »
<span class='title'><a id='t2_doc_top' href='#'>File: systemd ▲</a></span>
</div>
<a id='list_href' href="class_list.html"></a>
<div id='y_measure_em' class='y_measure'></div>
<div id='y_measure_vh' class='y_measure'></div>
<span id='y_measure_50pre' class='y_measure'><code>123456789_123456789_123456789_123456789_123456789_</code></span>
</header>
<div id='content' class='file'>
<h1>systemd</h1>
<p><a href="https://www.freedesktop.org/wiki/Software/systemd/">systemd</a> is a commonly
available init system (PID 1) on many Linux distributions. It offers process
monitoring (including automatic restarts) and other useful features for running
<a href="Puma.html" title="Puma (module)"><code>Puma</code></a> in production.</p>
<h2>Service Configuration</h2>
<p>Below is a sample puma.service configuration file for systemd, which can be
copied or symlinked to <code>/etc/systemd/system/puma.service</code>, or if desired, using
an application or instance-specific name.</p>
<p>Note that this uses the systemd preferred "simple" type where the start command
remains running in the foreground (does not fork and exit).</p>
<pre class="code ini"><code class="ini">[Unit]
Description=Puma HTTP Server
After=network.target
# Uncomment for socket activation (see below)
# Requires=puma.socket
[Service]
# {Puma} supports systemd's {Type=notify} and watchdog service
# monitoring, as of {Puma} 5.1 or later.
# On earlier versions of {Puma} or JRuby, change this to {Type=simple} and remove
# the {WatchdogSec} line.
Type=notify
# If your {Puma} process locks up, systemd's watchdog will restart it within seconds.
WatchdogSec=10
# Preferably configure a non-privileged user
# User=
# The path to your application code root directory.
# Also replace the "<YOUR_APP_PATH>" placeholders below with this path.
# Example /home/username/myapp
WorkingDirectory=<YOUR_APP_PATH>
# Helpful for debugging socket activation, etc.
# Environment=PUMA_DEBUG=1
# SystemD will not run puma even if it is in your path. You must specify
# an absolute URL to puma. For example /usr/local/bin/puma
# Alternatively, create a binstub with `bundle binstubs puma --path ./sbin` in the WorkingDirectory
ExecStart=/<FULLPATH>/bin/puma -C <YOUR_APP_PATH>/puma.rb
# Variant: Rails start.
# ExecStart=/<FULLPATH>/bin/puma -C <YOUR_APP_PATH>/config/puma.rb ../config.ru
# Variant: Use `bundle exec puma` instead of binstub
# Variant: Specify directives inline.
# ExecStart=/<FULLPATH>/puma -b tcp://0.0.0.0:9292 -b ssl://0.0.0.0:9293?key=key.pem&cert=cert.pem
Restart=always
[Install]
WantedBy=multi-user.target
</code></pre>
<p>See
<a href="https://www.freedesktop.org/software/systemd/man/systemd.exec.html">systemd.exec</a>
for additional details.</p>
<h2>Socket Activation</h2>
<p>systemd and <a href="Puma.html" title="Puma (module)"><code>Puma</code></a> also support socket activation, where systemd opens the
listening socket(s) in advance and provides them to the <a href="Puma.html" title="Puma (module)"><code>Puma</code></a> master process on
startup. Among other advantages, this keeps listening sockets open across puma
restarts and achieves graceful restarts, including when upgraded <a href="Puma.html" title="Puma (module)"><code>Puma</code></a>, and is
compatible with both clustered mode and application preload.</p>
<p><strong>Note:</strong> Any wrapper scripts which <code>exec</code>, or other indirections in <code>ExecStart</code>
may result in activated socket file descriptors being closed before reaching the
puma master process.</p>
<p><strong>Note:</strong> Socket activation doesn't currently work on JRuby. This is tracked in
<a href="https://github.com/puma/puma/issues/1367">#1367</a>.</p>
<p>Configure one or more <code>ListenStream</code> sockets in a companion <code>*.socket</code> unit file
to use socket activation. Also, uncomment the associated <code>Requires</code> directive
for the socket unit in the service file (see above.) Here is a sample
puma.socket, matching the ports used in the above puma.service:</p>
<pre class="code ini"><code class="ini">[Unit]
Description=Puma HTTP Server Accept Sockets
[Socket]
ListenStream=0.0.0.0:9292
ListenStream=0.0.0.0:9293
# AF_UNIX domain socket
# SocketUser, SocketGroup, etc. may be needed for Unix domain sockets
# ListenStream=/run/puma.sock
# Socket options matching {Puma} defaults
ReusePort=true
Backlog=1024
# Enable this if you're using {Puma} with the "low_latency" option, read more in {Puma} DSL docs and systemd docs:
# https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html#NoDelay=
# NoDelay=true
[Install]
WantedBy=sockets.target
</code></pre>
<p>See
<a href="https://www.freedesktop.org/software/systemd/man/systemd.socket.html">systemd.socket</a>
for additional configuration details.</p>
<p>Note that the above configurations will work with <a href="Puma.html" title="Puma (module)"><code>Puma</code></a> in either single process
or cluster mode.</p>
<h3>Sockets and symlinks</h3>
<p>When using releases folders, you should set the socket path using the shared
folder path (ex. <code>/srv/projet/shared/tmp/puma.sock</code>), not the release folder
path (<code>/srv/projet/releases/1234/tmp/puma.sock</code>).</p>
<p><a href="Puma.html" title="Puma (module)"><code>Puma</code></a> will detect the release path socket as different than the one provided by
systemd and attempt to bind it again, resulting in the exception <code>There is
already a server bound to:</code>.</p>
<h3>Binding</h3>
<p>By default, you need to configure <a href="Puma.html" title="Puma (module)"><code>Puma</code></a> to have binds matching with all
ListenStream statements. Any mismatched systemd ListenStreams will be closed by
<a href="Puma.html" title="Puma (module)"><code>Puma</code></a>.</p>
<p>To automatically bind to all activated sockets, the option
<code>--bind-to-activated-sockets</code> can be used. This matches the config DSL
<code>bind_to_activated_sockets</code> statement. This will cause <a href="Puma.html" title="Puma (module)"><code>Puma</code></a> to create a bind
automatically for any activated socket. When systemd socket activation is not
enabled, this option does nothing.</p>
<p>This also accepts an optional argument <code>only</code> (DSL: <code>'only'</code>) to discard any
binds that's not socket activated.</p>
<h2>Usage</h2>
<p>Without socket activation, use <code>systemctl</code> as root (i.e., via <code>sudo</code>) as with
other system services:</p>
<pre class="code sh"><code class="sh"># After installing or making changes to puma.service
systemctl daemon-reload
# Enable so it starts on boot
systemctl enable puma.service
# Initial startup.
systemctl start puma.service
# Check status
systemctl status puma.service
# A normal restart. Warning: listener's sockets will be closed
# while a new puma process initializes.
systemctl restart puma.service
</code></pre>
<p>With socket activation, several but not all of these commands should be run for
both socket and service:</p>
<pre class="code sh"><code class="sh"># After installing or making changes to either puma.socket or
# puma.service.
systemctl daemon-reload
# Enable both socket and service, so they start on boot. Alternatively
# you could leave puma.service disabled, and systemd will start it on
# the first use (with startup lag on the first request)
systemctl enable puma.socket puma.service
# Initial startup. The Requires directive (see above) ensures the
# socket is started before the service.
systemctl start puma.socket puma.service
# Check the status of both socket and service.
systemctl status puma.socket puma.service
# A "hot" restart, with systemd keeping puma.socket listening and
# providing to the new puma (master) instance.
systemctl restart puma.service
# A normal restart, needed to handle changes to
# puma.socket, such as changing the ListenStream ports. Note
# daemon-reload (above) should be run first.
systemctl restart puma.socket puma.service
</code></pre>
<p>Here is sample output from <code>systemctl status</code> with both service and socket
running:</p>
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_●'>●</span> <span class='id identifier rubyid_puma'>puma</span>.<span class='id identifier rubyid_socket'>socket</span> <span class='op'>-</span> {<span class='const'><a href="Puma.html" title="Puma (module)">Puma</a></span>} <span class='const'>HTTP</span> <span class='const'><a href="Puma/Server.html" title="Puma::Server (class)">Server</a></span> <span class='const'>Accept</span> <span class='const'>Sockets</span>
<span class='const'>Loaded</span><span class='op'>:</span> <span class='id identifier rubyid_loaded'>loaded</span> (<span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>etc</span><span class='regexp_end'>/systemd</span></span><span class='op'>/</span><span class='id identifier rubyid_system'>system</span><span class='op'>/</span><span class='id identifier rubyid_puma'>puma</span>.<span class='id identifier rubyid_socket'>socket</span><span class='semicolon'>;</span> <span class='id identifier rubyid_enabled'>enabled</span><span class='semicolon'>;</span> <span class='id identifier rubyid_vendor'>vendor</span> <span class='label'>preset:</span> <span class='id identifier rubyid_enabled'>enabled</span>)
<span class='const'>Active</span><span class='op'>:</span> <span class='id identifier rubyid_active'>active</span> (<span class='id identifier rubyid_running'>running</span>) <span class='id identifier rubyid_since'>since</span> <span class='const'>Thu</span> <span class='int'>2016</span><span class='op'>-</span><span class='int'>04</span><span class='op'>-</span><span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='const'>PDT</span><span class='semicolon'>;</span> <span class='int'>1</span><span class='id identifier rubyid_h'>h</span> <span class='int'>2</span><span class='id identifier rubyid_min'>min</span> <span class='id identifier rubyid_ago'>ago</span>
<span class='const'>Listen</span><span class='op'>:</span> <span class='float'>0.0</span><span class='op'>:</span><span class='int'>9233</span> (<span class='const'>Stream</span>)
<span class='float'>0.0</span><span class='op'>:</span><span class='int'>9234</span> (<span class='const'>Stream</span>)
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_systemd'>systemd</span>[<span class='int'>874</span>]<span class='op'>:</span> <span class='const'>Listening</span> <span class='id identifier rubyid_on'>on</span> {<span class='const'><a href="Puma.html" title="Puma (module)">Puma</a></span>} <span class='const'>HTTP</span> <span class='const'><a href="Puma/Server.html" title="Puma::Server (class)">Server</a></span> <span class='const'>Accept</span> <span class='const'>Sockets</span>.
<span class='id identifier rubyid_●'>●</span> <span class='id identifier rubyid_puma'>puma</span>.<span class='id identifier rubyid_service'>service</span> <span class='op'>-</span> {<span class='const'><a href="Puma.html" title="Puma (module)">Puma</a></span>} <span class='const'>HTTP</span> <span class='const'><a href="Puma/Server.html" title="Puma::Server (class)">Server</a></span>
<span class='const'>Loaded</span><span class='op'>:</span> <span class='id identifier rubyid_loaded'>loaded</span> (<span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>etc</span><span class='regexp_end'>/systemd</span></span><span class='op'>/</span><span class='id identifier rubyid_system'>system</span><span class='op'>/</span><span class='id identifier rubyid_puma'>puma</span>.<span class='id identifier rubyid_service'>service</span><span class='semicolon'>;</span> <span class='id identifier rubyid_enabled'>enabled</span><span class='semicolon'>;</span> <span class='id identifier rubyid_vendor'>vendor</span> <span class='label'>preset:</span> <span class='id identifier rubyid_enabled'>enabled</span>)
<span class='const'>Active</span><span class='op'>:</span> <span class='id identifier rubyid_active'>active</span> (<span class='id identifier rubyid_running'>running</span>) <span class='id identifier rubyid_since'>since</span> <span class='const'>Thu</span> <span class='int'>2016</span><span class='op'>-</span><span class='int'>04</span><span class='op'>-</span><span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='const'>PDT</span><span class='semicolon'>;</span> <span class='int'>1</span><span class='id identifier rubyid_h'>h</span> <span class='int'>2</span><span class='id identifier rubyid_min'>min</span> <span class='id identifier rubyid_ago'>ago</span>
<span class='const'>Main</span> <span class='label'>PID:</span> <span class='int'>28320</span> (<span class='id identifier rubyid_ruby'>ruby</span>)
<span class='const'>CGroup</span><span class='op'>:</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>system.slice</span><span class='regexp_end'>/puma</span></span>.<span class='id identifier rubyid_service'>service</span>
<span class='id identifier rubyid_├─28320'>├─28320</span> <span class='id identifier rubyid_puma'>puma</span> <span class='float'>3.3</span> (<span class='id identifier rubyid_tcp'>tcp</span><span class='symbeg'>:</span><span class='op'>/</span><span class='op'>/</span><span class='float'>0.0</span><span class='op'>:</span><span class='int'>9233</span><span class='comma'>,</span><span class='id identifier rubyid_ssl'>ssl</span><span class='symbeg'>:</span><span class='op'>/</span><span class='op'>/</span><span class='float'>0.0</span><span class='op'>:</span><span class='int'>9234</span><span class='op'>?</span><span class='id identifier rubyid_key'>key</span><span class='op'>=</span><span class='id identifier rubyid_key'>key</span>.<span class='id identifier rubyid_pem'>pem</span><span class='op'>&</span><span class='id identifier rubyid_cert'>cert</span><span class='op'>=</span><span class='id identifier rubyid_cert'>cert</span>.<span class='id identifier rubyid_pem'>pem</span>) [<span class='id identifier rubyid_app'>app</span>]
<span class='id identifier rubyid_├─28323'>├─28323</span> <span class='label'>puma:</span> <span class='id identifier rubyid_cluster'>cluster</span> <span class='id identifier rubyid_worker'>worker</span> <span class='int'>0</span><span class='op'>:</span> <span class='int'>28320</span> [<span class='id identifier rubyid_app'>app</span>]
<span class='id identifier rubyid_└─28327'>└─28327</span> <span class='label'>puma:</span> <span class='id identifier rubyid_cluster'>cluster</span> <span class='id identifier rubyid_worker'>worker</span> <span class='int'>1</span><span class='op'>:</span> <span class='int'>28320</span> [<span class='id identifier rubyid_app'>app</span>]
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> {<span class='const'><a href="Puma.html" title="Puma (module)">Puma</a></span>} <span class='id identifier rubyid_starting'>starting</span> <span class='kw'>in</span> <span class='id identifier rubyid_cluster'>cluster</span> <span class='id identifier rubyid_mode'>mode</span><span class='op'>...</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='op'>:</span><span class='int'>40</span><span class='op'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Version</span> <span class='float'>3.3</span> (<span class='id identifier rubyid_ruby'>ruby</span> <span class='float'>2.2</span><span class='op'>-</span><span class='id identifier rubyid_p230'>p230</span>)<span class='comma'>,</span> <span class='id identifier rubyid_codename'>codename</span><span class='op'>:</span> <span class='const'>Jovial</span> <span class='const'>Platypus</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Min</span> <span class='label'>threads:</span> <span class='int'>0</span><span class='comma'>,</span> <span class='id identifier rubyid_max'>max</span> <span class='label'>threads:</span> <span class='int'>16</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Environment</span><span class='op'>:</span> <span class='id identifier rubyid_production'>production</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Process</span> <span class='label'>workers:</span> <span class='int'>2</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Phased</span> <span class='id identifier rubyid_restart'>restart</span> <span class='id identifier rubyid_available'>available</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Activated</span> <span class='label'>tcp:</span><span class='tstring'><span class='regexp_beg'>/</span><span class='regexp_end'>/</span></span><span class='float'>0.0</span><span class='op'>:</span><span class='int'>9233</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='op'>*</span> <span class='const'>Activated</span> <span class='label'>ssl:</span><span class='tstring'><span class='regexp_beg'>/</span><span class='regexp_end'>/</span></span><span class='float'>0.0</span><span class='op'>:</span><span class='int'>9234</span><span class='op'>?</span><span class='id identifier rubyid_key'>key</span><span class='op'>=</span><span class='id identifier rubyid_key'>key</span>.<span class='id identifier rubyid_pem'>pem</span><span class='op'>&</span><span class='id identifier rubyid_cert'>cert</span><span class='op'>=</span><span class='id identifier rubyid_cert'>cert</span>.<span class='id identifier rubyid_pem'>pem</span>
<span class='const'>Apr</span> <span class='int'>07</span> <span class='int'>08</span><span class='symbeg'>:</span><span class='int'>40</span><span class='symbeg'>:</span><span class='int'>19</span> <span class='id identifier rubyid_hx'>hx</span> <span class='id identifier rubyid_puma'>puma</span>[<span class='int'>28320</span>]<span class='op'>:</span> <span class='const'>Use</span> <span class='const'>Ctrl</span><span class='op'>-</span><span class='const'>C</span> <span class='id identifier rubyid_to'>to</span> <span class='id identifier rubyid_stop'>stop</span></code></pre>
<h3>capistrano3-puma</h3>
<p>By default, <a href="https://github.com/seuros/capistrano-puma">capistrano3-puma</a> uses
<code>pumactl</code> for deployment restarts outside of systemd. To learn the exact
commands that this tool would use for <code>ExecStart</code> and <code>ExecStop</code>, use the
following <code>cap</code> commands in dry-run mode, and update from the above forking
service configuration accordingly. Note also that the configured <code>User</code> should
likely be the same as the capistrano3-puma <code>:puma_user</code> option.</p>
<pre class="code sh"><code class="sh">stage=production # or different stage, as needed
cap $stage puma:start --dry-run
cap $stage puma:stop --dry-run
</code></pre>
<h3>Disabling Puma Systemd Integration</h3>
<p>If you would like to disable Puma's systemd integration, for example if you handle it elsewhere
in your code yourself, simply set the the environment variable <code>PUMA_SKIP_SYSTEMD</code> to any value.</p>
<div id='footer'></div>
</div> <!-- content -->
</div> <!-- y_main -->
</body>
</html>