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.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/dash +2 -2
  4. data/lib/{kamal → dash}/cli/accessory.rb +24 -24
  5. data/lib/dash/cli/alias/command.rb +10 -0
  6. data/lib/{kamal → dash}/cli/app/assets.rb +2 -2
  7. data/lib/{kamal → dash}/cli/app/boot.rb +15 -15
  8. data/lib/{kamal → dash}/cli/app/error_pages.rb +6 -6
  9. data/lib/{kamal → dash}/cli/app/rollout_boot.rb +6 -6
  10. data/lib/{kamal → dash}/cli/app/ssl_certificates.rb +3 -3
  11. data/lib/{kamal → dash}/cli/app.rb +86 -86
  12. data/lib/{kamal → dash}/cli/base.rb +71 -47
  13. data/lib/dash/cli/build/clone.rb +59 -0
  14. data/lib/{kamal → dash}/cli/build/port_forwarding.rb +1 -1
  15. data/lib/{kamal → dash}/cli/build.rb +45 -45
  16. data/lib/{kamal → dash}/cli/doctor/config_checks.rb +3 -3
  17. data/lib/{kamal → dash}/cli/doctor/endpoint_checks.rb +25 -7
  18. data/lib/{kamal → dash}/cli/doctor/host_checks.rb +18 -18
  19. data/lib/{kamal → dash}/cli/doctor.rb +9 -9
  20. data/lib/{kamal → dash}/cli/healthcheck/barrier.rb +2 -2
  21. data/lib/{kamal → dash}/cli/healthcheck/drift_error.rb +2 -2
  22. data/lib/dash/cli/healthcheck/error.rb +2 -0
  23. data/lib/{kamal → dash}/cli/healthcheck/poller.rb +7 -7
  24. data/lib/{kamal → dash}/cli/lock.rb +1 -1
  25. data/lib/dash/cli/main/migrate.rb +77 -0
  26. data/lib/{kamal → dash}/cli/main.rb +77 -66
  27. data/lib/{kamal → dash}/cli/proxy/drift.rb +3 -3
  28. data/lib/{kamal → dash}/cli/proxy/loadbalancer_claim.rb +3 -3
  29. data/lib/{kamal → dash}/cli/proxy/loadbalancer_reboot.rb +22 -22
  30. data/lib/{kamal → dash}/cli/proxy/reboot.rb +15 -15
  31. data/lib/{kamal → dash}/cli/proxy.rb +166 -154
  32. data/lib/{kamal → dash}/cli/prune.rb +10 -10
  33. data/lib/{kamal → dash}/cli/registry.rb +11 -11
  34. data/lib/{kamal → dash}/cli/secrets.rb +3 -3
  35. data/lib/{kamal → dash}/cli/server.rb +14 -14
  36. data/lib/{kamal → dash}/cli/templates/deploy.yml +4 -4
  37. data/lib/dash/cli/templates/sample_hooks/docker-setup.sample +3 -0
  38. data/lib/dash/cli/templates/sample_hooks/post-app-boot.sample +3 -0
  39. data/lib/dash/cli/templates/sample_hooks/post-app-stop.sample +9 -0
  40. data/lib/dash/cli/templates/sample_hooks/post-deploy.sample +14 -0
  41. data/lib/dash/cli/templates/sample_hooks/post-proxy-deploy.sample +3 -0
  42. data/lib/dash/cli/templates/sample_hooks/post-proxy-reboot.sample +3 -0
  43. data/lib/dash/cli/templates/sample_hooks/pre-app-boot.sample +3 -0
  44. data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-app-stop.sample +2 -2
  45. data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-build.sample +8 -8
  46. data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-connect.sample +8 -8
  47. data/lib/{kamal → dash}/cli/templates/sample_hooks/pre-deploy.sample +9 -9
  48. data/lib/dash/cli/templates/sample_hooks/pre-proxy-deploy.sample +3 -0
  49. data/lib/dash/cli/templates/sample_hooks/pre-proxy-reboot.sample +3 -0
  50. data/lib/{kamal → dash}/cli/templates/secrets +6 -6
  51. data/lib/{kamal → dash}/cli.rb +2 -2
  52. data/lib/{kamal → dash}/commander/specifics.rb +2 -2
  53. data/lib/{kamal → dash}/commander.rb +31 -23
  54. data/lib/{kamal → dash}/commands/accessory/proxy.rb +1 -1
  55. data/lib/{kamal → dash}/commands/accessory.rb +2 -2
  56. data/lib/{kamal → dash}/commands/app/assets.rb +1 -1
  57. data/lib/{kamal → dash}/commands/app/containers.rb +1 -1
  58. data/lib/{kamal → dash}/commands/app/error_pages.rb +2 -2
  59. data/lib/{kamal → dash}/commands/app/execution.rb +1 -1
  60. data/lib/{kamal → dash}/commands/app/images.rb +1 -1
  61. data/lib/{kamal → dash}/commands/app/logging.rb +1 -1
  62. data/lib/{kamal → dash}/commands/app/proxy.rb +1 -1
  63. data/lib/{kamal → dash}/commands/app.rb +1 -1
  64. data/lib/{kamal → dash}/commands/auditor.rb +3 -7
  65. data/lib/{kamal → dash}/commands/base.rb +39 -3
  66. data/lib/{kamal → dash}/commands/builder/base.rb +2 -2
  67. data/lib/{kamal → dash}/commands/builder/clone.rb +3 -3
  68. data/lib/{kamal → dash}/commands/builder/cloud.rb +1 -1
  69. data/lib/{kamal → dash}/commands/builder/hybrid.rb +1 -1
  70. data/lib/{kamal → dash}/commands/builder/local.rb +1 -1
  71. data/lib/{kamal → dash}/commands/builder/pack.rb +1 -1
  72. data/lib/{kamal → dash}/commands/builder/remote.rb +1 -1
  73. data/lib/{kamal → dash}/commands/builder.rb +7 -7
  74. data/lib/{kamal → dash}/commands/docker.rb +1 -1
  75. data/lib/{kamal → dash}/commands/hook.rb +1 -1
  76. data/lib/{kamal → dash}/commands/loadbalancer.rb +9 -8
  77. data/lib/{kamal → dash}/commands/lock.rb +2 -2
  78. data/lib/{kamal → dash}/commands/proxy/cert_transfer.rb +2 -2
  79. data/lib/{kamal → dash}/commands/proxy.rb +20 -10
  80. data/lib/{kamal → dash}/commands/prune.rb +1 -1
  81. data/lib/dash/commands/registry.rb +44 -0
  82. data/lib/{kamal → dash}/commands/server.rb +1 -5
  83. data/lib/dash/commands.rb +2 -0
  84. data/lib/{kamal → dash}/configuration/accessory.rb +11 -11
  85. data/lib/{kamal → dash}/configuration/alias.rb +3 -3
  86. data/lib/{kamal → dash}/configuration/boot.rb +2 -2
  87. data/lib/{kamal → dash}/configuration/builder.rb +7 -7
  88. data/lib/{kamal → dash}/configuration/docs/builder.yml +3 -3
  89. data/lib/{kamal → dash}/configuration/docs/configuration.yml +12 -5
  90. data/lib/{kamal → dash}/configuration/docs/env.yml +10 -10
  91. data/lib/{kamal → dash}/configuration/docs/proxy.yml +31 -8
  92. data/lib/{kamal → dash}/configuration/docs/registry.yml +5 -5
  93. data/lib/{kamal → dash}/configuration/env/tag.rb +2 -2
  94. data/lib/{kamal → dash}/configuration/env.rb +5 -5
  95. data/lib/{kamal → dash}/configuration/loadbalancer.rb +3 -3
  96. data/lib/{kamal → dash}/configuration/logging.rb +3 -3
  97. data/lib/{kamal → dash}/configuration/output.rb +4 -4
  98. data/lib/{kamal → dash}/configuration/proxy/acme.rb +4 -3
  99. data/lib/{kamal → dash}/configuration/proxy/boot.rb +7 -7
  100. data/lib/{kamal → dash}/configuration/proxy/run.rb +11 -11
  101. data/lib/{kamal → dash}/configuration/proxy.rb +15 -15
  102. data/lib/{kamal → dash}/configuration/registry.rb +3 -3
  103. data/lib/{kamal → dash}/configuration/role/healthcheck.rb +3 -3
  104. data/lib/{kamal → dash}/configuration/role.rb +12 -12
  105. data/lib/{kamal → dash}/configuration/servers.rb +4 -4
  106. data/lib/{kamal → dash}/configuration/ssh.rb +2 -2
  107. data/lib/{kamal → dash}/configuration/sshkit.rb +2 -2
  108. data/lib/{kamal → dash}/configuration/validation.rb +2 -2
  109. data/lib/{kamal → dash}/configuration/validator/accessory.rb +1 -1
  110. data/lib/{kamal → dash}/configuration/validator/alias.rb +2 -2
  111. data/lib/{kamal → dash}/configuration/validator/builder.rb +1 -1
  112. data/lib/dash/configuration/validator/configuration.rb +6 -0
  113. data/lib/{kamal → dash}/configuration/validator/env.rb +2 -2
  114. data/lib/{kamal → dash}/configuration/validator/proxy.rb +8 -8
  115. data/lib/{kamal → dash}/configuration/validator/registry.rb +1 -1
  116. data/lib/{kamal → dash}/configuration/validator/role.rb +1 -1
  117. data/lib/{kamal → dash}/configuration/validator/servers.rb +1 -1
  118. data/lib/{kamal → dash}/configuration/validator.rb +4 -4
  119. data/lib/{kamal → dash}/configuration/volume.rb +2 -2
  120. data/lib/{kamal → dash}/configuration.rb +39 -29
  121. data/lib/{kamal → dash}/docker.rb +1 -1
  122. data/lib/{kamal → dash}/env_file.rb +1 -1
  123. data/lib/{kamal → dash}/git.rb +1 -1
  124. data/lib/{kamal → dash}/otel_shipper.rb +3 -3
  125. data/lib/{kamal → dash}/output/base_logger.rb +1 -1
  126. data/lib/{kamal → dash}/output/file_logger.rb +1 -1
  127. data/lib/{kamal → dash}/output/formatter.rb +1 -1
  128. data/lib/{kamal → dash}/output/otel_logger.rb +3 -3
  129. data/lib/dash/project_directory.rb +28 -0
  130. data/lib/{kamal → dash}/secrets/adapters/aws_secrets_manager.rb +1 -1
  131. data/lib/{kamal → dash}/secrets/adapters/base.rb +2 -2
  132. data/lib/{kamal → dash}/secrets/adapters/bitwarden.rb +1 -1
  133. data/lib/{kamal → dash}/secrets/adapters/bitwarden_secrets_manager.rb +1 -1
  134. data/lib/{kamal → dash}/secrets/adapters/doppler.rb +1 -1
  135. data/lib/{kamal → dash}/secrets/adapters/enpass.rb +1 -1
  136. data/lib/{kamal → dash}/secrets/adapters/gcp_secret_manager.rb +1 -1
  137. data/lib/{kamal → dash}/secrets/adapters/last_pass.rb +1 -1
  138. data/lib/{kamal → dash}/secrets/adapters/one_password.rb +2 -2
  139. data/lib/{kamal → dash}/secrets/adapters/passbolt.rb +1 -1
  140. data/lib/{kamal → dash}/secrets/adapters/test.rb +1 -1
  141. data/lib/{kamal → dash}/secrets/adapters.rb +2 -2
  142. data/lib/{kamal → dash}/secrets/dotenv/inline_command_substitution.rb +2 -2
  143. data/lib/{kamal → dash}/secrets.rb +6 -6
  144. data/lib/{kamal → dash}/tags.rb +8 -3
  145. data/lib/{kamal → dash}/utils/sensitive.rb +1 -1
  146. data/lib/{kamal → dash}/utils.rb +15 -5
  147. data/lib/dash/version.rb +3 -0
  148. data/lib/{kamal.rb → dash.rb} +4 -4
  149. metadata +156 -154
  150. data/lib/kamal/cli/alias/command.rb +0 -10
  151. data/lib/kamal/cli/build/clone.rb +0 -59
  152. data/lib/kamal/cli/healthcheck/error.rb +0 -2
  153. data/lib/kamal/cli/templates/sample_hooks/docker-setup.sample +0 -3
  154. data/lib/kamal/cli/templates/sample_hooks/post-app-boot.sample +0 -3
  155. data/lib/kamal/cli/templates/sample_hooks/post-app-stop.sample +0 -9
  156. data/lib/kamal/cli/templates/sample_hooks/post-deploy.sample +0 -14
  157. data/lib/kamal/cli/templates/sample_hooks/post-proxy-deploy.sample +0 -3
  158. data/lib/kamal/cli/templates/sample_hooks/post-proxy-reboot.sample +0 -3
  159. data/lib/kamal/cli/templates/sample_hooks/pre-app-boot.sample +0 -3
  160. data/lib/kamal/cli/templates/sample_hooks/pre-proxy-deploy.sample +0 -3
  161. data/lib/kamal/cli/templates/sample_hooks/pre-proxy-reboot.sample +0 -3
  162. data/lib/kamal/commands/registry.rb +0 -38
  163. data/lib/kamal/commands.rb +0 -2
  164. data/lib/kamal/configuration/validator/configuration.rb +0 -6
  165. data/lib/kamal/version.rb +0 -3
  166. /data/lib/{kamal → dash}/configuration/docs/accessory.yml +0 -0
  167. /data/lib/{kamal → dash}/configuration/docs/alias.yml +0 -0
  168. /data/lib/{kamal → dash}/configuration/docs/boot.yml +0 -0
  169. /data/lib/{kamal → dash}/configuration/docs/logging.yml +0 -0
  170. /data/lib/{kamal → dash}/configuration/docs/output.yml +0 -0
  171. /data/lib/{kamal → dash}/configuration/docs/role.yml +0 -0
  172. /data/lib/{kamal → dash}/configuration/docs/servers.yml +0 -0
  173. /data/lib/{kamal → dash}/configuration/docs/ssh.yml +0 -0
  174. /data/lib/{kamal → dash}/configuration/docs/sshkit.yml +0 -0
  175. /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
