#!/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."