mirror of
https://github.com/dokku/dokku.git
synced 2026-07-10 12:36:13 +02:00
Emitting the restart policy as a `--restart` argument from a `docker-args-process-deploy` trigger exposed a latent gluing bug: proxy and builder triggers concatenated `$STDIN$output` with no separator, and the scheduler and builders appended `docker-args-process-*` output directly onto the older `docker-args-*` output, so adjacent arguments could merge into values like `--restart=on-failure:10--label`. A space is now inserted at both the trigger echo and the concatenation so arguments always stay separated.
139 lines
5.7 KiB
Bash
Executable File
139 lines
5.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
|
source "$PLUGIN_AVAILABLE_PATH/proxy/functions"
|
|
source "$PLUGIN_AVAILABLE_PATH/haproxy-vhosts/internal-functions"
|
|
set -eo pipefail
|
|
[[ $DOKKU_TRACE ]] && set -x
|
|
|
|
trigger-haproxy-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 haproxy_domains is_app_listening letsencrypt_email output proxy_container_port proxy_host_port port_map proxy_scheme proxy_schemes scheme tls_internal
|
|
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 proxy_redirect_ssl
|
|
local STDIN=$(cat)
|
|
|
|
if [[ "$PROC_TYPE" != "web" ]]; then
|
|
return
|
|
fi
|
|
|
|
if [[ "$(plugn trigger proxy-type "$APP")" != "haproxy" ]]; then
|
|
return
|
|
fi
|
|
|
|
if [[ "$(plugn trigger proxy-is-enabled "$APP")" != "true" ]]; then
|
|
return
|
|
fi
|
|
|
|
if ! plugn trigger domains-vhost-enabled "$APP" 2>/dev/null; then
|
|
return
|
|
fi
|
|
|
|
# ensure we have a port mapping
|
|
plugn trigger ports-configure "$APP"
|
|
|
|
# gather port mapping information
|
|
# we only support proxying a single port for http and https listeners
|
|
# so this block parses the port mappings and tries to find the correct
|
|
# mapping to expose
|
|
is_app_listening="false"
|
|
while read -r port_map; do
|
|
proxy_scheme="$(awk -F ':' '{ print $1 }' <<<"$port_map")"
|
|
proxy_host_port="$(awk -F ':' '{ print $2 }' <<<"$port_map")"
|
|
proxy_container_port="$(awk -F ':' '{ print $3 }' <<<"$port_map")"
|
|
|
|
if [[ "$proxy_scheme" == "http" ]]; then
|
|
is_app_listening="true"
|
|
if [[ -z "$proxy_container_http_port_candidate" ]]; then
|
|
proxy_container_http_port_candidate="$proxy_container_port"
|
|
proxy_host_http_port_candidate="$proxy_host_port"
|
|
fi
|
|
|
|
if [[ "$proxy_host_port" == "80" ]] && [[ -z "$proxy_container_http_port" ]]; then
|
|
proxy_container_http_port="$proxy_container_port"
|
|
fi
|
|
fi
|
|
|
|
if [[ "$proxy_scheme" == "https" ]]; then
|
|
is_app_listening="true"
|
|
if [[ -z "$proxy_container_https_port_candidate" ]]; then
|
|
proxy_container_https_port_candidate="$proxy_container_port"
|
|
proxy_host_https_port_candidate="$proxy_host_port"
|
|
fi
|
|
|
|
if [[ "$proxy_host_port" == "443" ]] && [[ -z "$proxy_container_https_port" ]]; then
|
|
proxy_container_https_port="$proxy_container_port"
|
|
fi
|
|
fi
|
|
done < <(plugn trigger ports-get "$APP")
|
|
|
|
letsencrypt_email="$(fn-haproxy-computed-letsencrypt-email)"
|
|
if [[ -n "$letsencrypt_email" ]] && [[ -z "$proxy_container_https_port" ]]; then
|
|
proxy_container_https_port_candidate="$proxy_container_http_port_candidate"
|
|
proxy_host_https_port_candidate="$proxy_host_http_port_candidate"
|
|
if [[ -n "$proxy_container_http_port" ]]; then
|
|
proxy_container_https_port_candidate="$proxy_container_http_port"
|
|
proxy_host_http_port_candidate=443
|
|
fi
|
|
fi
|
|
|
|
# add the labels for haproxy here
|
|
# any `http:80` port mapping is treated as a `http` traefik entrypoint
|
|
# any `https:443` port mapping is treated as a `https` traefik entrypoint
|
|
if [[ -n "$is_app_listening" ]]; then
|
|
app_domains="$(plugn trigger domains-list "$APP")"
|
|
if [[ -n "$app_domains" ]]; then
|
|
haproxy_domains="$(echo "$app_domains" | xargs)"
|
|
haproxy_domains="${haproxy_domains// /,}"
|
|
fi
|
|
|
|
if [[ -n "$proxy_container_http_port" ]] || [[ -n "$proxy_container_http_port_candidate" ]]; then
|
|
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 haproxy.$APP-$PROC_TYPE.localport=$proxy_container_http_port"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE.mode=http"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE.port=80"
|
|
if [[ -n "$haproxy_domains" ]]; then
|
|
output="$output --label haproxy.$APP-$PROC_TYPE.host=$haproxy_domains"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$proxy_container_https_port" ]] || [[ -n "$proxy_container_https_port_candidate" ]]; then
|
|
if [[ -z "$proxy_container_https_port" ]]; then
|
|
dokku_log_warn "Warning: https:443 port mapping not found"
|
|
dokku_log_warn "Utilizing first https port mapping, http:$proxy_host_https_port_candidate:$proxy_container_https_port_candidate"
|
|
proxy_container_https_port="$proxy_container_https_port_candidate"
|
|
fi
|
|
|
|
output="$output --label haproxy.$APP-$PROC_TYPE.redirect_ssl=true"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE-https.localport=$proxy_container_https_port"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE-https.letsencrypt=true"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE-https.mode=http"
|
|
output="$output --label haproxy.$APP-$PROC_TYPE-https.port=443"
|
|
|
|
if [[ -n "$haproxy_domains" ]]; then
|
|
output="$output --label haproxy.$APP-$PROC_TYPE-https.host=$haproxy_domains"
|
|
fi
|
|
else
|
|
output="$output --label haproxy.$APP-$PROC_TYPE.redirect_ssl=false"
|
|
fi
|
|
fi
|
|
|
|
local proxy_labels_file_path=$(fn-proxy-get-labels-file-path "haproxy" "$APP")
|
|
if [[ -f "$proxy_labels_file_path" ]]; then
|
|
while read -r line; do
|
|
[[ -z "$line" ]] && continue
|
|
output="$output --label '$line'"
|
|
done <"$proxy_labels_file_path"
|
|
fi
|
|
|
|
echo -n "$STDIN $output"
|
|
}
|
|
|
|
trigger-haproxy-vhosts-docker-args-process-deploy "$@"
|