Proxy Setup Init

This commit is contained in:
2026-01-18 17:03:16 +01:00
parent 2dfa9a02ec
commit 0618e21cb0
2 changed files with 90 additions and 30 deletions

View File

@@ -1,7 +1,41 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -Eeuo pipefail set -Eeuo pipefail
# Debug mode: 0 = nur JSON, 1 = Logs auf stderr
DEBUG="${DEBUG:-0}"
export DEBUG
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Log-Verzeichnis
LOG_DIR="${SCRIPT_DIR}/logs"
mkdir -p "${LOG_DIR}"
# Temporäre Log-Datei (wird später umbenannt nach Container-Hostname)
TEMP_LOG="${LOG_DIR}/install_$$.log"
FINAL_LOG=""
# Funktion zum Aufräumen bei Exit
cleanup_log() {
# Wenn FINAL_LOG gesetzt ist, umbenennen
if [[ -n "${FINAL_LOG}" && -f "${TEMP_LOG}" ]]; then
mv "${TEMP_LOG}" "${FINAL_LOG}"
fi
}
trap cleanup_log EXIT
# Alle Ausgaben in Log-Datei umleiten
# Bei DEBUG=1: auch auf stderr ausgeben (tee)
# Bei DEBUG=0: nur in Datei
if [[ "$DEBUG" == "1" ]]; then
# Debug-Modus: Ausgabe auf stderr UND in Datei
exec > >(tee -a "${TEMP_LOG}") 2>&1
else
# Normal-Modus: Nur in Datei, stdout bleibt für JSON frei
exec 3>&1 # stdout (fd 3) für JSON reservieren
exec > "${TEMP_LOG}" 2>&1
fi
source "${SCRIPT_DIR}/libsupabase.sh" source "${SCRIPT_DIR}/libsupabase.sh"
setup_traps setup_traps
@@ -27,6 +61,7 @@ Domain / n8n options:
--base-domain <domain> (default: userman.de) -> FQDN becomes sb-<unix>.domain --base-domain <domain> (default: userman.de) -> FQDN becomes sb-<unix>.domain
--n8n-owner-email <email> (default: admin@<base-domain>) --n8n-owner-email <email> (default: admin@<base-domain>)
--n8n-owner-pass <pass> Optional. If omitted, generated (policy compliant). --n8n-owner-pass <pass> Optional. If omitted, generated (policy compliant).
--debug Enable debug mode (show logs on stderr)
--help Show help --help Show help
Notes: Notes:
@@ -74,6 +109,7 @@ while [[ $# -gt 0 ]]; do
--base-domain) BASE_DOMAIN="${2:-}"; shift 2 ;; --base-domain) BASE_DOMAIN="${2:-}"; shift 2 ;;
--n8n-owner-email) N8N_OWNER_EMAIL="${2:-}"; shift 2 ;; --n8n-owner-email) N8N_OWNER_EMAIL="${2:-}"; shift 2 ;;
--n8n-owner-pass) N8N_OWNER_PASS="${2:-}"; shift 2 ;; --n8n-owner-pass) N8N_OWNER_PASS="${2:-}"; shift 2 ;;
--debug) DEBUG="1"; export DEBUG; shift 1 ;;
--help|-h) usage; exit 0 ;; --help|-h) usage; exit 0 ;;
*) die "Unknown option: $1 (use --help)" ;; *) die "Unknown option: $1 (use --help)" ;;
esac esac
@@ -124,6 +160,9 @@ UNIXTS="$(date +%s)"
CT_HOSTNAME="sb-${UNIXTS}" CT_HOSTNAME="sb-${UNIXTS}"
FQDN="${CT_HOSTNAME}.${BASE_DOMAIN}" FQDN="${CT_HOSTNAME}.${BASE_DOMAIN}"
# Log-Datei nach Container-Hostname benennen
FINAL_LOG="${LOG_DIR}/${CT_HOSTNAME}.log"
# CTID selection # CTID selection
if [[ -n "$CTID" ]]; then if [[ -n "$CTID" ]]; then
[[ "$CTID" =~ ^[0-9]+$ ]] || die "--ctid must be integer" [[ "$CTID" =~ ^[0-9]+$ ]] || die "--ctid must be integer"
@@ -393,29 +432,15 @@ info "n8n intern: ${N8N_INTERNAL_URL}"
info "n8n extern (geplant via OPNsense): ${N8N_EXTERNAL_URL}" info "n8n extern (geplant via OPNsense): ${N8N_EXTERNAL_URL}"
# Machine-readable JSON output (for your downstream automation) # Machine-readable JSON output (for your downstream automation)
emit_json <<JSON # Kompaktes JSON in einer Zeile für einfaches Parsing
{ # Bei DEBUG=0: JSON auf fd 3 (ursprüngliches stdout) ausgeben
"ctid": ${CTID}, # Bei DEBUG=1: JSON normal auf stdout (geht auch ins Log)
"hostname": "${CT_HOSTNAME}", JSON_OUTPUT="{\"ctid\":${CTID},\"hostname\":\"${CT_HOSTNAME}\",\"fqdn\":\"${FQDN}\",\"ip\":\"${CT_IP}\",\"vlan\":${VLAN},\"urls\":{\"n8n_internal\":\"${N8N_INTERNAL_URL}\",\"n8n_external\":\"${N8N_EXTERNAL_URL}\"},\"postgres\":{\"host\":\"postgres\",\"port\":5432,\"db\":\"${PG_DB}\",\"user\":\"${PG_USER}\",\"password\":\"${PG_PASSWORD}\"},\"n8n\":{\"encryption_key\":\"${N8N_ENCRYPTION_KEY}\",\"owner_email\":\"${N8N_OWNER_EMAIL}\",\"owner_password\":\"${N8N_OWNER_PASS}\",\"secure_cookie\":${N8N_SECURE_COOKIE}},\"log_file\":\"${FINAL_LOG}\"}"
"fqdn": "${FQDN}",
"ip": "${CT_IP}", if [[ "$DEBUG" == "1" ]]; then
"vlan": ${VLAN}, # Debug-Modus: JSON normal ausgeben (formatiert für Lesbarkeit)
"urls": { echo "$JSON_OUTPUT" | python3 -m json.tool 2>/dev/null || echo "$JSON_OUTPUT"
"n8n_internal": "${N8N_INTERNAL_URL}", else
"n8n_external": "${N8N_EXTERNAL_URL}" # Normal-Modus: JSON auf ursprüngliches stdout (fd 3) - kompakt
}, echo "$JSON_OUTPUT" >&3
"postgres": { fi
"host": "postgres",
"port": 5432,
"db": "${PG_DB}",
"user": "${PG_USER}",
"password": "${PG_PASSWORD}"
},
"n8n": {
"encryption_key": "${N8N_ENCRYPTION_KEY}",
"owner_email": "${N8N_OWNER_EMAIL}",
"owner_password": "${N8N_OWNER_PASS}",
"secure_cookie": ${N8N_SECURE_COOKIE}
}
}
JSON

