From b151192394260eb91bb862ae98fdbf2a7c6f0058 Mon Sep 17 00:00:00 2001 From: Petr Hlavicka Date: Sat, 19 Jul 2025 14:52:54 +0200 Subject: [PATCH 1/5] enable key --- plugins/caddy-vhosts/subcommands/set | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/caddy-vhosts/subcommands/set b/plugins/caddy-vhosts/subcommands/set index 99954cf3e..39dc3daa2 100755 --- a/plugins/caddy-vhosts/subcommands/set +++ b/plugins/caddy-vhosts/subcommands/set @@ -9,13 +9,13 @@ cmd-caddy-set() { declare cmd="caddy:set" [[ "$1" == "$cmd" ]] && shift 1 declare APP="$1" KEY="$2" VALUE="$3" - local VALID_KEYS=("image" "letsencrypt-email" "letsencrypt-server" "log-level" "polling-interval" "tls-internal") + local VALID_KEYS=("image" "letsencrypt-email" "letsencrypt-server" "log-level" "polling-interval" "label-key" "tls-internal") local GLOBAL_KEYS=("image" "letsencrypt-email" "letsencrypt-server" "log-level" "polling-interval") [[ -z "$KEY" ]] && dokku_log_fail "No key specified" if ! fn-in-array "$KEY" "${VALID_KEYS[@]}"; then - dokku_log_fail "Invalid key specified, valid keys include: image letsencrypt-email letsencrypt-server log-level polling-interval tls-internal" + dokku_log_fail "Invalid key specified, valid keys include: image letsencrypt-email letsencrypt-server log-level polling-interval label-key tls-internal" fi if ! fn-in-array "$KEY" "${GLOBAL_KEYS[@]}"; then From 22c3d3487731f7fdaebd719e1c1f927bb8c56ee6 Mon Sep 17 00:00:00 2001 From: Petr Hlavicka Date: Sat, 19 Jul 2025 14:54:01 +0200 Subject: [PATCH 2/5] add get function --- plugins/caddy-vhosts/internal-functions | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/caddy-vhosts/internal-functions b/plugins/caddy-vhosts/internal-functions index 86727e364..88758f732 100755 --- a/plugins/caddy-vhosts/internal-functions +++ b/plugins/caddy-vhosts/internal-functions @@ -71,3 +71,8 @@ fn-caddy-tls-internal() { declare APP="$1" fn-plugin-property-get-default "caddy" "$APP" "tls-internal" "false" } + +fn-caddy-label-key() { + declare APP="$1" + fn-plugin-property-get-default "caddy" "$APP" "label-key" "caddy" +} From 3c6796bd7b24c1d3da9b9c5d2f9dfc014661e07c Mon Sep 17 00:00:00 2001 From: Petr Hlavicka Date: Sat, 19 Jul 2025 15:02:57 +0200 Subject: [PATCH 3/5] use it --- plugins/caddy-vhosts/docker-args-process-deploy | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/caddy-vhosts/docker-args-process-deploy b/plugins/caddy-vhosts/docker-args-process-deploy index 65a9c9796..9dd1f61f1 100755 --- a/plugins/caddy-vhosts/docker-args-process-deploy +++ b/plugins/caddy-vhosts/docker-args-process-deploy @@ -8,7 +8,7 @@ trigger-caddy-vhosts-docker-args-process-deploy() { declare desc="nginx-vhosts core-post-deploy plugin trigger" declare trigger="docker-args-process-deploy" declare APP="$1" IMAGE_SOURCE_TYPE="$2" IMAGE_TAG="$3" PROC_TYPE="$4" CONTAINER_INDEX="$5" - local app_domains caddy_domains is_app_listening letsencrypt_email output proxy_container_port proxy_host_port port_map proxy_scheme proxy_schemes scheme tls_internal + local app_domains caddy_domains is_app_listening letsencrypt_email output proxy_container_port proxy_host_port port_map proxy_scheme proxy_schemes scheme tls_internal label_key local proxy_container_http_port proxy_container_http_port_candidate proxy_host_http_port_candidate local proxy_container_https_port proxy_container_https_port_candidate proxy_host_https_port_candidate local STDIN=$(cat) @@ -88,13 +88,14 @@ trigger-caddy-vhosts-docker-args-process-deploy() { if [[ -n "$is_app_listening" ]] && [[ -n "$caddy_domains" ]]; then has_443_mapping=false tls_internal="$(fn-caddy-tls-internal)" + label_key="$(fn-caddy-label-key "$APP")" if [[ -n "$proxy_container_https_port" ]] || [[ -n "$proxy_container_https_port_candidate" ]]; then has_443_mapping=true fi ssl_warning_mapping="https:443" if [[ "$tls_internal" == "true" ]]; then - output="--label caddy.tls=internal" + output="--label ${label_key}.tls=internal" if [[ "$has_443_mapping" == "false" ]]; then ssl_warning_mapping="http:80" proxy_host_https_port_candidate="$proxy_host_http_port_candidate" @@ -105,7 +106,7 @@ trigger-caddy-vhosts-docker-args-process-deploy() { scheme="http" if [[ -n "$letsencrypt_email" ]] && [[ "$has_443_mapping" == "true" ]]; then - output="--label 'caddy=${caddy_domains}'" + output="--label '${label_key}=${caddy_domains}'" scheme="https" if [[ -z "$proxy_container_https_port" ]]; then warning_scheme="$(awk -F ':' '{ print $1 }' <<<"$ssl_warning_mapping")" @@ -114,17 +115,17 @@ trigger-caddy-vhosts-docker-args-process-deploy() { proxy_container_https_port="$proxy_container_https_port_candidate" fi - output="$output --label \"caddy.reverse_proxy={{ upstreams $proxy_container_https_port }}\"" + output="$output --label \"${label_key}.reverse_proxy={{ upstreams $proxy_container_https_port }}\"" elif [[ -n "$proxy_container_http_port" ]] || [[ -n "$proxy_container_http_port_candidate" ]]; then caddy_domains="${caddy_domains//, /:80, }" - output="--label 'caddy=${caddy_domains}:80'" + output="--label '${label_key}=${caddy_domains}:80'" if [[ -z "$proxy_container_http_port" ]]; then dokku_log_warn "Warning: http:80 port mapping not found" dokku_log_warn "Utilizing first http port mapping, http:$proxy_host_http_port_candidate:$proxy_container_http_port_candidate" proxy_container_http_port="$proxy_container_http_port_candidate" fi - output="$output --label \"caddy.reverse_proxy={{ upstreams $proxy_container_http_port }}\"" + output="$output --label \"${label_key}.reverse_proxy={{ upstreams $proxy_container_http_port }}\"" fi fi From bf3b2d396bcda57181c19991e284347d4e0a0b5a Mon Sep 17 00:00:00 2001 From: Petr Hlavicka Date: Sat, 19 Jul 2025 15:37:17 +0200 Subject: [PATCH 4/5] update docs --- docs/networking/proxies/caddy.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/networking/proxies/caddy.md b/docs/networking/proxies/caddy.md index fe2f6b9c7..b56ab994d 100644 --- a/docs/networking/proxies/caddy.md +++ b/docs/networking/proxies/caddy.md @@ -117,6 +117,16 @@ dokku caddy:set --global log-level DEBUG After modifying, the Caddy container will need to be restarted. +### Changing the label key for the app + +The default label key for the app is `caddy`. This can be changed by setting the `label-key` property: + +```shell +dokku caddy:set node-js-app label-key caddy_0 +``` + +This will update the app's label key to `caddy_0`. The label key is used to identify the app in the Caddy configuration. If you change the label key, you will need to restart or rebuild the app to apply the updates. + ### SSL Configuration The caddy plugin only supports automatic ssl certificates from it's letsencrypt integration. Managed certificates provided by the `certs` plugin are ignored. From acf2c854d2485a221d27389dd550067aacabb9ec Mon Sep 17 00:00:00 2001 From: Petr Hlavicka Date: Sat, 19 Jul 2025 15:53:48 +0200 Subject: [PATCH 5/5] test --- tests/unit/caddy.bats | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/unit/caddy.bats b/tests/unit/caddy.bats index d48d41196..0155cda71 100644 --- a/tests/unit/caddy.bats +++ b/tests/unit/caddy.bats @@ -50,6 +50,34 @@ teardown() { assert_output_contains "python/http.server" } +@test "(caddy) custom label key" { + run /bin/bash -c "dokku builder-herokuish:set $TEST_APP allowed true" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:set $TEST_APP caddy" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku caddy:set $TEST_APP label-key caddy_0" + echo "output: $output" + echo "status: $status" + assert_success + + run deploy_app + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "docker inspect $TEST_APP.web.1 --format '{{ index .Config.Labels \"caddy_0\" }}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "$TEST_APP.${DOKKU_DOMAIN}:80" +} + @test "(caddy) multiple domains" { run /bin/bash -c "dokku proxy:set $TEST_APP caddy" echo "output: $output"