82 lines
2.5 KiB
Bash
Executable File
82 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Database Backup Script for Wedding App
|
|
# This script creates a backup of the PostgreSQL database
|
|
# Designed for Proxmox server with Synology NAS storage
|
|
|
|
set -e # Exit on error
|
|
|
|
# Configuration
|
|
BACKUP_DIR="${BACKUP_DIR:-/mnt/synology/wedding-app/backups}"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
RETENTION_DAYS=30
|
|
|
|
# Database connection from environment
|
|
if [ -z "$DATABASE_URL" ]; then
|
|
echo "Error: DATABASE_URL environment variable is not set"
|
|
exit 1
|
|
fi
|
|
|
|
# Parse DATABASE_URL (format: postgresql://user:password@host:port/database)
|
|
DB_URL="$DATABASE_URL"
|
|
|
|
# Extract database name from URL
|
|
DB_NAME=$(echo "$DB_URL" | sed -n 's/.*\/\([^?]*\).*/\1/p')
|
|
|
|
if [ -z "$DB_NAME" ]; then
|
|
echo "Error: Could not extract database name from DATABASE_URL"
|
|
exit 1
|
|
fi
|
|
|
|
# Create backup directory if it doesn't exist
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
# Backup filename
|
|
BACKUP_FILE="$BACKUP_DIR/wedding_app_backup_${TIMESTAMP}.sql.gz"
|
|
|
|
echo "Starting database backup..."
|
|
echo "Database: $DB_NAME"
|
|
echo "Backup file: $BACKUP_FILE"
|
|
|
|
# Create backup using pg_dump
|
|
# Note: This assumes pg_dump is available in PATH
|
|
# For Docker/container setups, you may need to use docker exec
|
|
if command -v pg_dump &> /dev/null; then
|
|
# Direct pg_dump (if running on host)
|
|
pg_dump "$DB_URL" | gzip > "$BACKUP_FILE"
|
|
elif command -v docker &> /dev/null; then
|
|
# Docker-based backup (if database is in container)
|
|
# Extract container name from DATABASE_URL or use default
|
|
CONTAINER_NAME="${DB_CONTAINER_NAME:-postgres}"
|
|
docker exec "$CONTAINER_NAME" pg_dump -U postgres "$DB_NAME" | gzip > "$BACKUP_FILE"
|
|
else
|
|
echo "Error: Neither pg_dump nor docker found. Cannot create backup."
|
|
exit 1
|
|
fi
|
|
|
|
# Verify backup was created
|
|
if [ ! -f "$BACKUP_FILE" ]; then
|
|
echo "Error: Backup file was not created"
|
|
exit 1
|
|
fi
|
|
|
|
# Check backup file size
|
|
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
|
echo "Backup created successfully: $BACKUP_FILE ($BACKUP_SIZE)"
|
|
|
|
# Clean up old backups (keep last 30 days)
|
|
echo "Cleaning up backups older than $RETENTION_DAYS days..."
|
|
find "$BACKUP_DIR" -name "wedding_app_backup_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
|
|
|
|
# Count remaining backups
|
|
REMAINING=$(find "$BACKUP_DIR" -name "wedding_app_backup_*.sql.gz" -type f | wc -l)
|
|
echo "Backup complete. $REMAINING backup(s) retained."
|
|
|
|
# Optional: Sync to Synology NAS if mounted
|
|
if [ -d "/mnt/synology" ]; then
|
|
echo "Syncing backup to Synology NAS..."
|
|
# Add rsync command here if needed
|
|
# rsync -av "$BACKUP_FILE" "/mnt/synology/wedding-app/backups/"
|
|
fi
|
|
|
|
echo "Backup process completed successfully at $(date)"
|