#!/bin/bash set -x # ========================================================== # CONFIGURATION # ========================================================== CONTAINER_NAME="postgresql18" PG_HOST="localhost" PG_PORT="5432" PG_USER="vladimir.buzalka" export PGPASSWORD="Vlado7309208104++" UNRAID_NAME="tower" BASE_PATH="/mnt/user/Backup/Critical/PostgreSQLBackup" KEEP_DAYS=7 KEEP_COUNT=7 # počet posledních záloh k udržení (mimo time-based) # ========================================================== # START # ========================================================== echo "Starting PostgreSQL full backup (pg_dumpall)" START_TS=$(date '+%Y-%m-%d %H:%M:%S') DATE=$(date +%Y-%m-%d_%H%M) FINAL_PATH="$BASE_PATH/$UNRAID_NAME/$DATE" mkdir -p "$FINAL_PATH" DUMP_FILE="$FINAL_PATH/all_databases.sql.gz" ERR_FILE="$FINAL_PATH/all_databases.err" # ========================================================== # DUMP + GZIP # pg_dumpall zachovává: všechny DB, role, tablespaces, grants # Streamuje přes stdout, nepotřebuje volume mount # ========================================================== docker exec \ -e PGPASSWORD="$PGPASSWORD" \ "$CONTAINER_NAME" \ pg_dumpall \ --host="$PG_HOST" \ --port="$PG_PORT" \ --username="$PG_USER" \ --clean \ --if-exists \ | gzip > "$DUMP_FILE" 2> "$ERR_FILE" EXIT_CODE=${PIPESTATUS[0]} # ========================================================== # VALIDATION # ========================================================== if [ $EXIT_CODE -eq 0 ] && [ -s "$DUMP_FILE" ] && [ ! -s "$ERR_FILE" ]; then echo "SUCCESS: Full PostgreSQL backup completed" echo "Dump size: $(du -h "$DUMP_FILE" | cut -f1)" rm -f "$ERR_FILE" else echo "ERROR: Backup failed" echo "Exit code: $EXIT_CODE" echo "Dump file:" ls -lh "$DUMP_FILE" 2>/dev/null || echo " (not created)" echo "Error output:" [ -s "$ERR_FILE" ] && cat "$ERR_FILE" || echo " (no stderr output)" fi # ========================================================== # CLEANUP OLD BACKUPS # 1. Smaž zálohy starší než KEEP_DAYS dnů # 2. Z toho co zbyde, ponech jen posledních KEEP_COUNT # ========================================================== echo "Cleaning up old backups..." find "$BASE_PATH/$UNRAID_NAME" \ -mindepth 1 -maxdepth 1 -type d -mtime +$KEEP_DAYS \ -exec rm -rf {} \; # Nech jen posledních KEEP_COUNT záloh ls -td "$BASE_PATH/$UNRAID_NAME"/*/ 2>/dev/null \ | tail -n +$((KEEP_COUNT + 1)) \ | xargs -r rm -rf echo "------------------------------------------" echo "Backup task completed at $(date)" echo "Started at: $START_TS" set +x