#!/bin/bash # # Shared Caddy setup with initializing/unavailable pages. # # Usage in domain.sh: # source /var/excloud/scripts/caddy-setup.sh # setup_initializing_page "$DOMAIN" "$APP_NAME" "$APP_DIR/$APP_NAME" # ... start containers ... # wait_and_switch_to_proxy "$DOMAIN" "$APP_UPSTREAM_PORT" "$APP_DIR/$APP_NAME" & # # For apps with custom Caddyfile (e.g. signoz with multi-route), use: # write_loading_pages "$APP_NAME" "$APP_DIR/$APP_NAME" # setup_initializing_page "$DOMAIN" "$APP_NAME" "$APP_DIR/$APP_NAME" # ... start containers ... # wait_and_switch_to_proxy "$DOMAIN" "$APP_UPSTREAM_PORT" "$APP_DIR/$APP_NAME" "$CUSTOM_CADDYFILE_CONTENT" & SCRIPT_DIR_CADDY="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" write_loading_pages() { local app_name="$1" local app_dir="$2" local display_name display_name="$(echo "$app_name" | sed 's/-/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)}1')" mkdir -p "${app_dir}/.excloud" cp "${SCRIPT_DIR_CADDY}/initializing.html" "${app_dir}/.excloud/initializing.html" cp "${SCRIPT_DIR_CADDY}/unavailable.html" "${app_dir}/.excloud/unavailable.html" sed -i "s/APP_DISPLAY_NAME/${display_name}/g" "${app_dir}/.excloud/initializing.html" sed -i "s/APP_DISPLAY_NAME/${display_name}/g" "${app_dir}/.excloud/unavailable.html" } # Phase 1: Serve the initializing page immediately via Caddy file_server. setup_initializing_page() { local domain="$1" local app_name="$2" local app_dir="$3" write_loading_pages "$app_name" "$app_dir" cat > /etc/caddy/Caddyfile </dev/null; do if [ $(( $(date +%s) - start_time )) -ge 1200 ]; then echo "App did not become ready within 20 minutes" >&2 break fi sleep 5 done # Switch to reverse proxy with handle_errors for unavailable page if [ -n "$custom_caddyfile" ]; then echo "$custom_caddyfile" > /etc/caddy/Caddyfile else cat > /etc/caddy/Caddyfile < /etc/caddy/Caddyfile else cat > /etc/caddy/Caddyfile <