feat: first pass at haproxy plugin implementation
This commit is contained in:
86
plugins/haproxy-vhosts/docker-args-process-deploy
Executable file
86
plugins/haproxy-vhosts/docker-args-process-deploy
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
source "$PLUGIN_CORE_AVAILABLE_PATH/common/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_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
|
||||
local app_urls_path="$DOKKU_ROOT/$APP/URLS"
|
||||
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
|
||||
|
||||
# run this silently or the output will be set as a label
|
||||
plugn trigger domains-setup "$APP" >/dev/null
|
||||
|
||||
# ensure we have a port mapping
|
||||
plugn trigger proxy-configure-ports "$APP"
|
||||
|
||||
app_domains="$(plugn trigger domains-list "$APP")"
|
||||
if [[ -n "$app_domains" ]]; then
|
||||
haproxy_domains="$(echo "$app_domains" | xargs)"
|
||||
haproxy_domains="${haproxy_domains// /,}"
|
||||
fi
|
||||
|
||||
output=""
|
||||
# gather port mapping information
|
||||
is_app_listening="false"
|
||||
proxy_port_map="$(plugn trigger config-get "$APP" DOKKU_PROXY_PORT_MAP)"
|
||||
for port_map in $proxy_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")"
|
||||
|
||||
# ignore https for now
|
||||
if [[ "$proxy_scheme" != "http" ]] && [[ "$proxy_scheme" != "tcp" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# ignore 443 for now
|
||||
if [[ "$proxy_host_port" == "443" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# ignore everything but 80 for now
|
||||
if [[ "$proxy_host_port" != "80" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
is_app_listening="true"
|
||||
output="$output --label easyhaproxy.$APP-$PROC_TYPE.mode=$proxy_scheme"
|
||||
output="$output --label easyhaproxy.$APP-$PROC_TYPE.port=$proxy_host_port"
|
||||
output="$output --label easyhaproxy.$APP-$PROC_TYPE.localport=$proxy_container_port"
|
||||
output="$output --label easyhaproxy.$APP-$PROC_TYPE.host=$haproxy_domains"
|
||||
done
|
||||
|
||||
# add the labels for haproxy here
|
||||
# prefer the https:443 mapping to http:80 mapping
|
||||
if [[ -n "$is_app_listening" ]] && [[ -n "$haproxy_domains" ]]; then
|
||||
echo "# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN" >"$app_urls_path"
|
||||
xargs -I{} echo "$scheme://{}" <<<"$(echo "${app_domains}" | tr ' ' '\n' | sort -u)" >>"$app_urls_path"
|
||||
fi
|
||||
|
||||
echo -n "$STDIN$output"
|
||||
}
|
||||
|
||||
trigger-haproxy-vhosts-docker-args-process-deploy "$@"
|
||||
Reference in New Issue
Block a user