From a940bb46680d4a5d9f63a3e0ff5dacc4888342d9 Mon Sep 17 00:00:00 2001 From: daniel-hbn Date: Sat, 24 May 2025 00:09:17 +0200 Subject: [PATCH] =?UTF-8?q?Postgres=20Script=20hinzugef=C3=BCgt=20+=20Stan?= =?UTF-8?q?dart=20Target=5FDirectory=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backup/mysql-dumps.sh | 4 +- Backup/postgres-dumps.sh | 87 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100755 Backup/postgres-dumps.sh diff --git a/Backup/mysql-dumps.sh b/Backup/mysql-dumps.sh index cf6edaa..cad9ae1 100755 --- a/Backup/mysql-dumps.sh +++ b/Backup/mysql-dumps.sh @@ -22,8 +22,8 @@ function echo_success() { } # Variablen -LOG_FILE="./dump.log" -BACKUP_DIR="./Docker/mysql/Backup/" +LOG_FILE="./mysql_dump.log" +BACKUP_DIR="./MySQL-Backup/" FOUND_CONTAINERS=$(docker ps --format "{{.Names}}") CONTAINERS=$(docker ps --format "{{.Image}} {{.Names}}" | grep "^mysql" | awk '{print $2}') DATE=$(TZ=Europe/Berlin date +'%Y-%m-%d_%H-%M-%S') diff --git a/Backup/postgres-dumps.sh b/Backup/postgres-dumps.sh new file mode 100755 index 0000000..519d234 --- /dev/null +++ b/Backup/postgres-dumps.sh @@ -0,0 +1,87 @@ +#!/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') + +# ======== 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." +