skillguard/hetzner-deployment/init.sh

107 lines
3.4 KiB
Bash
Raw Permalink Normal View History

#!/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/<target>.env. Danach koennen die Deploy-Scripts mit dem Target-Namen
# aufgerufen werden (z. B. ./deploy-full-release.sh <target>).
# =============================================================================
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}/<target>.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}" <<EOF
# Target-Konfiguration fuer '$(esc "$TARGET_NAME")'.
# Erstellt von init.sh am $(date '+%Y-%m-%d %H:%M:%S').
SSH_HOST='$(esc "$SSH_HOST")'
SFTP_HOST='$(esc "$SFTP_HOST")'
DB_NAME='$(esc "$DB_NAME")'
GIT_REMOTE='$(esc "$GIT_REMOTE")'
DOMAIN='$(esc "$DOMAIN")'
EOF
echo ""
echo "Gespeichert: ${TARGET_FILE}"
echo ""
echo "Naechste Schritte:"
echo " - Git-Remote '${GIT_REMOTE}' anlegen, falls noch nicht vorhanden."
echo " - Deployment starten, z. B.:"
echo " ./deploy-full-release.sh ${TARGET_NAME}"
echo ""