PromucFlow_constructor/app/client/start-caddy.sh

166 lines
4.5 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
if [[ -n ${TRACE-} ]]; then
set -o xtrace
fi
cd "$(dirname "$0")"
if [[ ${1-} =~ ^-*h(elp)?$ ]]; then
echo 'Run '"$0"' [option...]
--http: Require start with http, instead of the default HTTPS.
--https-port: Port to use for https. Default: 443.
--http-port: Port to use for http. Default: 80.
If neither of the above are set, then we use 443 for https, and 80 for http.
--env-file: Specify an alternate env file. Defaults to ".env" at the root of the project.
A single positional argument can be given to set the backend server proxy address. Example:
'"$0"' https://localhost:8080
'"$0"' https://host.docker.internal:8080
'"$0"' https://release.app.appsmith.com
'"$0"' release # This is identical to the one above
' >&2
exit
fi
use_https=1
run_as=caddy
while [[ $# -gt 0 ]]; do
case $1 in
--https)
shift
;;
--http)
use_https=0
shift
;;
--https-port)
https_listen_port=$2
shift 2
;;
--http-port)
http_listen_port=$2
shift 2
;;
--env-file)
env_file=$2
shift
shift
;;
-*|--*)
echo "Unknown option $1" >&2
exit 1
;;
*)
backend="$1"
shift
;;
esac
done
if [[ ${backend-} == release ]]; then
# Special shortcut for release environment.
backend=https://release.app.appsmith.com
fi
working_dir="$PWD/caddy"
mkdir -pv "$working_dir"
domain=dev.appsmith.com
upstream_host=localhost
frontend_host=${frontend_host-$upstream_host}
backend_host=${backend_host-$upstream_host}
rts_host=${rts_host-$upstream_host}
http_listen_port="${http_listen_port-80}"
https_listen_port="${https_listen_port-443}"
if [[ -n ${env_file-} && ! -f $env_file ]]; then
echo "I got --env-file as '$env_file', but I cannot access it." >&2
exit 1
elif [[ -n ${env_file-} || -f ../../.env ]]; then
set -o allexport
# shellcheck disable=SC1090
source "${env_file-../../.env}"
set +o allexport
else
echo "
Please populate the .env at the root of the project and run again
Or add the environment variables defined in .env.example to the environment
-- to enable features
" >&2
fi
caddy_dev_conf="$working_dir/Caddyfile"
APPSMITH_CUSTOM_DOMAIN="$domain" \
TMP="$working_dir" \
node \
"$(git rev-parse --show-toplevel)/deploy/docker/fs/opt/appsmith/caddy-reconfigure.mjs" \
--no-finalize-index-html
changed="$(awk '
/ root / || /import file_server/ { next }
/acme_ca_root/ { print "log {\n output file '"$working_dir/logs.txt"'\n}"; next }
/output stdout/ { print "output file '"$working_dir/logs.txt"'"; next }
/ handle {/ { skip = 1; print "handle {\n import reverse_proxy 3000\n templates {\n mime \"text/html; charset=utf-8\"\n }\n}\n" }
/ handle \/info {/ { skip = 0 }
!skip { print }
/https:\/\/'"$domain"' / { print "tls internal" }
' "$caddy_dev_conf")"
echo "$changed" | caddy fmt - > "$caddy_dev_conf"
# Have to stop and start, instead of reload, so that any new env variables are picked up for Caddy's templating.
caddy stop --config "$caddy_dev_conf" || true
remaining_listeners="$(
lsof -nP "-iTCP:$http_listen_port" -sTCP:LISTEN || true
lsof -nP "-iTCP:$https_listen_port" -sTCP:LISTEN || true
)"
if [[ -n $remaining_listeners ]]; then
echo $'\nThe following processes are listening on the ports we want to use:\n'"$remaining_listeners"$'\n' >&2
answer=
for attempt in 1 2 3; do
echo -n 'Kill and proceed? [y/n] ' >&2
read -rn1 answer
if [[ $answer == y ]]; then
(lsof -t "-iTCP:$http_listen_port" -sTCP:LISTEN | xargs kill) || true
(lsof -t "-iTCP:$https_listen_port" -sTCP:LISTEN | xargs kill) || true
break
elif [[ $answer == n || $attempt == 3 ]]; then
echo $'\nAborting.' >&2
exit 1
fi
done
fi
caddy start --config "$caddy_dev_conf"
stop_cmd="caddy --config \"$caddy_dev_conf\" stop"
url_to_open=""
if [[ $use_https == 1 ]]; then
url_to_open="https://$domain"
if [[ $https_listen_port != 443 ]]; then
url_to_open="$url_to_open:$https_listen_port"
fi
else
url_to_open="http://localhost"
if [[ $http_listen_port != 80 ]]; then
url_to_open="$url_to_open:$http_listen_port"
fi
fi
echo '✅ Started Caddy'
echo " Stop with: $stop_cmd"
echo "🎉 $url_to_open"