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
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>
75 lines
2.1 KiB
Bash
Executable File
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"
|