#!/usr/bin/env bash set -euo pipefail # ============================================================================= # deploy-full-release.sh # Fuehrt ein vollstaendiges Release durch: Datenbank-Dump + Code-Push. # Die Passwort-Abfrage erfolgt einmalig zu Beginn. # # Verwendung: ./deploy-full-release.sh # Beispiel: ./deploy-full-release.sh pilot1 # ============================================================================= SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # --- Kontext laden --- source "${SCRIPT_DIR}/ssh_context.sh" "$@" # --- SSH (Key wird geladen, Passphrase einmalig abgefragt) --- setup_ssh echo "" echo "=========================================" echo " Full Release: ${TARGET} (${DOMAIN})" echo "=========================================" echo "" # --- Phase 1: Datenbank --- echo "--- Phase 1/2: Datenbank-Deployment ---" echo "" if [ -z "${DATABASE_URL:-}" ]; then echo "FEHLER: DATABASE_URL ist nicht gesetzt." exit 1 fi BACKUP_DIR="/home/runner/workspace/backups" TIMESTAMP=$(node -e "const d=new Date();console.log(d.toISOString().replace(/[-:]/g,'').replace('T','_').slice(0,15))") DUMP_FILE="${BACKUP_DIR}/datadump_${TARGET}_${TIMESTAMP}.dump" SFTP_TARGET="/uploads/datadump.dump" mkdir -p "${BACKUP_DIR}" echo "Starte Datenbank-Export..." echo "Ziel: ${DUMP_FILE}" pg_dump -Fc -d "$DATABASE_URL" -f "$DUMP_FILE" & DUMP_PID=$! while kill -0 "$DUMP_PID" 2>/dev/null; do if [ -f "$DUMP_FILE" ]; then SIZE=$(du -h "$DUMP_FILE" 2>/dev/null | cut -f1) printf "\r Exportiert: %s ..." "$SIZE" fi sleep 3 done wait "$DUMP_PID" DUMP_EXIT=$? echo "" if [ $DUMP_EXIT -ne 0 ] || [ ! -f "$DUMP_FILE" ]; then echo "FEHLER: Datenbank-Export fehlgeschlagen." exit 1 fi SIZE=$(du -h "$DUMP_FILE" | cut -f1) echo "Export fertig: ${DUMP_FILE} (${SIZE})" sync echo "Uebertrage nach ${SFTP_HOST}:${SFTP_TARGET}..." sftp -P "${SFTP_PORT}" -i "${KEY_PATH}" "replit-user@${SFTP_HOST}" <&1) if echo "$REMOTE_CHECK" | grep -q "datadump.dump"; then echo "Upload erfolgreich." else echo "FEHLER: Datei wurde nicht auf dem Server gefunden." exit 1 fi echo "" echo "--- Phase 1/2: Datenbank-Deployment abgeschlossen ---" echo "" # --- Phase 2: Code --- echo "--- Phase 2/2: Code-Deployment ---" echo "" echo "Pruefe Git-Remote '${GIT_REMOTE}'..." if ! git remote get-url "${GIT_REMOTE}" &>/dev/null; then echo "FEHLER: Git-Remote '${GIT_REMOTE}' existiert nicht." git remote -v exit 1 fi echo "Starte Push: main -> ${GIT_REMOTE}..." git push "${GIT_REMOTE}" main --force PUSH_EXIT=$? if [ $PUSH_EXIT -ne 0 ]; then echo "FEHLER: Git-Push fehlgeschlagen (Exit-Code: ${PUSH_EXIT})." exit 1 fi echo "" echo "--- Phase 2/2: Code-Deployment abgeschlossen ---" echo "" echo "=========================================" echo " Full Release fuer '${TARGET}' fertig" echo "========================================="