Files
basil/scripts/backup-standalone-postgres.sh
Paul R Kartchner 883b7820ed
All checks were successful
Basil CI/CD Pipeline / Shared Package Tests (push) Successful in 1m38s
Basil CI/CD Pipeline / Security Scanning (push) Successful in 1m55s
Basil CI/CD Pipeline / Web Tests (push) Successful in 2m9s
Basil CI/CD Pipeline / Build All Packages (push) Successful in 1m31s
Basil CI/CD Pipeline / Code Linting (push) Successful in 1m57s
Basil CI/CD Pipeline / API Tests (push) Successful in 2m34s
Basil CI/CD Pipeline / E2E Tests (push) Has been skipped
Basil CI/CD Pipeline / Build & Push Docker Images (push) Successful in 5m5s
Basil CI/CD Pipeline / Trigger Deployment (push) Successful in 12s
docs: add comprehensive database migration and backup documentation
Added complete guide for migrating from containerized PostgreSQL to standalone
server with production-grade backup strategies.

New files:
- docs/DATABASE-MIGRATION-GUIDE.md - Complete migration guide with step-by-step
  instructions, troubleshooting, and rollback procedures
- scripts/backup-standalone-postgres.sh - Automated backup script with daily,
  weekly, and monthly retention policies
- scripts/restore-standalone-postgres.sh - Safe restore script with verification
  and pre-restore safety backup

Features:
- Hybrid backup strategy (PostgreSQL native + Basil API)
- Automated retention policy (30/90/365 days)
- Integrity verification
- Safety backups before restore
- Complete troubleshooting guide
- Rollback procedures

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 15:29:35 -07:00

75 lines
2.1 KiB
Bash
Executable File

#!/bin/bash
#
# Basil Backup Script for Standalone PostgreSQL
# Place on database server and run via cron
#
# Cron example (daily at 2 AM):
# 0 2 * * * /path/to/backup-standalone-postgres.sh
set -e
# Configuration
DB_HOST="localhost"
DB_PORT="5432"
DB_NAME="basil"
DB_USER="basil"
BACKUP_DIR="/var/backups/basil"
RETENTION_DAYS=30
# Create backup directories
mkdir -p "$BACKUP_DIR/daily"
mkdir -p "$BACKUP_DIR/weekly"
mkdir -p "$BACKUP_DIR/monthly"
# Timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DATE=$(date +%Y%m%d)
DAY_OF_WEEK=$(date +%u) # 1=Monday, 7=Sunday
DAY_OF_MONTH=$(date +%d)
# Daily backup
echo "Starting daily backup: $TIMESTAMP"
DAILY_BACKUP="$BACKUP_DIR/daily/basil-$DATE.sql.gz"
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME" | gzip > "$DAILY_BACKUP"
echo "Daily backup completed: $DAILY_BACKUP"
# Weekly backup (on Sundays)
if [ "$DAY_OF_WEEK" -eq 7 ]; then
echo "Creating weekly backup"
WEEK=$(date +%V)
WEEKLY_BACKUP="$BACKUP_DIR/weekly/basil-week$WEEK-$DATE.sql.gz"
cp "$DAILY_BACKUP" "$WEEKLY_BACKUP"
echo "Weekly backup completed: $WEEKLY_BACKUP"
fi
# Monthly backup (on 1st of month)
if [ "$DAY_OF_MONTH" -eq 01 ]; then
echo "Creating monthly backup"
MONTH=$(date +%Y%m)
MONTHLY_BACKUP="$BACKUP_DIR/monthly/basil-$MONTH.sql.gz"
cp "$DAILY_BACKUP" "$MONTHLY_BACKUP"
echo "Monthly backup completed: $MONTHLY_BACKUP"
fi
# Cleanup old backups
echo "Cleaning up old backups..."
find "$BACKUP_DIR/daily" -name "basil-*.sql.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR/weekly" -name "basil-*.sql.gz" -mtime +90 -delete
find "$BACKUP_DIR/monthly" -name "basil-*.sql.gz" -mtime +365 -delete
# Verify backup integrity
echo "Verifying backup integrity..."
if gzip -t "$DAILY_BACKUP"; then
BACKUP_SIZE=$(du -h "$DAILY_BACKUP" | cut -f1)
echo "Backup verification successful. Size: $BACKUP_SIZE"
else
echo "ERROR: Backup verification failed!" >&2
exit 1
fi
# Optional: Send notification (uncomment to enable)
# echo "Basil backup completed successfully on $(hostname) at $(date)" | \
# mail -s "Basil Backup Success" your-email@example.com
echo "Backup process completed successfully"