Current section
Files
Jump to
Current section
Files
priv/scripts/backup_databases_over_ssh.sh
#!/bin/sh
# Default values
LOCAL_BACKUP_DIR=$(pwd)
DATE=$(date +%Y%m%d)
# Colors
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
RESET='\033[0m'
# Function to display usage
usage() {
echo "Usage: $0 [-o output_dir] [user@]host"
exit 1
}
# Parse options
while getopts ":o:" opt; do
case $opt in
o)
LOCAL_BACKUP_DIR=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
usage
;;
:)
echo "Option -$OPTARG requires an argument." >&2
usage
;;
esac
done
shift $((OPTIND - 1))
# Check for required positional argument 'host'
if [ $# -lt 1 ]; then
echo "Error: host argument is required."
usage
fi
REMOTE_HOST="$1"
# Ensure local backup directory exists
mkdir -p "$LOCAL_BACKUP_DIR"
echo "Starting backup process..."
# Prompt for PGPASSWORD if not set
if [ -z "$PGPASSWORD" ]; then
printf "${YELLOW}Enter PostgreSQL password for user 'postgres': ${RESET}"
stty -echo
read PGPASSWORD
stty echo
echo
fi
# Execute remote commands via a single SSH call, stream the tarball to local file
ssh "$REMOTE_HOST" 'sh -s' >"$LOCAL_BACKUP_DIR/db_backups_${DATE}.tar.gz" <<ENDSSH
set -e
export PGPASSWORD='${PGPASSWORD}'
DATE=\$(date +%Y%m%d)
REMOTE_TMP_DIR="/tmp/db_backups_\${DATE}_\$\$"
echo "Creating temporary directory: \$REMOTE_TMP_DIR" >&2
mkdir -p "\$REMOTE_TMP_DIR"
echo "Retrieving database list..." >&2
DBLIST=\$(psql -h localhost -U postgres -Atc "SELECT datname FROM pg_database WHERE datistemplate = false AND datname NOT IN ('postgres', 'template0', 'template1');")
for DB in \$DBLIST; do
echo "Backing up database: \$DB" >&2
pg_dump -h localhost -U postgres -F c -b -f "\$REMOTE_TMP_DIR/\${DB}-\${DATE}.backup" "\$DB"
done
# Optional: Include the 'postgres' database
# echo "Backing up database: postgres"
# pg_dump -h localhost -U postgres -F c -b -f "\$REMOTE_TMP_DIR/postgres-\${DATE}.backup" "postgres"
echo "Creating tarball of backup files..." >&2
tar -C "\$REMOTE_TMP_DIR" -czf - .
echo "Cleaning up temporary files..." >&2
rm -rf "\$REMOTE_TMP_DIR"
ENDSSH
if [ $? -eq 0 ]; then
printf "${GREEN}Backup completed successfully!${RESET}\n"
echo "${GREEN}Backup file located at: $LOCAL_BACKUP_DIR/db_backups_${DATE}.tar.gz${RESET}\n"
else
echo "${RED}Backup failed.${RESET}\n"
exit 1
fi