dash 3.2.0 → 3.2.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/README.md +1 -1
- data/bin/dash +2 -2
- data/lib/{kamal → dash}/cli/accessory.rb +24 -24
- data/lib/dash/cli/alias/command.rb +10 -0
- data/lib/{kamal → dash}/cli/app/assets.rb +2 -2
- data/lib/{kamal → dash}/cli/app/boot.rb +15 -15
- data/lib/{kamal → dash}/cli/app/error_pages.rb +6 -6
- data/lib/{kamal → dash}/cli/app/rollout_boot.rb +6 -6
- data/lib/{kamal → dash}/cli/app/ssl_certificates.rb +3 -3
- data/lib/{kamal → dash}/cli/app.rb +86 -86
- data/lib/{kamal → dash}/cli/base.rb +71 -47
- data/lib/dash/cli/build/clone.rb +59 -0
- data/lib/{kamal → dash}/cli/build/port_forwarding.rb +1 -1
- data/lib/{kamal → dash}/cli/build.rb +45 -45
- data/lib/{kamal → dash}/cli/doctor/config_checks.rb +3 -3
- data/lib/{kamal → dash}/cli/doctor/endpoint_checks.rb +25 -7
- data/lib/{kamal → dash}/cli/doctor/host_checks.rb +18 -18
- data/lib/{kamal → dash}/cli/doctor.rb +9 -9
- data/lib/{kamal → dash}/cli/healthcheck/barrier.rb +2 -2
- data/lib/{kamal → dash}/cli/healthcheck/drift_error.rb +2 -2
- data/lib/dash/cli/healthcheck/error.rb +2 -0
- data/lib/{kamal → dash}/cli/healthcheck/poller.rb +7 -7
- data/lib/{kamal → dash}/cli/lock.rb +1 -1
- data/lib/dash/cli/main/migrate.rb +77 -0
- data/lib/{kamal → dash}/cli/main.rb +77 -66
- data/lib/{kamal → dash}/cli/proxy/drift.rb +3 -3
- data/lib/{kamal → dash}/cli/proxy/loadbalancer_claim.rb +3 -3
- data/lib/{kamal → dash}/cli/proxy/loadbalancer_reboot.rb +22 -22
- data/lib/{kamal → dash}/cli/proxy/reboot.rb +15 -15
- data/lib/{kamal → dash}/cli/proxy.rb +166 -154
- data/lib/{kamal → dash}/cli/prune.rb +10 -10
- data/lib/{kamal → dash}/cli/registry.rb +11 -11
- data/lib/{kamal → dash}/cli/secrets.rb +3 -3
- data/lib/{kamal → dash}/cli/server.rb +14 -14
- data/lib/{kamal → dash}/cli/templates/deploy.yml +4 -4
- data/lib/dash/cli/templates/sample_hooks/docker-setup.sample +3 -0
- data/lib/dash/cli/templates/sample_hooks/post-app-boot.sample +3 -0
- data/lib/dash/cli/templates/sample_hooks/post-app-stop.sample +9 -0
- data/lib/dash/cli/templates/sample_hooks/post-deploy.sample +14 -0
- data/lib/dash/cli/templates/sample_hooks/post-proxy-deploy.sample +3 -0
- data/lib/dash/cli/templates/sample_hooks/post-proxy-reboot.sample +3 -0
- data/lib/dash/cli/templates/sample_hooks/pre-app-boot.sample +3 -0
- data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-app-stop.sample +2 -2
- data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-build.sample +8 -8
- data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-connect.sample +8 -8
- data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-deploy.sample +9 -9
- data/lib/dash/cli/templates/sample_hooks/pre-proxy-deploy.sample +3 -0
- data/lib/dash/cli/templates/sample_hooks/pre-proxy-reboot.sample +3 -0
- data/lib/{kamal → dash}/cli/templates/secrets +6 -6
- data/lib/{kamal → dash}/cli.rb +2 -2
- data/lib/{kamal → dash}/commander/specifics.rb +2 -2
- data/lib/{kamal → dash}/commander.rb +31 -23
- data/lib/{kamal → dash}/commands/accessory/proxy.rb +1 -1
- data/lib/{kamal → dash}/commands/accessory.rb +2 -2
- data/lib/{kamal → dash}/commands/app/assets.rb +1 -1
- data/lib/{kamal → dash}/commands/app/containers.rb +1 -1
- data/lib/{kamal → dash}/commands/app/error_pages.rb +2 -2
- data/lib/{kamal → dash}/commands/app/execution.rb +1 -1
- data/lib/{kamal → dash}/commands/app/images.rb +1 -1
- data/lib/{kamal → dash}/commands/app/logging.rb +1 -1
- data/lib/{kamal → dash}/commands/app/proxy.rb +1 -1
- data/lib/{kamal → dash}/commands/app.rb +1 -1
- data/lib/{kamal → dash}/commands/auditor.rb +3 -7
- data/lib/{kamal → dash}/commands/base.rb +39 -3
- data/lib/{kamal → dash}/commands/builder/base.rb +2 -2
- data/lib/{kamal → dash}/commands/builder/clone.rb +3 -3
- data/lib/{kamal → dash}/commands/builder/cloud.rb +1 -1
- data/lib/{kamal → dash}/commands/builder/hybrid.rb +1 -1
- data/lib/{kamal → dash}/commands/builder/local.rb +1 -1
- data/lib/{kamal → dash}/commands/builder/pack.rb +1 -1
- data/lib/{kamal → dash}/commands/builder/remote.rb +1 -1
- data/lib/{kamal → dash}/commands/builder.rb +7 -7
- data/lib/{kamal → dash}/commands/docker.rb +1 -1
- data/lib/{kamal → dash}/commands/hook.rb +1 -1
- data/lib/{kamal → dash}/commands/loadbalancer.rb +9 -8
- data/lib/{kamal → dash}/commands/lock.rb +2 -2
- data/lib/{kamal → dash}/commands/proxy/cert_transfer.rb +2 -2
- data/lib/{kamal → dash}/commands/proxy.rb +20 -10
- data/lib/{kamal → dash}/commands/prune.rb +1 -1
- data/lib/dash/commands/registry.rb +44 -0
- data/lib/{kamal → dash}/commands/server.rb +1 -5
- data/lib/dash/commands.rb +2 -0
- data/lib/{kamal → dash}/configuration/accessory.rb +11 -11
- data/lib/{kamal → dash}/configuration/alias.rb +3 -3
- data/lib/{kamal → dash}/configuration/boot.rb +2 -2
- data/lib/{kamal → dash}/configuration/builder.rb +7 -7
- data/lib/{kamal → dash}/configuration/docs/builder.yml +3 -3
- data/lib/{kamal → dash}/configuration/docs/configuration.yml +12 -5
- data/lib/{kamal → dash}/configuration/docs/env.yml +10 -10
- data/lib/{kamal → dash}/configuration/docs/proxy.yml +31 -8
- data/lib/{kamal → dash}/configuration/docs/registry.yml +5 -5
- data/lib/{kamal → dash}/configuration/env/tag.rb +2 -2
- data/lib/{kamal → dash}/configuration/env.rb +5 -5
- data/lib/{kamal → dash}/configuration/loadbalancer.rb +3 -3
- data/lib/{kamal → dash}/configuration/logging.rb +3 -3
- data/lib/{kamal → dash}/configuration/output.rb +4 -4
- data/lib/{kamal → dash}/configuration/proxy/acme.rb +4 -3
- data/lib/{kamal → dash}/configuration/proxy/boot.rb +7 -7
- data/lib/{kamal → dash}/configuration/proxy/run.rb +11 -11
- data/lib/{kamal → dash}/configuration/proxy.rb +15 -15
- data/lib/{kamal → dash}/configuration/registry.rb +3 -3
- data/lib/{kamal → dash}/configuration/role/healthcheck.rb +3 -3
- data/lib/{kamal → dash}/configuration/role.rb +12 -12
- data/lib/{kamal → dash}/configuration/servers.rb +4 -4
- data/lib/{kamal → dash}/configuration/ssh.rb +2 -2
- data/lib/{kamal → dash}/configuration/sshkit.rb +2 -2
- data/lib/{kamal → dash}/configuration/validation.rb +2 -2
- data/lib/{kamal → dash}/configuration/validator/accessory.rb +1 -1
- data/lib/{kamal → dash}/configuration/validator/alias.rb +2 -2
- data/lib/{kamal → dash}/configuration/validator/builder.rb +1 -1
- data/lib/dash/configuration/validator/configuration.rb +6 -0
- data/lib/{kamal → dash}/configuration/validator/env.rb +2 -2
- data/lib/{kamal → dash}/configuration/validator/proxy.rb +8 -8
- data/lib/{kamal → dash}/configuration/validator/registry.rb +1 -1
- data/lib/{kamal → dash}/configuration/validator/role.rb +1 -1
- data/lib/{kamal → dash}/configuration/validator/servers.rb +1 -1
- data/lib/{kamal → dash}/configuration/validator.rb +4 -4
- data/lib/{kamal → dash}/configuration/volume.rb +2 -2
- data/lib/{kamal → dash}/configuration.rb +39 -29
- data/lib/{kamal → dash}/docker.rb +1 -1
- data/lib/{kamal → dash}/env_file.rb +1 -1
- data/lib/{kamal → dash}/git.rb +1 -1
- data/lib/{kamal → dash}/otel_shipper.rb +3 -3
- data/lib/{kamal → dash}/output/base_logger.rb +1 -1
- data/lib/{kamal → dash}/output/file_logger.rb +1 -1
- data/lib/{kamal → dash}/output/formatter.rb +1 -1
- data/lib/{kamal → dash}/output/otel_logger.rb +3 -3
- data/lib/dash/project_directory.rb +28 -0
- data/lib/{kamal → dash}/secrets/adapters/aws_secrets_manager.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/base.rb +2 -2
- data/lib/{kamal → dash}/secrets/adapters/bitwarden.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/bitwarden_secrets_manager.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/doppler.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/enpass.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/gcp_secret_manager.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/last_pass.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/one_password.rb +2 -2
- data/lib/{kamal → dash}/secrets/adapters/passbolt.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters/test.rb +1 -1
- data/lib/{kamal → dash}/secrets/adapters.rb +2 -2
- data/lib/{kamal → dash}/secrets/dotenv/inline_command_substitution.rb +2 -2
- data/lib/{kamal → dash}/secrets.rb +6 -6
- data/lib/{kamal → dash}/tags.rb +8 -3
- data/lib/{kamal → dash}/utils/sensitive.rb +1 -1
- data/lib/{kamal → dash}/utils.rb +15 -5
- data/lib/dash/version.rb +3 -0
- data/lib/{kamal.rb → dash.rb} +4 -4
- metadata +156 -154
- data/lib/kamal/cli/alias/command.rb +0 -10
- data/lib/kamal/cli/build/clone.rb +0 -59
- data/lib/kamal/cli/healthcheck/error.rb +0 -2
- data/lib/kamal/cli/templates/sample_hooks/docker-setup.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/post-app-boot.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/post-app-stop.sample +0 -9
- data/lib/kamal/cli/templates/sample_hooks/post-deploy.sample +0 -14
- data/lib/kamal/cli/templates/sample_hooks/post-proxy-deploy.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/post-proxy-reboot.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/pre-app-boot.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/pre-proxy-deploy.sample +0 -3
- data/lib/kamal/cli/templates/sample_hooks/pre-proxy-reboot.sample +0 -3
- data/lib/kamal/commands/registry.rb +0 -38
- data/lib/kamal/commands.rb +0 -2
- data/lib/kamal/configuration/validator/configuration.rb +0 -6
- data/lib/kamal/version.rb +0 -3
- /data/lib/{kamal → dash}/configuration/docs/accessory.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/alias.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/boot.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/logging.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/output.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/role.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/servers.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/ssh.yml +0 -0
- /data/lib/{kamal → dash}/configuration/docs/sshkit.yml +0 -0
- /data/lib/{kamal → dash}/sshkit_with_ext.rb +0 -0
|
@@ -81,7 +81,7 @@ asset_path: /path/to/assets
|
|
|
81
81
|
|
|
82
82
|
# Hooks path
|
|
83
83
|
#
|
|
84
|
-
# Path to hooks, defaults to `.kamal/hooks
|
|
84
|
+
# Path to hooks, defaults to `.dash/hooks` (`.kamal/hooks` is still read when only that exists).
|
|
85
85
|
# See https://kamal-deploy.org/docs/hooks for more information:
|
|
86
86
|
hooks_path: /user_home/kamal/hooks
|
|
87
87
|
|
|
@@ -106,8 +106,8 @@ hooks_output:
|
|
|
106
106
|
|
|
107
107
|
# Secrets path
|
|
108
108
|
#
|
|
109
|
-
# Path to secrets, defaults to `.kamal/secrets
|
|
110
|
-
#
|
|
109
|
+
# Path to secrets, defaults to `.dash/secrets` (`.kamal/secrets` is still read when only that exists).
|
|
110
|
+
# dash looks for `<secrets_path>-common` first and then `<secrets_path>`.
|
|
111
111
|
# When using destinations, it instead looks for `<secrets_path>-common` first and then
|
|
112
112
|
# `<secrets_path>.<destination>`. Later files override earlier ones.
|
|
113
113
|
secrets_path: /user_home/kamal/secrets
|
|
@@ -171,8 +171,15 @@ stop_timeout: 30
|
|
|
171
171
|
|
|
172
172
|
# Run directory
|
|
173
173
|
#
|
|
174
|
-
#
|
|
175
|
-
|
|
174
|
+
# Where dash keeps its runtime files on each host — per-app env and assets, the
|
|
175
|
+
# proxy's boot files and apps-config mount, loadbalancer service claims, deploy
|
|
176
|
+
# locks, and the audit log. Resolved against the SSH user's home, default
|
|
177
|
+
# `.dash`. A host still holding the pre-3.4 `.kamal` directory is renamed to
|
|
178
|
+
# `.dash` in place the next time dash takes a lock on it; nothing is rebooted.
|
|
179
|
+
#
|
|
180
|
+
# The key is accepted but not yet honoured — the path is currently always
|
|
181
|
+
# `.dash`. Tracked separately from the stage-3 rename.
|
|
182
|
+
run_directory: .dash
|
|
176
183
|
|
|
177
184
|
# SSH options
|
|
178
185
|
#
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Environment variables
|
|
2
2
|
#
|
|
3
|
-
# Environment variables can be set directly in the
|
|
4
|
-
# read from `.
|
|
3
|
+
# Environment variables can be set directly in the dash configuration or
|
|
4
|
+
# read from `.dash/secrets`.
|
|
5
5
|
|
|
6
6
|
# Reading environment variables from the configuration
|
|
7
7
|
#
|
|
@@ -14,20 +14,20 @@ env:
|
|
|
14
14
|
|
|
15
15
|
# Secrets
|
|
16
16
|
#
|
|
17
|
-
#
|
|
17
|
+
# dash uses dotenv to automatically load environment variables from the configured secrets files.
|
|
18
18
|
#
|
|
19
|
-
# Common secrets across all destinations can be set in `.
|
|
20
|
-
# `.
|
|
19
|
+
# Common secrets across all destinations can be set in `.dash/secrets-common`. dash looks for
|
|
20
|
+
# `.dash/secrets-common` first, then `.dash/secrets`, with later values overriding earlier ones.
|
|
21
21
|
#
|
|
22
|
-
# If you are using destinations,
|
|
23
|
-
# `.
|
|
22
|
+
# If you are using destinations, dash looks for `.dash/secrets-common` first, then
|
|
23
|
+
# `.dash/secrets.<destination>`. The non-destination `.dash/secrets` file is not read when a
|
|
24
24
|
# destination is selected.
|
|
25
25
|
#
|
|
26
|
-
# This file can be used to set variables like `
|
|
26
|
+
# This file can be used to set variables like `DASH_REGISTRY_PASSWORD` or database passwords.
|
|
27
27
|
# You can use variable or command substitution in the secrets file.
|
|
28
28
|
#
|
|
29
29
|
# ```shell
|
|
30
|
-
#
|
|
30
|
+
# DASH_REGISTRY_PASSWORD=$DASH_REGISTRY_PASSWORD
|
|
31
31
|
# RAILS_MASTER_KEY=$(cat config/master.key)
|
|
32
32
|
# ```
|
|
33
33
|
#
|
|
@@ -40,7 +40,7 @@ env:
|
|
|
40
40
|
# DB_PASSWORD=$(dash secrets extract DB_PASSWORD $SECRETS)
|
|
41
41
|
# ```
|
|
42
42
|
#
|
|
43
|
-
# If you store secrets directly in `.
|
|
43
|
+
# If you store secrets directly in `.dash/secrets`, ensure that it is not checked into version control.
|
|
44
44
|
#
|
|
45
45
|
# To pass the secrets, you should list them under the `secret` key. When you do this, the
|
|
46
46
|
# other variables need to be moved under the `clear` key.
|
|
@@ -16,7 +16,7 @@ proxy:
|
|
|
16
16
|
# Where each option lives when a loadbalancer fronts the fleet
|
|
17
17
|
#
|
|
18
18
|
# Every deploy option has exactly one home (see
|
|
19
|
-
#
|
|
19
|
+
# Dash::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS - the layering
|
|
20
20
|
# contract that enforces this):
|
|
21
21
|
#
|
|
22
22
|
# edge - applied only by the loadbalancer, stripped from the per-host
|
|
@@ -88,13 +88,13 @@ proxy:
|
|
|
88
88
|
# * Service names must be unique across apps. The loadbalancer registers a
|
|
89
89
|
# service under the bare `service:` name, so two apps — or two destinations
|
|
90
90
|
# of one app — sharing a name would take over each other's routes. The first
|
|
91
|
-
# app to deploy claims the name in `.
|
|
91
|
+
# app to deploy claims the name in `.dash/loadbalancer/services/<service>`
|
|
92
92
|
# on the loadbalancer host; a second app deploying the same name fails at
|
|
93
93
|
# deploy time instead of silently winning.
|
|
94
94
|
#
|
|
95
95
|
# * Apps sharing a loadbalancer must agree on `proxy/run`. All of them boot the
|
|
96
96
|
# same container, so the first app to boot records its run configuration in
|
|
97
|
-
# `.
|
|
97
|
+
# `.dash/loadbalancer/run_config`. Another app booting with a different
|
|
98
98
|
# `proxy/run` fails; the same app changing its own gets the usual drift
|
|
99
99
|
# warning and applies it on `dash proxy reboot`.
|
|
100
100
|
#
|
|
@@ -161,8 +161,8 @@ proxy:
|
|
|
161
161
|
#
|
|
162
162
|
# `client_ca_pem` requires mutual TLS: clients must present a certificate
|
|
163
163
|
# signed by this CA bundle. Like `certificate_pem` it names a secret in
|
|
164
|
-
# `.
|
|
165
|
-
# under `.
|
|
164
|
+
# `.dash/secrets`; the content is uploaded next to the app's TLS material
|
|
165
|
+
# under `.dash/proxy/apps-config`, and the proxy is given the path it sees
|
|
166
166
|
# inside its own container. An empty secret fails the deploy rather than
|
|
167
167
|
# silently turning mTLS off.
|
|
168
168
|
ssl:
|
|
@@ -377,7 +377,7 @@ proxy:
|
|
|
377
377
|
#
|
|
378
378
|
# Set exactly one of `password_secret` or `password` — never both.
|
|
379
379
|
#
|
|
380
|
-
# Prefer `password_secret`: it names an entry in `.
|
|
380
|
+
# Prefer `password_secret`: it names an entry in `.dash/secrets`, so the
|
|
381
381
|
# password never lives in this file.
|
|
382
382
|
#
|
|
383
383
|
# basic_auth:
|
|
@@ -834,7 +834,7 @@ proxy:
|
|
|
834
834
|
# below already embeds its ghcr.io host
|
|
835
835
|
repository: ghcr.io/zoolutions/dash-proxy # Container repository for the
|
|
836
836
|
# kamal-proxy image (this is the default)
|
|
837
|
-
version: v1.0.0.
|
|
837
|
+
version: v1.0.0.7 # Version tag of the kamal-proxy image to use.
|
|
838
838
|
# Defaults to the minimum version this gem
|
|
839
839
|
# requires - only pin it to roll forward early,
|
|
840
840
|
# never below the default
|
|
@@ -880,7 +880,29 @@ proxy:
|
|
|
880
880
|
# staging environment while you are working out a DNS setup, so you do not
|
|
881
881
|
# burn production rate limits on failed attempts.
|
|
882
882
|
#
|
|
883
|
-
# `
|
|
883
|
+
# `release_probe_interval` is how often, in seconds, the proxy re-checks a
|
|
884
|
+
# domain whose issuance is currently held - which is what decides how long
|
|
885
|
+
# after a DNS cutover the certificate appears (proxy v1.0.0.7+).
|
|
886
|
+
#
|
|
887
|
+
# You can point a host at dash before its DNS is repointed. No certificate
|
|
888
|
+
# is ordered until the first HTTPS request arrives, and the proxy first
|
|
889
|
+
# checks that the domain actually routes back to it - because until it does,
|
|
890
|
+
# an HTTP-01 challenge cannot succeed, and a failed attempt burns Let's
|
|
891
|
+
# Encrypt's limit of five failed authorizations per hostname per hour.
|
|
892
|
+
# Tripping that limit is what would otherwise delay the certificate at the
|
|
893
|
+
# moment of the cutover. Held domains are re-checked on this interval and
|
|
894
|
+
# issued as soon as the domain arrives, so the cutover costs one interval
|
|
895
|
+
# rather than a backoff step.
|
|
896
|
+
#
|
|
897
|
+
# The default is 60. A negative value switches release probing off, leaving
|
|
898
|
+
# a held domain to wait out its backoff. Zones covered by a DNS-01 provider
|
|
899
|
+
# skip all of this: DNS-01 never depends on where a domain points, so their
|
|
900
|
+
# certificates can be issued well before a cutover.
|
|
901
|
+
#
|
|
902
|
+
# `dash proxy domains list` shows what is held and why; `dash proxy domains
|
|
903
|
+
# retry HOST` clears a hold when you already know the cause is fixed.
|
|
904
|
+
#
|
|
905
|
+
# `credentials` names entries in `.dash/secrets` to pass to the proxy
|
|
884
906
|
# container as environment variables - the API credentials your DNS provider
|
|
885
907
|
# needs (`CF_DNS_API_TOKEN`, `LOOPIA_API_USER`, ...). Name them exactly as the
|
|
886
908
|
# provider expects them, since the name is what reaches the container.
|
|
@@ -899,6 +921,7 @@ proxy:
|
|
|
899
921
|
default: route53
|
|
900
922
|
prefer_wildcard: true
|
|
901
923
|
http_fallback: false
|
|
924
|
+
release_probe_interval: 60
|
|
902
925
|
directory: https://acme-staging-v02.api.letsencrypt.org/directory
|
|
903
926
|
credentials:
|
|
904
927
|
- CF_DNS_API_TOKEN
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
# Using a local container registry
|
|
6
6
|
#
|
|
7
|
-
# If the registry server starts with `localhost`,
|
|
7
|
+
# If the registry server starts with `localhost`, dash will start a local Docker registry
|
|
8
8
|
# on that port and push the app image to it.
|
|
9
9
|
registry:
|
|
10
10
|
server: localhost:5555
|
|
@@ -15,13 +15,13 @@ registry:
|
|
|
15
15
|
# set up a private repository before deploying, or change the default repository privacy
|
|
16
16
|
# settings to private in your [Docker Hub settings](https://hub.docker.com/repository-settings/default-privacy).
|
|
17
17
|
#
|
|
18
|
-
# A reference to a secret (in this case, `
|
|
18
|
+
# A reference to a secret (in this case, `DASH_REGISTRY_PASSWORD`) will look up the secret
|
|
19
19
|
# in the local environment:
|
|
20
20
|
registry:
|
|
21
21
|
username:
|
|
22
22
|
- <your docker hub username>
|
|
23
23
|
password:
|
|
24
|
-
-
|
|
24
|
+
- DASH_REGISTRY_PASSWORD
|
|
25
25
|
|
|
26
26
|
# Using AWS ECR as the container registry
|
|
27
27
|
#
|
|
@@ -45,7 +45,7 @@ registry:
|
|
|
45
45
|
# base64 -i /path/to/key.json | tr -d "\\n"
|
|
46
46
|
# ```
|
|
47
47
|
#
|
|
48
|
-
# You'll then need to set the `
|
|
48
|
+
# You'll then need to set the `DASH_REGISTRY_PASSWORD` secret to that value.
|
|
49
49
|
#
|
|
50
50
|
# Use the environment variable as the password along with `_json_key_base64` as the username.
|
|
51
51
|
# Here’s the final configuration:
|
|
@@ -53,7 +53,7 @@ registry:
|
|
|
53
53
|
server: <your registry region>-docker.pkg.dev
|
|
54
54
|
username: _json_key_base64
|
|
55
55
|
password:
|
|
56
|
-
-
|
|
56
|
+
- DASH_REGISTRY_PASSWORD
|
|
57
57
|
|
|
58
58
|
# Validating the configuration
|
|
59
59
|
#
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class Dash::Configuration::Env::Tag
|
|
2
2
|
attr_reader :name, :config, :secrets
|
|
3
3
|
|
|
4
4
|
def initialize(name, config:, secrets:)
|
|
@@ -8,6 +8,6 @@ class Kamal::Configuration::Env::Tag
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def env
|
|
11
|
-
|
|
11
|
+
Dash::Configuration::Env.new(config: config, secrets: secrets)
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
class
|
|
2
|
-
include
|
|
1
|
+
class Dash::Configuration::Env
|
|
2
|
+
include Dash::Configuration::Validation
|
|
3
3
|
|
|
4
4
|
attr_reader :context, :clear, :secrets, :secret_keys
|
|
5
|
-
delegate :argumentize, to:
|
|
5
|
+
delegate :argumentize, to: Dash::Utils
|
|
6
6
|
|
|
7
7
|
def initialize(config:, secrets:, context: "env")
|
|
8
8
|
@clear = config.fetch("clear", config.key?("secret") || config.key?("tags") ? {} : config)
|
|
9
9
|
@secrets = secrets
|
|
10
10
|
@secret_keys = config.fetch("secret", [])
|
|
11
11
|
@context = context
|
|
12
|
-
validate! config, context: context, with:
|
|
12
|
+
validate! config, context: context, with: Dash::Configuration::Validator::Env
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def clear_args
|
|
@@ -17,7 +17,7 @@ class Kamal::Configuration::Env
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def secrets_io
|
|
20
|
-
|
|
20
|
+
Dash::EnvFile.new(aliased_secrets).to_io
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def merge(other)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class Dash::Configuration::Loadbalancer < Dash::Configuration::Proxy
|
|
2
2
|
CONTAINER_NAME = "load-balancer".freeze
|
|
3
3
|
SHARED_CONTAINER_NAME = "kamal-proxy".freeze
|
|
4
4
|
|
|
@@ -40,7 +40,7 @@ class Kamal::Configuration::Loadbalancer < Kamal::Configuration::Proxy
|
|
|
40
40
|
# mount and the run command) to boot from, so fall back to an empty config
|
|
41
41
|
# rather than to nil.
|
|
42
42
|
def run
|
|
43
|
-
@run ||=
|
|
43
|
+
@run ||= Dash::Configuration::Proxy::Run.new(config, run_config: {})
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
# Docker options for the load balancer container: publish/logging/options
|
|
@@ -100,7 +100,7 @@ class Kamal::Configuration::Loadbalancer < Kamal::Configuration::Proxy
|
|
|
100
100
|
|
|
101
101
|
private
|
|
102
102
|
# The edge half of the layering contract (see
|
|
103
|
-
#
|
|
103
|
+
# Dash::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS): the load
|
|
104
104
|
# balancer applies the edge and shared concerns, and leaves the per-app
|
|
105
105
|
# ones to the per-host proxies it forwards to.
|
|
106
106
|
def retained_dispositions
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
class
|
|
2
|
-
delegate :optionize, :argumentize, to:
|
|
1
|
+
class Dash::Configuration::Logging
|
|
2
|
+
delegate :optionize, :argumentize, to: Dash::Utils
|
|
3
3
|
|
|
4
|
-
include
|
|
4
|
+
include Dash::Configuration::Validation
|
|
5
5
|
|
|
6
6
|
attr_reader :logging_config
|
|
7
7
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
class
|
|
2
|
-
include
|
|
1
|
+
class Dash::Configuration::Output
|
|
2
|
+
include Dash::Configuration::Validation
|
|
3
3
|
|
|
4
4
|
LOGGER_TYPES = {
|
|
5
|
-
"otel" => "
|
|
6
|
-
"file" => "
|
|
5
|
+
"otel" => "Dash::Output::OtelLogger",
|
|
6
|
+
"file" => "Dash::Output::FileLogger"
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
attr_reader :output_config, :loggers
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# Credentials go the other way, through an env file uploaded at mode 0600. A DNS
|
|
9
9
|
# API token can rewrite your zone; `docker run --env TOKEN=...` would put it in
|
|
10
10
|
# the host's process listing and in kamal's own audit log.
|
|
11
|
-
class
|
|
11
|
+
class Dash::Configuration::Proxy::Acme
|
|
12
12
|
# The canonical provider names kamal-proxy MINIMUM_VERSION advertises. Kept in
|
|
13
13
|
# step with the proxy by test/proxy_flag_coverage_test.rb, which compares this
|
|
14
14
|
# list against the manifest bin/sync-proxy-flags generates from the image.
|
|
@@ -53,7 +53,7 @@ class Kamal::Configuration::Proxy::Acme
|
|
|
53
53
|
# as a stray argument. Both booleans default to true in the proxy, which makes
|
|
54
54
|
# false the value an operator actually writes.
|
|
55
55
|
def run_command_args
|
|
56
|
-
|
|
56
|
+
Dash::Utils.optionize(run_command_options, with: "=")
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# compact, not compact_blank: false is a meaningful value for both booleans.
|
|
@@ -63,7 +63,8 @@ class Kamal::Configuration::Proxy::Acme
|
|
|
63
63
|
"acme-dns-provider": dns_provider_entries,
|
|
64
64
|
"acme-directory": acme_config["directory"],
|
|
65
65
|
"acme-prefer-wildcard": acme_config["prefer_wildcard"],
|
|
66
|
-
"acme-http-fallback": acme_config["http_fallback"]
|
|
66
|
+
"acme-http-fallback": acme_config["http_fallback"],
|
|
67
|
+
"acme-release-probe-interval": Dash::Utils.seconds_duration(acme_config["release_probe_interval"])
|
|
67
68
|
}.compact
|
|
68
69
|
end
|
|
69
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
class
|
|
1
|
+
class Dash::Configuration::Proxy::Boot
|
|
2
2
|
attr_reader :config
|
|
3
|
-
delegate :argumentize, :optionize, to:
|
|
3
|
+
delegate :argumentize, :optionize, to: Dash::Utils
|
|
4
4
|
|
|
5
5
|
def initialize(config:)
|
|
6
6
|
@config = config
|
|
@@ -11,8 +11,8 @@ class Kamal::Configuration::Proxy::Boot
|
|
|
11
11
|
|
|
12
12
|
(bind_ips || [ nil ]).map do |bind_ip|
|
|
13
13
|
bind_ip = format_bind_ip(bind_ip)
|
|
14
|
-
publish_http = [ bind_ip, http_port,
|
|
15
|
-
publish_https = [ bind_ip, https_port,
|
|
14
|
+
publish_http = [ bind_ip, http_port, Dash::Configuration::Proxy::Run::DEFAULT_HTTP_PORT ].compact.join(":")
|
|
15
|
+
publish_https = [ bind_ip, https_port, Dash::Configuration::Proxy::Run::DEFAULT_HTTPS_PORT ].compact.join(":")
|
|
16
16
|
|
|
17
17
|
argumentize "--publish", [ publish_http, publish_https ]
|
|
18
18
|
end.join(" ")
|
|
@@ -24,8 +24,8 @@ class Kamal::Configuration::Proxy::Boot
|
|
|
24
24
|
|
|
25
25
|
def default_boot_options
|
|
26
26
|
[
|
|
27
|
-
*(publish_args(
|
|
28
|
-
*(logging_args(
|
|
27
|
+
*(publish_args(Dash::Configuration::Proxy::Run::DEFAULT_HTTP_PORT, Dash::Configuration::Proxy::Run::DEFAULT_HTTPS_PORT, nil)),
|
|
28
|
+
*(logging_args(Dash::Configuration::Proxy::Run::DEFAULT_LOG_MAX_SIZE))
|
|
29
29
|
]
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -76,7 +76,7 @@ class Kamal::Configuration::Proxy::Boot
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def apps_volume
|
|
79
|
-
|
|
79
|
+
Dash::Configuration::Volume.new \
|
|
80
80
|
host_path: apps_directory,
|
|
81
81
|
container_path: apps_container_directory
|
|
82
82
|
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
class
|
|
2
|
-
MINIMUM_VERSION = "v1.0.0.
|
|
1
|
+
class Dash::Configuration::Proxy::Run
|
|
2
|
+
MINIMUM_VERSION = "v1.0.0.7"
|
|
3
3
|
DEFAULT_HTTP_PORT = 80
|
|
4
4
|
DEFAULT_HTTPS_PORT = 443
|
|
5
5
|
DEFAULT_LOG_MAX_SIZE = "10m"
|
|
6
6
|
|
|
7
7
|
# One env file for everything the proxy must know but nothing may print:
|
|
8
8
|
# ACME DNS credentials and the cache store URL. Also referenced by
|
|
9
|
-
#
|
|
9
|
+
# Dash::Commands::Proxy#remove_proxy_secrets_file, which cleans it up when
|
|
10
10
|
# the config no longer needs it.
|
|
11
11
|
SECRETS_FILENAME = "secrets.env"
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
15
15
|
DIGEST_SCHEMA_VERSION = "v1"
|
|
16
16
|
|
|
17
17
|
attr_reader :config, :run_config
|
|
18
|
-
delegate :argumentize, :optionize, :seconds_duration, to:
|
|
18
|
+
delegate :argumentize, :optionize, :seconds_duration, to: Dash::Utils
|
|
19
19
|
|
|
20
20
|
def initialize(config, run_config:, context: "proxy/run")
|
|
21
21
|
@config = config
|
|
@@ -43,7 +43,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def acme
|
|
46
|
-
@acme ||=
|
|
46
|
+
@acme ||= Dash::Configuration::Proxy::Acme.new(acme_config: run_config["acme"], secrets: config.secrets)
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def debug?
|
|
@@ -194,7 +194,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
194
194
|
# wakes - which the operator sees as one hung request, not as a misconfiguration.
|
|
195
195
|
def docker_socket_args
|
|
196
196
|
if docker_socket.present?
|
|
197
|
-
|
|
197
|
+
Dash::Configuration::Volume.new(host_path: docker_socket, container_path: docker_socket).docker_args
|
|
198
198
|
end
|
|
199
199
|
end
|
|
200
200
|
|
|
@@ -212,7 +212,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
212
212
|
end
|
|
213
213
|
|
|
214
214
|
def secrets_io
|
|
215
|
-
|
|
215
|
+
Dash::EnvFile.new(acme.credentials_env.merge(cache_store_env)).to_io
|
|
216
216
|
end
|
|
217
217
|
|
|
218
218
|
def host_directory
|
|
@@ -228,7 +228,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
228
228
|
end
|
|
229
229
|
|
|
230
230
|
def apps_volume
|
|
231
|
-
|
|
231
|
+
Dash::Configuration::Volume.new \
|
|
232
232
|
host_path: apps_directory,
|
|
233
233
|
container_path: apps_container_directory
|
|
234
234
|
end
|
|
@@ -255,7 +255,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
255
255
|
end
|
|
256
256
|
|
|
257
257
|
# Whether an operator turned on PROXY protocol without saying who may speak
|
|
258
|
-
# it.
|
|
258
|
+
# it. Dash::Configuration warns about this: the header rewrites the
|
|
259
259
|
# connecting address that allow_ips and rate_limit key on, so honouring it
|
|
260
260
|
# from anywhere is a client-IP spoofing hole.
|
|
261
261
|
def proxy_protocol_unrestricted?
|
|
@@ -264,7 +264,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
264
264
|
|
|
265
265
|
private
|
|
266
266
|
# The proxy's own listeners and process-level behaviour, as opposed to the
|
|
267
|
-
# per-service deadlines in
|
|
267
|
+
# per-service deadlines in Dash::Configuration::Proxy#deploy_options. Zero
|
|
268
268
|
# disables each of the timeouts, so it is a value rather than an absence.
|
|
269
269
|
def server_options
|
|
270
270
|
{
|
|
@@ -295,7 +295,7 @@ class Kamal::Configuration::Proxy::Run
|
|
|
295
295
|
conflicts = flags.keys.map(&:to_s) & named_run_command_options.keys.map(&:to_s)
|
|
296
296
|
return true if conflicts.empty?
|
|
297
297
|
|
|
298
|
-
raise
|
|
298
|
+
raise Dash::ConfigurationError,
|
|
299
299
|
"#{@context}/flags: #{conflicts.sort.join(", ")} is already set by a named key - remove one of them"
|
|
300
300
|
end
|
|
301
301
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
class
|
|
2
|
-
include
|
|
1
|
+
class Dash::Configuration::Proxy
|
|
2
|
+
include Dash::Configuration::Validation
|
|
3
3
|
|
|
4
4
|
DEFAULT_LOG_REQUEST_HEADERS = [ "Cache-Control", "Last-Modified", "User-Agent" ]
|
|
5
5
|
CONTAINER_NAME = "kamal-proxy"
|
|
@@ -163,12 +163,12 @@ class Kamal::Configuration::Proxy
|
|
|
163
163
|
# where it matters.
|
|
164
164
|
def self.disposition(key)
|
|
165
165
|
DEPLOY_OPTION_DISPOSITIONS.fetch(key) do
|
|
166
|
-
raise
|
|
167
|
-
"proxy deploy option --#{key} has no layering disposition - add it to
|
|
166
|
+
raise Dash::ConfigurationError,
|
|
167
|
+
"proxy deploy option --#{key} has no layering disposition - add it to Dash::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS"
|
|
168
168
|
end
|
|
169
169
|
end
|
|
170
170
|
|
|
171
|
-
delegate :argumentize, :optionize, :seconds_duration, to:
|
|
171
|
+
delegate :argumentize, :optionize, :seconds_duration, to: Dash::Utils
|
|
172
172
|
|
|
173
173
|
attr_reader :config, :proxy_config, :role_name, :run, :secrets
|
|
174
174
|
|
|
@@ -182,8 +182,8 @@ class Kamal::Configuration::Proxy
|
|
|
182
182
|
@role_name = role_name
|
|
183
183
|
@load_balanced = load_balanced
|
|
184
184
|
@secrets = secrets
|
|
185
|
-
validate! @proxy_config, with:
|
|
186
|
-
@run =
|
|
185
|
+
validate! @proxy_config, with: Dash::Configuration::Validator::Proxy, context: context
|
|
186
|
+
@run = Dash::Configuration::Proxy::Run.new(config, run_config: @proxy_config["run"], context: "#{context}/run") if @proxy_config && @proxy_config["run"].present?
|
|
187
187
|
end
|
|
188
188
|
|
|
189
189
|
def app_port
|
|
@@ -274,7 +274,7 @@ class Kamal::Configuration::Proxy
|
|
|
274
274
|
ssl_config["on_demand_url"]
|
|
275
275
|
end
|
|
276
276
|
|
|
277
|
-
# The name of a secret in .
|
|
277
|
+
# The name of a secret in .dash/secrets holding the CA bundle client
|
|
278
278
|
# certificates must chain to - mirroring ssl.certificate_pem, not a local
|
|
279
279
|
# file path. Kamal uploads the content into the app's TLS directory, which
|
|
280
280
|
# the proxy container already mounts, and hands the proxy the path it sees
|
|
@@ -294,7 +294,7 @@ class Kamal::Configuration::Proxy
|
|
|
294
294
|
def client_ca_pem_content
|
|
295
295
|
secrets[client_ca_pem].tap do |content|
|
|
296
296
|
if content.blank?
|
|
297
|
-
raise
|
|
297
|
+
raise Dash::ConfigurationError, "proxy/ssl: client_ca_pem secret '#{client_ca_pem}' is empty"
|
|
298
298
|
end
|
|
299
299
|
end
|
|
300
300
|
end
|
|
@@ -405,7 +405,7 @@ class Kamal::Configuration::Proxy
|
|
|
405
405
|
private
|
|
406
406
|
# Which dispositions this layer keeps. The per-app proxy behind a load
|
|
407
407
|
# balancer sheds the edge concerns; without load balancing there is no
|
|
408
|
-
# other layer to defer to.
|
|
408
|
+
# other layer to defer to. Dash::Configuration::Loadbalancer overrides
|
|
409
409
|
# this to keep the edge and shed the per-app concerns.
|
|
410
410
|
def retained_dispositions
|
|
411
411
|
load_balancing? ? %i[ per_app both ] : %i[ edge per_app both ]
|
|
@@ -417,7 +417,7 @@ class Kamal::Configuration::Proxy
|
|
|
417
417
|
|
|
418
418
|
# Auto-activation needs a role the load balancer can actually front. The
|
|
419
419
|
# target list is built from roles where `running_proxy?` (see
|
|
420
|
-
#
|
|
420
|
+
# Dash::Cli::Proxy#loadbalancer), so a proxy-less primary role would boot a
|
|
421
421
|
# load balancer with an empty --target. An explicit `loadbalancer:` setting
|
|
422
422
|
# skips this check — the operator asked for it.
|
|
423
423
|
def auto_load_balanced_primary_role?
|
|
@@ -473,7 +473,7 @@ class Kamal::Configuration::Proxy
|
|
|
473
473
|
# app hosts have the docker socket and the containers).
|
|
474
474
|
#
|
|
475
475
|
# Sleep needs the container runtime socket, which is a run-level setting -
|
|
476
|
-
#
|
|
476
|
+
# Dash::Configuration#ensure_sleep_has_a_docker_socket refuses the pairing
|
|
477
477
|
# rather than letting the first request after an idle period hang.
|
|
478
478
|
def lifecycle_options
|
|
479
479
|
affinity = proxy_config["session_affinity"] || {}
|
|
@@ -602,7 +602,7 @@ class Kamal::Configuration::Proxy
|
|
|
602
602
|
|
|
603
603
|
# kamal-proxy takes the credential as <username>:<password> and cuts at the
|
|
604
604
|
# first colon, so a password may contain colons but a username may not (the
|
|
605
|
-
# validator enforces that). The password is read from .
|
|
605
|
+
# validator enforces that). The password is read from .dash/secrets when
|
|
606
606
|
# password_secret names it, so it need not live in deploy.yml.
|
|
607
607
|
def basic_auth_credential
|
|
608
608
|
basic_auth = proxy_config["basic_auth"]
|
|
@@ -619,13 +619,13 @@ class Kamal::Configuration::Proxy
|
|
|
619
619
|
# means the named secret resolved empty. Fail rather than drop the flag —
|
|
620
620
|
# silently deploying an unprotected service is the worse outcome.
|
|
621
621
|
if password.blank?
|
|
622
|
-
raise
|
|
622
|
+
raise Dash::ConfigurationError, "proxy/basic_auth: password_secret '#{secret_name}' is empty"
|
|
623
623
|
end
|
|
624
624
|
|
|
625
625
|
# Sensitive, so SSHKit redacts the credential wherever kamal prints the
|
|
626
626
|
# deploy command - at :info verbosity it used to land in plain text
|
|
627
627
|
# (registry-login precedent; Utils.optionize passes the marking through).
|
|
628
|
-
|
|
628
|
+
Dash::Utils.sensitive("#{basic_auth["username"]}:#{password}")
|
|
629
629
|
end
|
|
630
630
|
|
|
631
631
|
# Serves both --path-timeout and --path-request-timeout, which kamal-proxy
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
class
|
|
2
|
-
include
|
|
1
|
+
class Dash::Configuration::Registry
|
|
2
|
+
include Dash::Configuration::Validation
|
|
3
3
|
|
|
4
4
|
def initialize(config:, secrets:, context: "registry")
|
|
5
5
|
@registry_config = config["registry"] || {}
|
|
6
6
|
@secrets = secrets
|
|
7
|
-
validate! registry_config, context: context, with:
|
|
7
|
+
validate! registry_config, context: context, with: Dash::Configuration::Validator::Registry
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def server
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class Dash::Configuration::Role::Healthcheck
|
|
2
2
|
DEFAULT_PATH = "/up"
|
|
3
3
|
DEFAULT_INTERVAL = 1
|
|
4
4
|
|
|
@@ -7,7 +7,7 @@ class Kamal::Configuration::Role::Healthcheck
|
|
|
7
7
|
DOCKER_ONLY_KEYS = %w[ cmd port path interval timeout retries start_period start_interval ]
|
|
8
8
|
|
|
9
9
|
attr_reader :healthcheck_config, :context
|
|
10
|
-
delegate :optionize, to:
|
|
10
|
+
delegate :optionize, to: Dash::Utils
|
|
11
11
|
|
|
12
12
|
def initialize(healthcheck_config:, context: "healthcheck")
|
|
13
13
|
@healthcheck_config = healthcheck_config
|
|
@@ -90,6 +90,6 @@ class Kamal::Configuration::Role::Healthcheck
|
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
def error(message, context: nil)
|
|
93
|
-
raise
|
|
93
|
+
raise Dash::ConfigurationError, "#{[ @context, context ].compact.join("/")}: #{message}"
|
|
94
94
|
end
|
|
95
95
|
end
|