105 lines
3.3 KiB
Bash
Executable File
105 lines
3.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ======== Ausgabe-Funktionen ========
|
|
function echo_info() {
|
|
echo -e "\e[32m[$(date +'%Y-%m-%d %H:%M:%S')] [INFO] $1\e[0m"
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [INFO] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
function echo_warning() {
|
|
echo -e "\e[33m[$(date +'%Y-%m-%d %H:%M:%S')] [WARNUNG] $1\e[0m"
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [WARNUNG] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
function echo_error() {
|
|
echo -e "\e[31m[$(date +'%Y-%m-%d %H:%M:%S')] [FEHLER] $1\e[0m"
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [FEHLER] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
function echo_success() {
|
|
echo -e "\e[34m[$(date +'%Y-%m-%d %H:%M:%S')] [ERFOLG] $1\e[0m"
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [ERFOLG] $1" >> "$LOG_FILE"
|
|
}
|
|
|
|
# ======== Variablen ========
|
|
LOG_FILE="./pg_dump.log"
|
|
BACKUP_DIR="./PG-Backup/"
|
|
DATE=$(TZ=Europe/Berlin date +'%Y-%m-%d_%H-%M-%S')
|
|
|
|
# ======== ASCII ART ========
|
|
cat << "EOF"
|
|
____ _ ____ ___ _
|
|
| _ \ ___ ___| |_ __ _ _ __ ___/ ___| / _ \| |
|
|
| |_) / _ \/ __| __/ _` | '__/ _ \___ \| | | | |
|
|
| __/ (_) \__ \ || (_| | | | __/___) | |_| | |___
|
|
|_| \___/|___/\__\__, |_| \___|____/ \__\_\_____|
|
|
|___/
|
|
____ _
|
|
| __ ) __ _ ___| | ___ _ _ __
|
|
| _ \ / _` |/ __| |/ / | | | '_ \
|
|
| |_) | (_| | (__| <| |_| | |_) |
|
|
|____/ \__,_|\___|_|\_\\__,_| .__/
|
|
|_|
|
|
EOF
|
|
|
|
|
|
# ======== Backup-Verzeichnis prüfen ========
|
|
echo_info "---------- PostgreSQL Backup gestartet: $DATE ----------"
|
|
|
|
if [ ! -d "$BACKUP_DIR" ]; then
|
|
echo_info "Backup-Verzeichnis $BACKUP_DIR existiert nicht. Erstelle..."
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo_success "Verzeichnis $BACKUP_DIR erfolgreich erstellt."
|
|
else
|
|
echo_error "Fehler beim Erstellen des Backup-Verzeichnisses. Abbruch."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# ======== Alle Container prüfen, ob PostgreSQL läuft ========
|
|
ALL_CONTAINERS=$(docker ps --format "{{.Names}}")
|
|
POSTGRES_CONTAINERS=()
|
|
|
|
for CONTAINER in $ALL_CONTAINERS; do
|
|
if docker exec "$CONTAINER" psql --version >/dev/null 2>&1; then
|
|
POSTGRES_CONTAINERS+=("$CONTAINER")
|
|
echo_info "PostgreSQL erkannt in Container: $CONTAINER"
|
|
fi
|
|
done
|
|
|
|
# ======== Backup jeder Datenbank in jedem Container ========
|
|
for CONTAINER in "${POSTGRES_CONTAINERS[@]}"; do
|
|
# Passwort holen
|
|
POSTGRES_PASSWORD=$(docker exec "$CONTAINER" printenv POSTGRES_PASSWORD)
|
|
|
|
if [ -z "$POSTGRES_PASSWORD" ]; then
|
|
echo_warning "Kein POSTGRES_PASSWORD in $CONTAINER gefunden. Überspringe..."
|
|
continue
|
|
fi
|
|
|
|
# Alle Nicht-Systemdatenbanken holen
|
|
DATABASES=$(docker exec "$CONTAINER" bash -c "PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres -t -c \"SELECT datname FROM pg_database WHERE datistemplate = false;\"")
|
|
|
|
for DB in $DATABASES; do
|
|
DB=$(echo "$DB" | xargs) # Leerzeichen trimmen
|
|
if [ -z "$DB" ]; then
|
|
continue
|
|
fi
|
|
|
|
DUMP_FILE="$BACKUP_DIR/${CONTAINER}-${DB}-${DATE}.sql"
|
|
echo_info "Erstelle Dump für $DB aus $CONTAINER..."
|
|
docker exec "$CONTAINER" bash -c "PGPASSWORD=$POSTGRES_PASSWORD pg_dump -U postgres $DB" > "$DUMP_FILE"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo_success "Dump gespeichert: $DUMP_FILE"
|
|
else
|
|
echo_error "Fehler beim Dump von $DB aus $CONTAINER."
|
|
fi
|
|
done
|
|
done
|
|
|
|
echo_info "PostgreSQL Backup abgeschlossen."
|
|
|