#!/bin/bash # Load environment variables from .env file if [ -f .env ]; then export $(grep -v '^#' .env | xargs) else echo ".env file not found! Please create it with the necessary configuration." exit 1 fi # Ensure BACKUP_PATH is set if [ -z "$BACKUP_PATH" ]; then echo "BACKUP_PATH not set in .env file!" exit 1 fi # Extract unique database prefixes (DB1, DB2, ...) DATABASE_PREFIXES=$(env | grep -o 'DB[0-9]*_' | sort -u) # Loop through each database configuration prefix for PREFIX in $DATABASE_PREFIXES; do HOST_VAR="${PREFIX}HOST" PORT_VAR="${PREFIX}PORT" USER_VAR="${PREFIX}USER" FORMAT_VAR="${PREFIX}DUMP_FORMAT" HOST=${!HOST_VAR} PORT=${!PORT_VAR} USER=${!USER_VAR} DUMP_FORMAT=${!FORMAT_VAR:-"custom"} # Default to "custom" if not set if [ -z "$HOST" ] || [ -z "$PORT" ] || [ -z "$USER" ]; then echo "Incomplete configuration for $PREFIX. Skipping..." continue fi # Create a directory for each server using host and port, only if it doesn't exist SERVER_DIR="$BACKUP_PATH/${HOST}_${PORT}" if [ ! -d "$SERVER_DIR" ]; then echo "Creating backup directory: $SERVER_DIR" mkdir -p "$SERVER_DIR" else echo "Backup directory $SERVER_DIR already exists, skipping creation." fi # Get a list of all databases for this server, excluding template databases echo "Fetching databases for $HOST:$PORT ..." DATABASES=$(psql -h "$HOST" -p "$PORT" -U "$USER" -d postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;") # Loop over each database and create a backup for DB_NAME in $DATABASES; do # Set file extension based on DUMP_FORMAT EXTENSION="dump" if [[ "$DUMP_FORMAT" == "sql" ]]; then EXTENSION="sql.gz" fi # Set backup file path within the server-specific directory BACKUP_FILE="$SERVER_DIR/$DB_NAME.$EXTENSION" echo "Dumping '$DB_NAME' on $HOST:$PORT to $BACKUP_FILE" # Perform the backup based on the specified format if [[ "$DUMP_FORMAT" == "custom" ]]; then pg_dump -h "$HOST" -p "$PORT" -U "$USER" -Fc --compress="zstd:$ZSTD_LEVEL" "$DB_NAME" -f "$BACKUP_FILE" elif [[ "$DUMP_FORMAT" == "sql" ]]; then pg_dump -h "$HOST" -p "$PORT" -U "$USER" "$DB_NAME" | gzip -$GZIP_LEVEL > "$BACKUP_FILE" else echo "Invalid DUMP_FORMAT for $PREFIX: $DUMP_FORMAT. Skipping..." continue fi du -sh $BACKUP_FILE done done echo "Backup process completed."