View File

@@ -1,13 +1,48 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -Eeuo pipefail set -Eeuo pipefail
# Debug mode: 0 = nur JSON ausgeben, 1 = Logs auf stderr
DEBUG="${DEBUG:-0}"
log_ts() { date "+[%F %T]"; } log_ts() { date "+[%F %T]"; }
info() { echo "$(log_ts) INFO: $*" >&2; }
warn() { echo "$(log_ts) WARN: $*" >&2; } info() {
die() { echo "$(log_ts) ERROR: $*" >&2; exit 1; } [[ "$DEBUG" == "1" ]] && echo "$(log_ts) INFO: $*" >&2
return 0
}
warn() {
[[ "$DEBUG" == "1" ]] && echo "$(log_ts) WARN: $*" >&2
return 0
}
die() {
if [[ "$DEBUG" == "1" ]]; then
echo "$(log_ts) ERROR: $*" >&2
else
# JSON-Fehler auf fd 3 ausgeben (falls verfügbar), sonst stdout
if { true >&3; } 2>/dev/null; then
echo "{\"error\": \"$*\"}" >&3
else
echo "{\"error\": \"$*\"}"
fi
fi
exit 1
}
setup_traps() { setup_traps() {
trap 'rc=$?; [[ $rc -ne 0 ]] && echo "$(log_ts) ERROR: Failed at line ${BASH_LINENO[0]}: ${BASH_COMMAND} (exit=$rc)" >&2; exit $rc' ERR trap 'rc=$?; if [[ $rc -ne 0 ]]; then
if [[ "$DEBUG" == "1" ]]; then
echo "$(log_ts) ERROR: Failed at line ${BASH_LINENO[0]}: ${BASH_COMMAND} (exit=$rc)" >&2
else
# JSON-Fehler auf fd 3 ausgeben (falls verfügbar), sonst stdout
if { true >&3; } 2>/dev/null; then
echo "{\"error\": \"Failed at line ${BASH_LINENO[0]}: ${BASH_COMMAND} (exit=$rc)\"}" >&3
else
echo "{\"error\": \"Failed at line ${BASH_LINENO[0]}: ${BASH_COMMAND} (exit=$rc)\"}"
fi
fi
fi; exit $rc' ERR
} }
need_cmd() { need_cmd() {