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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dash/cli/app/boot.rb +2 -2
  3. data/lib/dash/cli/app.rb +1 -1
  4. data/lib/dash/cli/base.rb +1 -1
  5. data/lib/dash/cli/doctor/endpoint_checks.rb +1 -1
  6. data/lib/dash/cli/doctor/host_checks.rb +29 -8
  7. data/lib/dash/cli/main.rb +5 -5
  8. data/lib/dash/cli/proxy/legacy_rename.rb +58 -0
  9. data/lib/dash/cli/proxy/loadbalancer_reboot.rb +1 -1
  10. data/lib/dash/cli/proxy/reboot.rb +8 -8
  11. data/lib/dash/cli/proxy.rb +14 -10
  12. data/lib/dash/commander.rb +1 -1
  13. data/lib/dash/commands/accessory/proxy.rb +1 -1
  14. data/lib/dash/commands/app/execution.rb +1 -1
  15. data/lib/dash/commands/app/proxy.rb +1 -1
  16. data/lib/dash/commands/app.rb +1 -1
  17. data/lib/dash/commands/docker.rb +35 -1
  18. data/lib/dash/commands/loadbalancer.rb +47 -17
  19. data/lib/dash/commands/lock.rb +1 -1
  20. data/lib/dash/commands/proxy/cert_transfer.rb +4 -4
  21. data/lib/dash/commands/proxy.rb +117 -15
  22. data/lib/dash/commands/prune.rb +1 -1
  23. data/lib/dash/configuration/accessory.rb +2 -2
  24. data/lib/dash/configuration/docs/accessory.yml +3 -3
  25. data/lib/dash/configuration/docs/configuration.yml +1 -1
  26. data/lib/dash/configuration/docs/proxy.yml +38 -38
  27. data/lib/dash/configuration/loadbalancer.rb +2 -2
  28. data/lib/dash/configuration/proxy/acme.rb +5 -5
  29. data/lib/dash/configuration/proxy/boot.rb +2 -4
  30. data/lib/dash/configuration/proxy/run.rb +10 -10
  31. data/lib/dash/configuration/proxy.rb +36 -14
  32. data/lib/dash/configuration/role.rb +2 -2
  33. data/lib/dash/configuration/validator/proxy.rb +23 -23
  34. data/lib/dash/configuration.rb +8 -8
  35. data/lib/dash/utils.rb +1 -1
  36. data/lib/dash/version.rb +1 -1
  37. 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", "kamal",
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, "kamal-proxy", "deploy", loadbalancer_config.config.service,
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, "kamal-proxy", "domains", subcommand, *args
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, "kamal-proxy", :list, *("--json" if json)
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, "kamal-proxy", :cache, :stats, *optionize({ count: count || nil, json: json || nil }.compact)
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, "kamal-proxy", :cache, :purge, service, *optionize({ "path-prefix": path_prefix }.compact)
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 kamal-proxy title, and pruning by the loadbalancer
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
- docker :container, :prune, "--force", "--filter", "label=#{label}"
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 kamal-proxy image whichever host it sits on.
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
- docker :image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"
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
- "org.opencontainers.image.title=kamal-proxy"
172
+ Dash::Configuration::Proxy::IMAGE_TITLE
159
173
  else
160
- "org.opencontainers.image.title=kamal-loadbalancer"
174
+ Dash::Configuration::Proxy::LOADBALANCER_IMAGE_TITLE
161
175
  end
162
176
  end
163
177
 
164
- # kamal-proxy keeps its state under /home/kamal-proxy/.config/kamal-proxy
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", "kamal-proxy-config:/home/kamal-proxy/.config/kamal-proxy" ]
200
+ [ "--volume", "dash-proxy-config:/home/dash-proxy/.config/dash-proxy" ]
171
201
  else
172
- [ "--volume", "kamal-loadbalancer-config:/home/kamal-proxy/.config/kamal-proxy" ]
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 kamal-proxy one on a proxy host.
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
@@ -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 kamal-proxy
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, "kamal-proxy", :export, :certs, certs_archive_container_path
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
- "kamal-proxy", :export, :certs, certs_archive_container_path
31
+ "dash-proxy", :export, :certs, certs_archive_container_path
32
32
  end
33
33
 
34
- # Offline by design (kamal-proxy import has no RPC path): the one-off
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
- "kamal-proxy import certs",
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
 
@@ -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", "kamal-proxy-config:/home/kamal-proxy/.config/kamal-proxy",
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
- def version
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, container_name, "--format '{{.Config.Image}}'"),
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, "kamal-proxy", :list, *("--json" if json)
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, "kamal-proxy", :cache, :stats, *optionize({ count: count || nil, json: json || nil }.compact)
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, "kamal-proxy", :cache, :purge, service, *optionize({ "path-prefix": path_prefix }.compact)
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", "kamal",
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
- "kamal-proxy", "hold"
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, "kamal-proxy", :drain, *("--drain-timeout=#{timeout}s" if timeout)
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, "kamal-proxy", "domains", subcommand, *args
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
- docker :container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"
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
- docker :image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"
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", "kamal-proxy-config:/home/kamal-proxy/.config/kamal-proxy" ]
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", "kamal",
371
+ "--network", "dash",
270
372
  "--detach",
271
373
  "--restart", "unless-stopped",
272
- "--volume", "kamal-proxy-config:/home/kamal-proxy/.config/kamal-proxy",
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
@@ -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 kamal-proxy has put to sleep is `exited`, so it is a removal
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 = "kamal"
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 kamal-proxy directly.
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 kamal:
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 kamal-proxy on them
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 kamal-proxy on its own host — whether or not 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
  #
@@ -201,7 +201,7 @@ accessories:
201
201
 
202
202
  # Proxy
203
203
  #
204
- # Configuration for kamal-proxy, see dash docs proxy:
204
+ # Configuration for dash-proxy, see dash docs proxy:
205
205
  proxy:
206
206
  ...
207
207