Proxy boot config

Add commands for managing proxy boot config. Since the proxy can be
shared by multiple applications, the configuration doesn't belong in
`config/deploy.yml`.

Instead you can set the config with:

```
Usage:
  kamal proxy boot_config <set|get|clear>

Options:
      [--publish], [--no-publish], [--skip-publish]   # Publish the proxy ports on the host
                                                      # Default: true
      [--http-port=N]                                 # HTTP port to publish on the host
                                                      # Default: 80
      [--https-port=N]                                # HTTPS port to publish on the host
                                                      # Default: 443
      [--docker-options=option=value option2=value2]  # Docker options to pass to the proxy container
```

By default we boot the proxy with `--publish 80:80 --publish 443:443`.

You can stop it from publishing ports, specify different ports and pass
other docker options.

The config is stored in `.kamal/proxy/options` as arguments to be passed
verbatim to docker run.

Where someone wants to set the options in their application they can do
that by calling `kamal proxy boot_config set` in a pre-deploy hook.

There's an example in the integration tests showing how to use this to
front kamal-proxy with Traefik, using an accessory.
This commit is contained in:
Donal McBreen
2024-09-25 14:31:10 -04:00
parent e71bfcbadd
commit f6851048a6
15 changed files with 241 additions and 31 deletions

View File

@@ -88,6 +88,14 @@ class MainTest < IntegrationTest
end
test "setup and remove" do
@app = "app_with_roles"
kamal :proxy, :set_config,
"--publish=false",
"--options=label=traefik.http.services.kamal_proxy.loadbalancer.server.scheme=http",
"label=traefik.http.routers.kamal_proxy.rule=PathPrefix\\\(\\\`/\\\`\\\)",
"label=traefik.http.routers.kamal_proxy.priority=2"
# Check remove completes when nothing has been setup yet
kamal :remove, "-y"
assert_no_images_or_containers
@@ -123,6 +131,15 @@ class MainTest < IntegrationTest
assert_proxy_not_running
end
test "deploy with traefik" do
@app = "app_with_traefik"
first_version = latest_app_version
kamal :setup
assert_app_is_up version: first_version
end
private
def assert_envs(version:)
assert_env :CLEAR_TOKEN, "4321", version: version, vm: :vm1