#!/usr/bin/env bash set -euo pipefail # ============================================================================= # init.sh # Interaktive Einrichtung eines Deployment-Targets. # Fragt alle relevanten Werte ab (jeweils mit Beispiel) und speichert sie unter # targets/.env. Danach koennen die Deploy-Scripts mit dem Target-Namen # aufgerufen werden (z. B. ./deploy-full-release.sh ). # ============================================================================= SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TARGETS_DIR="${SCRIPT_DIR}/targets" echo "===================================================" echo " Hetzner-Deployment: Target einrichten (init.sh)" echo "===================================================" echo "" echo "Die Eingaben werden gespeichert unter:" echo " ${TARGETS_DIR}/.env" echo "" if [ ! -t 0 ]; then echo "FEHLER: Kein interaktives Terminal. init.sh muss manuell ausgefuehrt werden." exit 1 fi # --- Hilfsfunktionen --- # Leerzeichen am Anfang/Ende entfernen. trim() { printf '%s' "$1" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' } # Wert fuer sicheres Schreiben in single-quotes escapen: jedes ' wird zu '\''. # So kann der spaeter via 'source' geladene Wert keine Shell-Befehle ausloesen. esc() { printf "%s" "$1" | sed "s/'/'\\\\''/g" } # Pflichtfeld abfragen (mit Beispiel im Prompt); leere Eingaben werden abgelehnt. # $1 = Beschreibung, $2 = Beispiel, $3 = Name der Zielvariablen. ask() { local prompt="$1" example="$2" __out="$3" value="" while true; do read -r -p "${prompt} (z. B. ${example}): " value value="$(trim "$value")" if [ -n "$value" ]; then printf -v "$__out" '%s' "$value" break fi echo " -> Eingabe darf nicht leer sein." done } mkdir -p "${TARGETS_DIR}" # --- Target-Name --- ask "Target-Name" "kwali8-landingpage" TARGET_NAME if ! printf '%s' "$TARGET_NAME" | grep -Eq '^[A-Za-z0-9._-]+$'; then echo "FEHLER: Target-Name darf nur Buchstaben, Zahlen sowie '.', '_' und '-' enthalten." exit 1 fi TARGET_FILE="${TARGETS_DIR}/${TARGET_NAME}.env" if [ -f "${TARGET_FILE}" ]; then echo "" echo "Hinweis: Target '${TARGET_NAME}' existiert bereits (${TARGET_FILE})." read -r -p "Ueberschreiben? [j/N]: " answer case "$(printf '%s' "$answer" | tr '[:upper:]' '[:lower:]')" in j|ja|y|yes) ;; *) echo "Abgebrochen. Es wurde nichts geaendert."; exit 0 ;; esac fi echo "" # --- Restliche Werte --- ask "SSH-Host (Forgejo-Server)" "forgejo-landing.kwali8.de" SSH_HOST ask "SFTP-Host (Zielserver)" "forgejo-landing.kwali8.de" SFTP_HOST ask "Datenbank-Name" "helium" DB_NAME ask "Git-Remote-Name" "kwali8-landingpage" GIT_REMOTE ask "Domain (Zielserver)" "kwali8.de" DOMAIN # --- Speichern --- # Werte single-quoted und escaped schreiben, damit das spaetere 'source' # in ssh_context.sh keine Command-Substitution o. ae. ausfuehren kann. umask 077 cat > "${TARGET_FILE}" <