Files
2026-01-16 19:04:48 +02:00

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)"