← back to Watches
scripts/backup-postgres.sh
77 lines
#!/bin/bash
# PostgreSQL Backup Script with Retention Policy
# 7 daily, 4 weekly, 12 monthly backups
set -e
# Configuration
BACKUP_DIR="${BACKUP_DIR:-/root/Projects/watches/backups/postgres}"
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_NAME="${DB_NAME:-omega_watches}"
DB_USER="${DB_USER:-postgres}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DAY_OF_WEEK=$(date +%u) # 1=Monday, 7=Sunday
DAY_OF_MONTH=$(date +%d)
# Create backup directories
mkdir -p "$BACKUP_DIR/daily"
mkdir -p "$BACKUP_DIR/weekly"
mkdir -p "$BACKUP_DIR/monthly"
echo "=== PostgreSQL Backup - $(date) ==="
# Create backup
BACKUP_FILE="$BACKUP_DIR/daily/omega_watches_${TIMESTAMP}.sql.gz"
echo "Creating backup: $BACKUP_FILE"
PGPASSWORD=$DB_PASSWORD pg_dump \
-h $DB_HOST \
-p $DB_PORT \
-U $DB_USER \
-d $DB_NAME \
--format=plain \
--no-owner \
--no-privileges \
| gzip > "$BACKUP_FILE"
# Get backup size
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "Backup created: $BACKUP_SIZE"
# Weekly backup (Sunday)
if [ "$DAY_OF_WEEK" = "7" ]; then
echo "Creating weekly backup..."
cp "$BACKUP_FILE" "$BACKUP_DIR/weekly/omega_watches_weekly_${TIMESTAMP}.sql.gz"
fi
# Monthly backup (1st of month)
if [ "$DAY_OF_MONTH" = "01" ]; then
echo "Creating monthly backup..."
cp "$BACKUP_FILE" "$BACKUP_DIR/monthly/omega_watches_monthly_${TIMESTAMP}.sql.gz"
fi
# Retention: Keep 7 daily backups
echo "Cleaning old daily backups (keeping 7)..."
cd "$BACKUP_DIR/daily"
ls -t *.sql.gz 2>/dev/null | tail -n +8 | xargs -r rm -f
# Retention: Keep 4 weekly backups
echo "Cleaning old weekly backups (keeping 4)..."
cd "$BACKUP_DIR/weekly"
ls -t *.sql.gz 2>/dev/null | tail -n +5 | xargs -r rm -f
# Retention: Keep 12 monthly backups
echo "Cleaning old monthly backups (keeping 12)..."
cd "$BACKUP_DIR/monthly"
ls -t *.sql.gz 2>/dev/null | tail -n +13 | xargs -r rm -f
# Summary
echo ""
echo "=== Backup Summary ==="
echo "Daily backups: $(ls -1 $BACKUP_DIR/daily/*.sql.gz 2>/dev/null | wc -l)"
echo "Weekly backups: $(ls -1 $BACKUP_DIR/weekly/*.sql.gz 2>/dev/null | wc -l)"
echo "Monthly backups: $(ls -1 $BACKUP_DIR/monthly/*.sql.gz 2>/dev/null | wc -l)"
echo "Total size: $(du -sh $BACKUP_DIR | cut -f1)"
echo "=== Backup Complete ==="