- # Kamal looks for `<secrets_path>-common` first and then `<secrets_path>`.
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
- # Directory to store dash runtime files in on the host, default `.kamal`:
175
- run_directory: /etc/kamal
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 Kamal configuration or
4
- # read from `.kamal/secrets`.
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
- # Kamal uses dotenv to automatically load environment variables from the configured secrets files.
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 `.kamal/secrets-common`. Kamal looks for
20
- # `.kamal/secrets-common` first, then `.kamal/secrets`, with later values overriding earlier ones.
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, Kamal looks for `.kamal/secrets-common` first, then
23
- # `.kamal/secrets.<destination>`. The non-destination `.kamal/secrets` file is not read when a
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 `KAMAL_REGISTRY_PASSWORD` or database passwords.
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
- # KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
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 `.kamal/secrets`, ensure that it is not checked into version control.
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
- # Kamal::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS - the layering
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 `.kamal/loadbalancer/services/<service>`
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
- # `.kamal/loadbalancer/run_config`. Another app booting with a different
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
- # `.kamal/secrets`; the content is uploaded next to the app's TLS material
165
- # under `.kamal/proxy/apps-config`, and the proxy is given the path it sees
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 `.kamal/secrets`, so the
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.6 # Version tag of the kamal-proxy image to use.
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
- # `credentials` names entries in `.kamal/secrets` to pass to the proxy
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`, Kamal will start a local Docker registry
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, `KAMAL_REGISTRY_PASSWORD`) will look up the secret
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
- - KAMAL_REGISTRY_PASSWORD
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 `KAMAL_REGISTRY_PASSWORD` secret to that value.
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
- - KAMAL_REGISTRY_PASSWORD
56
+ - DASH_REGISTRY_PASSWORD
57
57
 
58
58
  # Validating the configuration
59
59
  #
@@ -1,4 +1,4 @@
1
- class Kamal::Configuration::Env::Tag
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
- Kamal::Configuration::Env.new(config: config, secrets: secrets)
11
+ Dash::Configuration::Env.new(config: config, secrets: secrets)
12
12
  end
13
13
  end
@@ -1,15 +1,15 @@
1
- class Kamal::Configuration::Env
2
- include Kamal::Configuration::Validation
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: Kamal::Utils
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: Kamal::Configuration::Validator::Env
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
- Kamal::EnvFile.new(aliased_secrets).to_io
20
+ Dash::EnvFile.new(aliased_secrets).to_io
21
21
  end
22
22
 
23
23
  def merge(other)
@@ -1,4 +1,4 @@
1
- class Kamal::Configuration::Loadbalancer < Kamal::Configuration::Proxy
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 ||= Kamal::Configuration::Proxy::Run.new(config, run_config: {})
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
- # Kamal::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS): the load
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 Kamal::Configuration::Logging
2
- delegate :optionize, :argumentize, to: Kamal::Utils
1
+ class Dash::Configuration::Logging
2
+ delegate :optionize, :argumentize, to: Dash::Utils
3
3
 
4
- include Kamal::Configuration::Validation
4
+ include Dash::Configuration::Validation
5
5
 
6
6
  attr_reader :logging_config
7
7
 
@@ -1,9 +1,9 @@
1
- class Kamal::Configuration::Output
2
- include Kamal::Configuration::Validation
1
+ class Dash::Configuration::Output
2
+ include Dash::Configuration::Validation
3
3
 
4
4
  LOGGER_TYPES = {
5
- "otel" => "Kamal::Output::OtelLogger",
6
- "file" => "Kamal::Output::FileLogger"
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 Kamal::Configuration::Proxy::Acme
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
- Kamal::Utils.optionize(run_command_options, with: "=")
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 Kamal::Configuration::Proxy::Boot
1
+ class Dash::Configuration::Proxy::Boot
2
2
  attr_reader :config
3
- delegate :argumentize, :optionize, to: Kamal::Utils
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, Kamal::Configuration::Proxy::Run::DEFAULT_HTTP_PORT ].compact.join(":")
15
- publish_https = [ bind_ip, https_port, Kamal::Configuration::Proxy::Run::DEFAULT_HTTPS_PORT ].compact.join(":")
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(Kamal::Configuration::Proxy::Run::DEFAULT_HTTP_PORT, Kamal::Configuration::Proxy::Run::DEFAULT_HTTPS_PORT, nil)),
28
- *(logging_args(Kamal::Configuration::Proxy::Run::DEFAULT_LOG_MAX_SIZE))
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
- Kamal::Configuration::Volume.new \
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 Kamal::Configuration::Proxy::Run
2
- MINIMUM_VERSION = "v1.0.0.6"
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
- # Kamal::Commands::Proxy#remove_proxy_secrets_file, which cleans it up when
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: Kamal::Utils
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 ||= Kamal::Configuration::Proxy::Acme.new(acme_config: run_config["acme"], secrets: config.secrets)
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
- Kamal::Configuration::Volume.new(host_path: docker_socket, container_path: docker_socket).docker_args
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
- Kamal::EnvFile.new(acme.credentials_env.merge(cache_store_env)).to_io
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
- Kamal::Configuration::Volume.new \
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. Kamal::Configuration warns about this: the header rewrites the
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 Kamal::Configuration::Proxy#deploy_options. Zero
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 Kamal::ConfigurationError,
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 Kamal::Configuration::Proxy
2
- include Kamal::Configuration::Validation
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 Kamal::ConfigurationError,
167
- "proxy deploy option --#{key} has no layering disposition - add it to Kamal::Configuration::Proxy::DEPLOY_OPTION_DISPOSITIONS"
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: Kamal::Utils
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: Kamal::Configuration::Validator::Proxy, context: context
186
- @run = Kamal::Configuration::Proxy::Run.new(config, run_config: @proxy_config["run"], context: "#{context}/run") if @proxy_config && @proxy_config["run"].present?
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 .kamal/secrets holding the CA bundle client
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 Kamal::ConfigurationError, "proxy/ssl: client_ca_pem secret '#{client_ca_pem}' is empty"
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. Kamal::Configuration::Loadbalancer overrides
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
- # Kamal::Cli::Proxy#loadbalancer), so a proxy-less primary role would boot a
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
- # Kamal::Configuration#ensure_sleep_has_a_docker_socket refuses the pairing
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 .kamal/secrets when
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 Kamal::ConfigurationError, "proxy/basic_auth: password_secret '#{secret_name}' is empty"
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
- Kamal::Utils.sensitive("#{basic_auth["username"]}:#{password}")
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 Kamal::Configuration::Registry
2
- include Kamal::Configuration::Validation
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: Kamal::Configuration::Validator::Registry
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 Kamal::Configuration::Role::Healthcheck
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: Kamal::Utils
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 Kamal::ConfigurationError, "#{[ @context, context ].compact.join("/")}: #{message}"
93
+ raise Dash::ConfigurationError, "#{[ @context, context ].compact.join("/")}: #{message}"
94
94
  end
95
95
  end