diff --git a/lib/common.sh b/lib/common.sh index cbf08f8..340828d 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -56,7 +56,8 @@ SITE_DOMAIN="" SITE_CADDY_NET="caddy_net" SITE_PUID="" SITE_PGID="" -CADDY_REMOTE_HOST="" # LAN IP/hostname of this machine, used when Caddy runs elsewhere +CADDY_MODE="" # local | remote | none (set by site configure wizard) +CADDY_REMOTE_HOST="" # legacy — kept for backward compat with old .config files load_site_config() { local cfg="$DOCKER_DIR/.config" @@ -66,16 +67,19 @@ load_site_config() { [[ "$key" =~ ^[[:space:]]*# ]] && continue [[ -z "${key// }" ]] && continue case "$key" in - SITE_TZ) SITE_TZ="$val" ;; - SITE_DOMAIN) SITE_DOMAIN="$val" ;; + SITE_TZ) SITE_TZ="$val" ;; + SITE_DOMAIN) SITE_DOMAIN="$val" ;; SITE_CADDY_NET) SITE_CADDY_NET="$val" ;; SITE_PUID) SITE_PUID="$val" ;; SITE_PGID) SITE_PGID="$val" ;; + CADDY_MODE) CADDY_MODE="$val" ;; CADDY_REMOTE_HOST) CADDY_REMOTE_HOST="$val" ;; BASE_DOMAIN) [ -z "$SITE_DOMAIN" ] && SITE_DOMAIN="$val" ;; esac done < "$cfg" - export SITE_TZ SITE_DOMAIN SITE_CADDY_NET SITE_PUID SITE_PGID CADDY_REMOTE_HOST + # Backward compat: old installs used CADDY_REMOTE_HOST to signal remote mode + [ -z "$CADDY_MODE" ] && [ -n "$CADDY_REMOTE_HOST" ] && CADDY_MODE="remote" + export SITE_TZ SITE_DOMAIN SITE_CADDY_NET SITE_PUID SITE_PGID CADDY_MODE CADDY_REMOTE_HOST } save_site_config() { @@ -87,11 +91,11 @@ save_site_config() { [ -n "$SITE_TZ" ] && echo "SITE_TZ=$SITE_TZ" [ -n "$SITE_DOMAIN" ] && echo "SITE_DOMAIN=$SITE_DOMAIN" [ -n "$SITE_CADDY_NET" ] && echo "SITE_CADDY_NET=$SITE_CADDY_NET" - [ -n "$SITE_PUID" ] && echo "SITE_PUID=$SITE_PUID" - [ -n "$SITE_PGID" ] && echo "SITE_PGID=$SITE_PGID" - [ -n "$CADDY_REMOTE_HOST" ] && echo "CADDY_REMOTE_HOST=$CADDY_REMOTE_HOST" + [ -n "$SITE_PUID" ] && echo "SITE_PUID=$SITE_PUID" + [ -n "$SITE_PGID" ] && echo "SITE_PGID=$SITE_PGID" + [ -n "$CADDY_MODE" ] && echo "CADDY_MODE=$CADDY_MODE" # Backward-compat alias for services that still read BASE_DOMAIN directly - [ -n "$SITE_DOMAIN" ] && echo "BASE_DOMAIN=$SITE_DOMAIN" + [ -n "$SITE_DOMAIN" ] && echo "BASE_DOMAIN=$SITE_DOMAIN" } > "$cfg" chmod 600 "$cfg" } @@ -280,12 +284,11 @@ configure_caddy_for_service() { esac # ── Determine Caddy mode ────────────────────────────────────────────────── - # local: Caddy container running on this machine → write Caddyfile + reload - # remote: Caddy on another machine → generate snippet file to copy over - # none: no Caddy anywhere → silent return - local _CADDY_MODE="none" - [ -d "$DOCKER_DIR/caddy" ] && _CADDY_MODE="local" - [ -n "$CADDY_REMOTE_HOST" ] && [ "$_CADDY_MODE" != "local" ] && _CADDY_MODE="remote" + # Explicit CADDY_MODE (set by site wizard) takes priority. + # Fall back to: local if ~/docker/caddy exists, remote if legacy CADDY_REMOTE_HOST set. + local _CADDY_MODE="${CADDY_MODE:-none}" + [ "$_CADDY_MODE" = "none" ] && [ -d "$DOCKER_DIR/caddy" ] && _CADDY_MODE="local" + [ "$_CADDY_MODE" = "none" ] && [ -n "${CADDY_REMOTE_HOST:-}" ] && _CADDY_MODE="remote" [ "$_CADDY_MODE" = "none" ] && return 0 echo "" @@ -294,11 +297,10 @@ configure_caddy_for_service() { echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" if [ "$_CADDY_MODE" = "remote" ]; then - echo " Remote Caddy configured ($CADDY_REMOTE_HOST)." - echo " A snippet file will be saved to ~/docker/caddy-snippets/ for you to" - echo " copy to your Caddy machine." + echo " Caddy is on a remote machine — a snippet file will be saved to" + echo " ~/docker/caddy-snippets/ for you to copy to your Caddy machine." else - echo "Caddy is installed. You can configure a reverse proxy for $SERVICE_NAME." + echo " Caddy is installed on this machine." fi echo "" @@ -329,8 +331,15 @@ configure_caddy_for_service() { # Build the site block — upstream differs by mode local _BLOCK_UPSTREAM="$_UPSTREAM" if [ "$_CADDY_MODE" = "remote" ]; then - # Remote Caddy can't resolve Docker container names — use host IP + published port - _BLOCK_UPSTREAM="${CADDY_REMOTE_HOST}:${_DISPLAY_PORT}" + # Remote Caddy can't resolve Docker container names — use this machine's IP + published port. + # Prefer legacy CADDY_REMOTE_HOST if set (old installs that stored it explicitly), + # otherwise auto-detect the primary non-loopback IP. + local _THIS_IP="${CADDY_REMOTE_HOST:-}" + if [ -z "$_THIS_IP" ]; then + _THIS_IP="$(hostname -I 2>/dev/null | awk '{print $1}')" + fi + [ -z "$_THIS_IP" ] && _THIS_IP="$(hostname -f 2>/dev/null || echo "127.0.0.1")" + _BLOCK_UPSTREAM="${_THIS_IP}:${_DISPLAY_PORT}" fi local _SITE_BLOCK diff --git a/setup.sh b/setup.sh index 2fa7162..a534991 100755 --- a/setup.sh +++ b/setup.sh @@ -122,19 +122,34 @@ run_site_configure() { local _cur_tz="${SITE_TZ:-$_sys_tz}" local _cur_dom="${SITE_DOMAIN:-}" local _cur_net="${SITE_CADDY_NET:-caddy_net}" - local _cur_caddy_host="${CADDY_REMOTE_HOST:-}" + # Resolve current Caddy mode for display — handle legacy CADDY_REMOTE_HOST + local _cur_mode="${CADDY_MODE:-}" + [ -z "$_cur_mode" ] && [ -n "${CADDY_REMOTE_HOST:-}" ] && _cur_mode="remote" + [ -z "$_cur_mode" ] && _cur_mode="local" prompt_text " Timezone [${_cur_tz}]:" "$_cur_tz" SITE_TZ prompt_text " Base domain (e.g., example.com) [${_cur_dom:-}]:" "$_cur_dom" SITE_DOMAIN prompt_text " Caddy Docker network [${_cur_net}]:" "$_cur_net" SITE_CADDY_NET echo "" - echo " Caddy location: leave blank if Caddy runs on THIS machine (default)." - echo " Set to this machine's LAN IP or hostname if Caddy runs on a DIFFERENT" - echo " machine — service installers will generate snippet files to copy over." - prompt_text " Caddy remote host (LAN IP/hostname) [${_cur_caddy_host:-}]:" "$_cur_caddy_host" CADDY_REMOTE_HOST + echo " Where does Caddy run?" + echo " [1] This machine — Caddy installed here (default)" + echo " [2] Remote machine — different server, VPN node, or Netbird peer" + echo " (service installers save snippet files to ~/docker/caddy-snippets/)" + echo " [3] None / skip — configure Caddy later" + echo "" + local _caddy_default="1" + case "$_cur_mode" in remote) _caddy_default="2" ;; none) _caddy_default="3" ;; esac + local _caddy_choice="" + prompt_text " Caddy location [${_caddy_default}]:" "$_caddy_default" _caddy_choice + case "${_caddy_choice:-$_caddy_default}" in + 2) CADDY_MODE="remote" ;; + 3) CADDY_MODE="none" ;; + *) CADDY_MODE="local" ;; + esac + CADDY_REMOTE_HOST="" # clear legacy value; CADDY_MODE is authoritative now - export SITE_TZ SITE_DOMAIN SITE_CADDY_NET CADDY_REMOTE_HOST + export SITE_TZ SITE_DOMAIN SITE_CADDY_NET CADDY_MODE CADDY_REMOTE_HOST mkdir -p "$DOCKER_DIR" save_site_config log_success "Saved to $DOCKER_DIR/.config"