dash 3.2.1 → 4.0.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 +4 -4
- data/lib/dash/cli/app/boot.rb +2 -2
- data/lib/dash/cli/app.rb +1 -1
- data/lib/dash/cli/base.rb +1 -1
- data/lib/dash/cli/doctor/endpoint_checks.rb +1 -1
- data/lib/dash/cli/doctor/host_checks.rb +29 -8
- data/lib/dash/cli/main.rb +5 -5
- data/lib/dash/cli/proxy/legacy_rename.rb +58 -0
- data/lib/dash/cli/proxy/loadbalancer_reboot.rb +1 -1
- data/lib/dash/cli/proxy/reboot.rb +8 -8
- data/lib/dash/cli/proxy.rb +14 -10
- data/lib/dash/commander.rb +1 -1
- data/lib/dash/commands/accessory/proxy.rb +1 -1
- data/lib/dash/commands/app/execution.rb +1 -1
- data/lib/dash/commands/app/proxy.rb +1 -1
- data/lib/dash/commands/app.rb +1 -1
- data/lib/dash/commands/docker.rb +35 -1
- data/lib/dash/commands/loadbalancer.rb +47 -17
- data/lib/dash/commands/lock.rb +1 -1
- data/lib/dash/commands/proxy/cert_transfer.rb +4 -4
- data/lib/dash/commands/proxy.rb +117 -15
- data/lib/dash/commands/prune.rb +1 -1
- data/lib/dash/configuration/accessory.rb +2 -2
- data/lib/dash/configuration/docs/accessory.yml +3 -3
- data/lib/dash/configuration/docs/configuration.yml +1 -1
- data/lib/dash/configuration/docs/proxy.yml +38 -38
- data/lib/dash/configuration/loadbalancer.rb +2 -2
- data/lib/dash/configuration/proxy/acme.rb +5 -5
- data/lib/dash/configuration/proxy/boot.rb +2 -4
- data/lib/dash/configuration/proxy/run.rb +10 -10
- data/lib/dash/configuration/proxy.rb +36 -14
- data/lib/dash/configuration/role.rb +2 -2
- data/lib/dash/configuration/validator/proxy.rb +23 -23
- data/lib/dash/configuration.rb +8 -8
- data/lib/dash/utils.rb +1 -1
- data/lib/dash/version.rb +1 -1
- metadata +2 -1
|
@@ -14,7 +14,7 @@ class Dash::Commands::Loadbalancer < Dash::Commands::Base
|
|
|
14
14
|
docker \
|
|
15
15
|
:run,
|
|
16
16
|
"--name", container_name,
|
|
17
|
-
"--network", "
|
|
17
|
+
"--network", "dash",
|
|
18
18
|
"--detach",
|
|
19
19
|
"--restart", "unless-stopped",
|
|
20
20
|
"--label", label,
|
|
@@ -38,28 +38,28 @@ class Dash::Commands::Loadbalancer < Dash::Commands::Base
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def deploy(targets: [])
|
|
41
|
-
docker :exec, container_name, "
|
|
41
|
+
docker :exec, container_name, "dash-proxy", "deploy", loadbalancer_config.config.service,
|
|
42
42
|
*loadbalancer_config.deploy_command_args(targets: targets)
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
# `retry` takes a host, or --all; the rest take no arguments.
|
|
46
46
|
def domains(subcommand, *args)
|
|
47
|
-
docker :exec, container_name, "
|
|
47
|
+
docker :exec, container_name, "dash-proxy", "domains", subcommand, *args
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
def list(json: false)
|
|
51
|
-
docker :exec, container_name, "
|
|
51
|
+
docker :exec, container_name, "dash-proxy", :list, *("--json" if json)
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
# Cache policy is edge-only under load balancing (see the layering contract),
|
|
55
55
|
# so the cache admin surface lives here - registered under the bare service
|
|
56
56
|
# name, unlike the per-role services on the proxy hosts.
|
|
57
57
|
def cache_stats(count: false, json: false)
|
|
58
|
-
docker :exec, container_name, "
|
|
58
|
+
docker :exec, container_name, "dash-proxy", :cache, :stats, *optionize({ count: count || nil, json: json || nil }.compact)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def cache_purge(service, path_prefix: nil)
|
|
62
|
-
docker :exec, container_name, "
|
|
62
|
+
docker :exec, container_name, "dash-proxy", :cache, :purge, service, *optionize({ "path-prefix": path_prefix }.compact)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def config_digest
|
|
@@ -94,16 +94,24 @@ class Dash::Commands::Loadbalancer < Dash::Commands::Base
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
# Prune by the label the container was actually created with - on a shared
|
|
97
|
-
# proxy host that is the
|
|
98
|
-
# title would leave the container behind for `run` to collide with.
|
|
97
|
+
# proxy host that is the dash-proxy title, and pruning by the loadbalancer
|
|
98
|
+
# title would leave the container behind for `run` to collide with. Both the
|
|
99
|
+
# current and the pre-rename title are pruned, so a container created before
|
|
100
|
+
# the rename is not left behind to collide either.
|
|
99
101
|
def remove_container
|
|
100
|
-
|
|
102
|
+
combine \
|
|
103
|
+
prune_containers_titled(image_title),
|
|
104
|
+
prune_containers_titled(legacy_image_title)
|
|
101
105
|
end
|
|
102
106
|
|
|
103
107
|
# Image label filters match labels baked into the image, and the load balancer
|
|
104
|
-
# runs the
|
|
108
|
+
# runs the dash-proxy image whichever host it sits on. Both titles are matched
|
|
109
|
+
# so a host still carrying a pre-rename image is cleaned up too; Docker ANDs
|
|
110
|
+
# multiple `--filter label=` values, so that is two commands.
|
|
105
111
|
def remove_image
|
|
106
|
-
|
|
112
|
+
combine \
|
|
113
|
+
prune_images_titled(Dash::Configuration::Proxy::IMAGE_TITLE),
|
|
114
|
+
prune_images_titled(Dash::Configuration::Proxy::LEGACY_IMAGE_TITLE)
|
|
107
115
|
end
|
|
108
116
|
|
|
109
117
|
def ensure_directory
|
|
@@ -153,28 +161,50 @@ class Dash::Commands::Loadbalancer < Dash::Commands::Base
|
|
|
153
161
|
loadbalancer_config.on_proxy_host?
|
|
154
162
|
end
|
|
155
163
|
|
|
164
|
+
# The full `key=value` the container is created with, so `--label #{label}`
|
|
165
|
+
# stays correct. The prune helpers take a bare title instead.
|
|
156
166
|
def label
|
|
167
|
+
"org.opencontainers.image.title=#{image_title}"
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def image_title
|
|
157
171
|
if on_proxy_host?
|
|
158
|
-
|
|
172
|
+
Dash::Configuration::Proxy::IMAGE_TITLE
|
|
159
173
|
else
|
|
160
|
-
|
|
174
|
+
Dash::Configuration::Proxy::LOADBALANCER_IMAGE_TITLE
|
|
161
175
|
end
|
|
162
176
|
end
|
|
163
177
|
|
|
164
|
-
|
|
178
|
+
def legacy_image_title
|
|
179
|
+
if on_proxy_host?
|
|
180
|
+
Dash::Configuration::Proxy::LEGACY_IMAGE_TITLE
|
|
181
|
+
else
|
|
182
|
+
Dash::Configuration::Proxy::LEGACY_LOADBALANCER_IMAGE_TITLE
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def prune_containers_titled(title)
|
|
187
|
+
docker :container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=#{title}"
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def prune_images_titled(title)
|
|
191
|
+
docker :image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=#{title}"
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# dash-proxy keeps its state under /home/dash-proxy/.config/dash-proxy
|
|
165
195
|
# whichever host it runs on - only the volume name differs, so a dedicated
|
|
166
196
|
# load balancer and a shared proxy host never fight over the same volume.
|
|
167
197
|
# (The apps-config mount comes with run_args, via the proxy's run surface.)
|
|
168
198
|
def config_volume
|
|
169
199
|
if on_proxy_host?
|
|
170
|
-
[ "--volume", "
|
|
200
|
+
[ "--volume", "dash-proxy-config:/home/dash-proxy/.config/dash-proxy" ]
|
|
171
201
|
else
|
|
172
|
-
[ "--volume", "
|
|
202
|
+
[ "--volume", "dash-loadbalancer-config:/home/dash-proxy/.config/dash-proxy" ]
|
|
173
203
|
end
|
|
174
204
|
end
|
|
175
205
|
|
|
176
206
|
# The certificate store lives in whichever config volume this loadbalancer
|
|
177
|
-
# actually mounts — the shared
|
|
207
|
+
# actually mounts — the shared dash-proxy one on a proxy host.
|
|
178
208
|
def cert_store_volume_args
|
|
179
209
|
config_volume
|
|
180
210
|
end
|
data/lib/dash/commands/lock.rb
CHANGED
|
@@ -4,7 +4,7 @@ require "base64"
|
|
|
4
4
|
|
|
5
5
|
class Dash::Commands::Lock < Dash::Commands::Base
|
|
6
6
|
# The deploy lock is scoped to service+destination, so two destinations can
|
|
7
|
-
# deploy at once. Server-scoped resources — above all the single
|
|
7
|
+
# deploy at once. Server-scoped resources — above all the single dash-proxy
|
|
8
8
|
# container a host runs for every destination on it — need a lock that every
|
|
9
9
|
# destination contends for, hence :server.
|
|
10
10
|
SCOPES = %i[ destination server ].freeze
|
|
@@ -18,7 +18,7 @@ module Dash::Commands::Proxy::CertTransfer
|
|
|
18
18
|
# Through the RPC socket of the running container, under the proxy's own
|
|
19
19
|
# certificate write lock, so a backup taken mid-renewal is never torn.
|
|
20
20
|
def export_certs
|
|
21
|
-
docker :exec, container_name, "
|
|
21
|
+
docker :exec, container_name, "dash-proxy", :export, :certs, certs_archive_container_path
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
# Reads the data directory offline over the config volume — only safe when
|
|
@@ -28,10 +28,10 @@ module Dash::Commands::Proxy::CertTransfer
|
|
|
28
28
|
*cert_store_volume_args,
|
|
29
29
|
*config.proxy_boot.apps_volume.docker_args,
|
|
30
30
|
*one_off_image,
|
|
31
|
-
"
|
|
31
|
+
"dash-proxy", :export, :certs, certs_archive_container_path
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
# Offline by design (
|
|
34
|
+
# Offline by design (dash-proxy import has no RPC path): the one-off
|
|
35
35
|
# container mounts the config volume — creating it when no proxy has booted
|
|
36
36
|
# yet, which is the Traefik-migration case — and the staged source streams
|
|
37
37
|
# through stdin.
|
|
@@ -42,7 +42,7 @@ module Dash::Commands::Proxy::CertTransfer
|
|
|
42
42
|
# run whatever follows on the target host.
|
|
43
43
|
import_command = shell [
|
|
44
44
|
"cat > #{CONTAINER_IMPORT_PATH} &&",
|
|
45
|
-
"
|
|
45
|
+
"dash-proxy import certs",
|
|
46
46
|
*optionize({ source_flag => CONTAINER_IMPORT_PATH, resolver: resolver, force: force || nil, verify: verify || nil }.compact, with: "=")
|
|
47
47
|
]
|
|
48
48
|
|
data/lib/dash/commands/proxy.rb
CHANGED
|
@@ -28,7 +28,7 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
28
28
|
*proxy_run_config.network_args,
|
|
29
29
|
"--detach",
|
|
30
30
|
"--restart", "unless-stopped",
|
|
31
|
-
"--volume", "
|
|
31
|
+
"--volume", "dash-proxy-config:/home/dash-proxy/.config/dash-proxy",
|
|
32
32
|
*config_digest_label_args(digest),
|
|
33
33
|
*proxy_run_config.docker_options_args,
|
|
34
34
|
*proxy_run_config.image,
|
|
@@ -38,6 +38,58 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
# Stage 3c migrations. All three are idempotent and guarded on the
|
|
42
|
+
# destination not existing, so a second deploy is a no-op. Stage 3d deletes
|
|
43
|
+
# them along with the legacy constants they read.
|
|
44
|
+
|
|
45
|
+
# Copies the pre-rename config volume into the new one, before anything
|
|
46
|
+
# starts. The volume holds the routing table and the ACME account and
|
|
47
|
+
# certificate cache; losing it means re-issuing every certificate and
|
|
48
|
+
# spending Let's Encrypt rate limits to get back where we were.
|
|
49
|
+
#
|
|
50
|
+
# Runs in the dash-proxy image itself — already pulled by this point in the
|
|
51
|
+
# boot sequence, and its ubuntu base has sh and cp. `--user root` because the
|
|
52
|
+
# image's own user cannot write the destination volume; `cp -a` preserves the
|
|
53
|
+
# uid, which the rename leaves at 1001.
|
|
54
|
+
# The guard is negated and leads the chain, with `|| true` last, because
|
|
55
|
+
# shell `&&` and `||` share precedence and associate left: written as
|
|
56
|
+
# `exists || legacy_exists && create && copy` it would parse as
|
|
57
|
+
# `((exists || legacy_exists) && create) && copy` and re-copy the legacy
|
|
58
|
+
# volume over live state on every deploy. Leading with `! exists` makes the
|
|
59
|
+
# whole chain a single left-associative AND, which short-circuits correctly.
|
|
60
|
+
def copy_legacy_config_volume(volume: Dash::Configuration::Proxy::CONFIG_VOLUME, legacy: Dash::Configuration::Proxy::LEGACY_CONFIG_VOLUME)
|
|
61
|
+
any \
|
|
62
|
+
combine(
|
|
63
|
+
negate(volume_exists(volume)),
|
|
64
|
+
volume_exists(legacy),
|
|
65
|
+
docker(:volume, :create, volume),
|
|
66
|
+
copy_between_volumes(legacy, volume)
|
|
67
|
+
),
|
|
68
|
+
[ :true ]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Stops and removes a pre-rename proxy container so the renamed one can claim
|
|
72
|
+
# ports 80/443. No port-holder handoff spans two container names, which is
|
|
73
|
+
# why this stage accepts a brief outage per host.
|
|
74
|
+
def remove_legacy_container(timeout: nil)
|
|
75
|
+
any \
|
|
76
|
+
combine(
|
|
77
|
+
container_exists(Dash::Configuration::Proxy::LEGACY_CONTAINER_NAME),
|
|
78
|
+
docker(:container, :stop, *("--time=#{timeout}" if timeout), Dash::Configuration::Proxy::LEGACY_CONTAINER_NAME),
|
|
79
|
+
docker(:container, :rm, Dash::Configuration::Proxy::LEGACY_CONTAINER_NAME)
|
|
80
|
+
),
|
|
81
|
+
[ :true ]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def remove_legacy_holder_container
|
|
85
|
+
any \
|
|
86
|
+
combine(
|
|
87
|
+
container_exists(Dash::Configuration::Proxy::LEGACY_HOLDER_CONTAINER_NAME),
|
|
88
|
+
docker(:container, :rm, "--force", Dash::Configuration::Proxy::LEGACY_HOLDER_CONTAINER_NAME)
|
|
89
|
+
),
|
|
90
|
+
[ :true ]
|
|
91
|
+
end
|
|
92
|
+
|
|
41
93
|
def start
|
|
42
94
|
docker :container, :start, container_name
|
|
43
95
|
end
|
|
@@ -54,9 +106,12 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
54
106
|
docker :ps, "--filter", "'name=^#{container_name}$'"
|
|
55
107
|
end
|
|
56
108
|
|
|
57
|
-
|
|
109
|
+
# `name:` so the doctor can also ask about the pre-rename container: during
|
|
110
|
+
# the stage-3c transition a host still runs kamal-proxy, and a check that only
|
|
111
|
+
# ever looks at dash-proxy concludes no proxy is running.
|
|
112
|
+
def version(name: container_name)
|
|
58
113
|
pipe \
|
|
59
|
-
docker(:inspect,
|
|
114
|
+
docker(:inspect, name, "--format '{{.Config.Image}}'"),
|
|
60
115
|
[ :awk, "-F:", "'{print \$NF}'" ]
|
|
61
116
|
end
|
|
62
117
|
|
|
@@ -77,15 +132,15 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
77
132
|
end
|
|
78
133
|
|
|
79
134
|
def list(name: container_name, json: false)
|
|
80
|
-
docker :exec, name, "
|
|
135
|
+
docker :exec, name, "dash-proxy", :list, *("--json" if json)
|
|
81
136
|
end
|
|
82
137
|
|
|
83
138
|
def cache_stats(count: false, json: false)
|
|
84
|
-
docker :exec, container_name, "
|
|
139
|
+
docker :exec, container_name, "dash-proxy", :cache, :stats, *optionize({ count: count || nil, json: json || nil }.compact)
|
|
85
140
|
end
|
|
86
141
|
|
|
87
142
|
def cache_purge(service, path_prefix: nil)
|
|
88
|
-
docker :exec, container_name, "
|
|
143
|
+
docker :exec, container_name, "dash-proxy", :cache, :purge, service, *optionize({ "path-prefix": path_prefix }.compact)
|
|
89
144
|
end
|
|
90
145
|
|
|
91
146
|
# One mount destination per line - what the running container was actually
|
|
@@ -108,12 +163,12 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
108
163
|
docker \
|
|
109
164
|
:run,
|
|
110
165
|
"--name", proxy_run_config.holder_container_name,
|
|
111
|
-
"--network", "
|
|
166
|
+
"--network", "dash",
|
|
112
167
|
"--detach",
|
|
113
168
|
"--restart", "unless-stopped",
|
|
114
169
|
*proxy_run_config.holder_docker_args,
|
|
115
170
|
*proxy_run_config.image,
|
|
116
|
-
"
|
|
171
|
+
"dash-proxy", "hold"
|
|
117
172
|
end
|
|
118
173
|
|
|
119
174
|
def start_holder_or_run
|
|
@@ -131,7 +186,7 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
131
186
|
end
|
|
132
187
|
|
|
133
188
|
def drain(timeout: nil)
|
|
134
|
-
docker :exec, container_name, "
|
|
189
|
+
docker :exec, container_name, "dash-proxy", :drain, *("--drain-timeout=#{timeout}s" if timeout)
|
|
135
190
|
end
|
|
136
191
|
|
|
137
192
|
def wait_for_exit(name: container_name)
|
|
@@ -161,15 +216,24 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
161
216
|
|
|
162
217
|
# `retry` takes a host, or --all; the rest take no arguments.
|
|
163
218
|
def domains(subcommand, *args)
|
|
164
|
-
docker :exec, container_name, "
|
|
219
|
+
docker :exec, container_name, "dash-proxy", "domains", subcommand, *args
|
|
165
220
|
end
|
|
166
221
|
|
|
222
|
+
# Docker ANDs multiple `--filter label=` values, so matching both the current
|
|
223
|
+
# and the pre-rename image title takes two commands rather than one filter
|
|
224
|
+
# with two values. Without the legacy pass, `dash proxy remove` on a host that
|
|
225
|
+
# has not yet been through the rename silently leaves the old container and
|
|
226
|
+
# image behind. Stage 3d drops the legacy half.
|
|
167
227
|
def remove_container
|
|
168
|
-
|
|
228
|
+
combine \
|
|
229
|
+
prune_containers_titled(Dash::Configuration::Proxy::IMAGE_TITLE),
|
|
230
|
+
prune_containers_titled(Dash::Configuration::Proxy::LEGACY_IMAGE_TITLE)
|
|
169
231
|
end
|
|
170
232
|
|
|
171
233
|
def remove_image
|
|
172
|
-
|
|
234
|
+
combine \
|
|
235
|
+
prune_images_titled(Dash::Configuration::Proxy::IMAGE_TITLE),
|
|
236
|
+
prune_images_titled(Dash::Configuration::Proxy::LEGACY_IMAGE_TITLE)
|
|
173
237
|
end
|
|
174
238
|
|
|
175
239
|
def cleanup_traefik
|
|
@@ -245,7 +309,7 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
245
309
|
end
|
|
246
310
|
|
|
247
311
|
def cert_store_volume_args
|
|
248
|
-
[ "--volume", "
|
|
312
|
+
[ "--volume", "dash-proxy-config:/home/dash-proxy/.config/dash-proxy" ]
|
|
249
313
|
end
|
|
250
314
|
|
|
251
315
|
# Same fallback as #pull: without a run config the image comes from the
|
|
@@ -262,14 +326,52 @@ class Dash::Commands::Proxy < Dash::Commands::Base
|
|
|
262
326
|
[ "--label", "#{CONFIG_DIGEST_LABEL}=#{digest}" ] if digest
|
|
263
327
|
end
|
|
264
328
|
|
|
329
|
+
def negate(command)
|
|
330
|
+
[ "!", *command ]
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def volume_exists(name)
|
|
334
|
+
docker :volume, :inspect, name, ">", "/dev/null", "2>&1"
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def container_exists(name)
|
|
338
|
+
docker :container, :inspect, name, ">", "/dev/null", "2>&1"
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
def copy_between_volumes(from, to)
|
|
342
|
+
docker \
|
|
343
|
+
:run, "--rm", "--user", "root", "--entrypoint", "sh",
|
|
344
|
+
"--volume", "#{from}:/from",
|
|
345
|
+
"--volume", "#{to}:/to",
|
|
346
|
+
proxy_image,
|
|
347
|
+
"-c", "'cp -a /from/. /to/'"
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
# The image the volume copy borrows. The proxy this gem is pinned to is
|
|
351
|
+
# already pulled by the time the copy runs, and `rake release` gates on
|
|
352
|
+
# MINIMUM_VERSION being published, so this is always resolvable — unlike
|
|
353
|
+
# the legacy boot path's image, which is read from a file on the host.
|
|
354
|
+
def proxy_image
|
|
355
|
+
proxy_run_config&.image ||
|
|
356
|
+
"#{config.proxy_boot.image_default}:#{Dash::Configuration::Proxy::Run::MINIMUM_VERSION}"
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def prune_containers_titled(title)
|
|
360
|
+
docker :container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=#{title}"
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def prune_images_titled(title)
|
|
364
|
+
docker :image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=#{title}"
|
|
365
|
+
end
|
|
366
|
+
|
|
265
367
|
def docker_run(digest: nil)
|
|
266
368
|
docker \
|
|
267
369
|
:run,
|
|
268
370
|
"--name", container_name,
|
|
269
|
-
"--network", "
|
|
371
|
+
"--network", "dash",
|
|
270
372
|
"--detach",
|
|
271
373
|
"--restart", "unless-stopped",
|
|
272
|
-
"--volume", "
|
|
374
|
+
"--volume", "dash-proxy-config:/home/dash-proxy/.config/dash-proxy",
|
|
273
375
|
*config_digest_label_args(digest),
|
|
274
376
|
*config.proxy_boot.apps_volume.docker_args
|
|
275
377
|
end
|
data/lib/dash/commands/prune.rb
CHANGED
|
@@ -15,7 +15,7 @@ class Dash::Commands::Prune < Dash::Commands::Base
|
|
|
15
15
|
|
|
16
16
|
# Scoped to one role so a busy sibling role cannot push another role's newest
|
|
17
17
|
# container past the retain window. That matters beyond disk hygiene: a
|
|
18
|
-
# container
|
|
18
|
+
# container dash-proxy has put to sleep is `exited`, so it is a removal
|
|
19
19
|
# candidate, and once it is gone every wake 404s. With `retain >= 1` a role's
|
|
20
20
|
# newest container always survives, and the slept one is always the newest —
|
|
21
21
|
# sleeping happens to the current release.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class Dash::Configuration::Accessory
|
|
2
2
|
include Dash::Configuration::Validation
|
|
3
3
|
|
|
4
|
-
DEFAULT_NETWORK = "
|
|
4
|
+
DEFAULT_NETWORK = "dash"
|
|
5
5
|
|
|
6
6
|
delegate :argumentize, :optionize, to: Dash::Utils
|
|
7
7
|
|
|
@@ -129,7 +129,7 @@ class Dash::Configuration::Accessory
|
|
|
129
129
|
|
|
130
130
|
# The load balancer fans the app's own service out to role targets only
|
|
131
131
|
# (see Dash::Cli::Proxy#loadbalancer), so an accessory is never behind it
|
|
132
|
-
# and must keep the host/TLS it registers with
|
|
132
|
+
# and must keep the host/TLS it registers with dash-proxy directly.
|
|
133
133
|
def initialize_proxy
|
|
134
134
|
Dash::Configuration::Proxy.new \
|
|
135
135
|
config: config,
|
|
@@ -150,7 +150,7 @@ accessories:
|
|
|
150
150
|
#
|
|
151
151
|
# The network the accessory will be attached to.
|
|
152
152
|
#
|
|
153
|
-
# Defaults to
|
|
153
|
+
# Defaults to dash:
|
|
154
154
|
network: custom
|
|
155
155
|
|
|
156
156
|
# Proxy
|
|
@@ -160,12 +160,12 @@ accessories:
|
|
|
160
160
|
# app-level `proxy:` (see `dash docs proxy`), though root-only keys such as
|
|
161
161
|
# `loadbalancer` and `reboot_on_deploy` have no effect inside an accessory.
|
|
162
162
|
# Declaring a proxy here makes the accessory's hosts proxy hosts:
|
|
163
|
-
# `dash proxy boot` (and `dash deploy`) will run
|
|
163
|
+
# `dash proxy boot` (and `dash deploy`) will run dash-proxy on them
|
|
164
164
|
# automatically.
|
|
165
165
|
#
|
|
166
166
|
# Accessories are never load balanced. The loadbalancer fans the app's own
|
|
167
167
|
# service out to its role targets, so an accessory always registers its
|
|
168
|
-
# hostname and TLS with the
|
|
168
|
+
# hostname and TLS with the dash-proxy on its own host — whether or not the
|
|
169
169
|
# loadbalancer is active for the app. Point the accessory's DNS record at the
|
|
170
170
|
# accessory host, not at the loadbalancer.
|
|
171
171
|
#
|