skillguard/hetzner-deployment/deploy-database-dump.sh

105 lines
2.5 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
set -euo pipefail
# =============================================================================
# deploy-database-dump.sh
# Erstellt einen PostgreSQL-Dump und uebertraegt ihn per SFTP auf die
# Zielinstanz innerhalb der Hetzner-Infrastruktur.
#
# Verwendung: ./deploy-database-dump.sh <target>
# Beispiel: ./deploy-database-dump.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
# --- Datenbank-URL pruefen ---
if [ -z "${DATABASE_URL:-}" ]; then
echo "FEHLER: DATABASE_URL ist nicht gesetzt."
exit 1
fi
# --- Dump erstellen ---
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 ""
echo "=== Datenbank-Export ==="
echo "Target: ${TARGET} (${DOMAIN})"
echo "DB: ${DB_NAME}"
echo "Ziel: ${DUMP_FILE}"
echo ""
echo "Starte Datenbank-Export..."
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
# --- SFTP-Transfer ---
echo ""
echo "=== SFTP-Upload ==="
echo "Ziel: ${SFTP_HOST}:${SFTP_TARGET}"
echo ""
sftp -P "${SFTP_PORT}" -i "${KEY_PATH}" "replit-user@${SFTP_HOST}" <<EOF
put ${DUMP_FILE} ${SFTP_TARGET}
bye
EOF
SFTP_EXIT=$?
if [ $SFTP_EXIT -ne 0 ]; then
echo "FEHLER: SFTP-Upload fehlgeschlagen (Exit-Code: ${SFTP_EXIT})."
exit 1
fi
# --- Verifikation ---
echo "Pruefe Upload..."
REMOTE_CHECK=$(sftp -P "${SFTP_PORT}" -i "${KEY_PATH}" "replit-user@${SFTP_HOST}" <<EOF
ls -l ${SFTP_TARGET}
bye
EOF
2>&1)
if echo "$REMOTE_CHECK" | grep -q "datadump.dump"; then
echo "Upload erfolgreich: Datei auf dem Server vorhanden."
else
echo "FEHLER: Datei wurde nicht auf dem Server gefunden."
exit 1
fi
echo ""
echo "=== Datenbank-Deployment fuer '${TARGET}' abgeschlossen ==="