8.8 KiB
Backup Procedures
Date: January 2025
Status: Complete
Purpose: Comprehensive backup strategy for Moyos Wedding App
Overview
This document outlines the backup procedures for the Moyos Wedding App production deployment, including database backups, storage backups, and configuration backups.
Backup Strategy
Backup Types
- Database Backups - PostgreSQL database dumps
- Storage Backups - Supabase Storage or filesystem storage
- Configuration Backups - Application configs, Nginx configs, PM2 configs
Backup Frequency
- Database: Daily at 2:00 AM
- Storage: Daily at 3:00 AM
- Configuration: Weekly (Sunday at 1:00 AM)
Retention Policy
- Database Backups: 30 days
- Storage Backups: 30 days
- Configuration Backups: 90 days
Database Backups
Automated Backup Script
Location: scripts/backup-db.sh
Usage:
# Manual backup
./scripts/backup-db.sh
# With custom backup directory
BACKUP_DIR=/custom/path ./scripts/backup-db.sh
Setup Cron Job
# Edit crontab
crontab -e
# Add daily backup at 2 AM
0 2 * * * /opt/moyos-wedding-app/app/scripts/backup-db.sh >> /var/log/backup-db.log 2>&1
Backup Format
- Format: Compressed SQL dump (
.sql.gz) - Naming:
wedding_app_backup_YYYYMMDD_HHMMSS.sql.gz - Location:
/opt/backups/db/(default)
Verification
# List backups
ls -lh /opt/backups/db/
# Verify backup integrity
gunzip -t /opt/backups/db/wedding_app_backup_*.sql.gz
# Check backup size
du -sh /opt/backups/db/
Restore Procedure
Location: scripts/restore-db.sh
Usage:
# Restore from backup
./scripts/restore-db.sh /opt/backups/db/wedding_app_backup_20250115_020000.sql.gz
⚠️ WARNING: Restore will overwrite existing database. A safety backup is created automatically before restore.
Steps:
- Stop application:
pm2 stop moyos-wedding-app - Create manual backup (safety):
./scripts/backup-db.sh - Run restore:
./scripts/restore-db.sh <backup-file> - Verify restore: Check database contents
- Restart application:
pm2 start moyos-wedding-app
Storage Backups
Automated Backup Script
Location: scripts/backup-storage.sh
Usage:
# Auto-detect storage type
./scripts/backup-storage.sh
# Explicitly backup filesystem storage
./scripts/backup-storage.sh --filesystem
# Explicitly backup Supabase Storage
./scripts/backup-storage.sh --supabase
Setup Cron Job
# Edit crontab
crontab -e
# Add daily backup at 3 AM
0 3 * * * /opt/moyos-wedding-app/app/scripts/backup-storage.sh >> /var/log/backup-storage.log 2>&1
Backup Format
- Format: Compressed tar archive (
.tar.gz) - Naming:
storage_filesystem_YYYYMMDD_HHMMSS.tar.gzorstorage_supabase_YYYYMMDD_HHMMSS.tar.gz - Location:
/opt/backups/storage/(default)
Filesystem Storage Backup
Backs up public/uploads/ directory:
- Gallery photos (thumbnails and full images)
- User-uploaded files
Supabase Storage Backup
Note: Supabase Storage backup requires manual setup or Supabase CLI. The script provides a placeholder for automation.
Manual Backup (Supabase CLI):
# Install Supabase CLI
npm install -g supabase
# Login
supabase login
# Download storage
supabase storage download gallery --output /opt/backups/storage/supabase_$(date +%Y%m%d_%H%M%S)
Restore Procedure
Filesystem Storage:
# Extract backup
tar -xzf /opt/backups/storage/storage_filesystem_20250115_030000.tar.gz -C /opt/moyos-wedding-app/app/public/
# Verify files
ls -lh /opt/moyos-wedding-app/app/public/uploads/
Supabase Storage:
# Upload files using Supabase CLI
supabase storage upload gallery /opt/backups/storage/supabase_20250115_030000/
Configuration Backups
What Gets Backed Up
- Nginx configuration (
/etc/nginx/sites-available/moyos-wedding-app) - PM2 ecosystem config (
ecosystem.config.js) - Environment files (sanitized, no secrets)
- SSL certificates (Let's Encrypt)
- Systemd service files (if any)
Backup Script
Create /opt/backups/config-backup.sh:
#!/bin/bash
BACKUP_DIR="/opt/backups/config"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/config_backup_$DATE.tar.gz"
mkdir -p "$BACKUP_DIR"
# Backup Nginx config
tar -czf "$BACKUP_FILE" \
/etc/nginx/sites-available/moyos-wedding-app \
/opt/moyos-wedding-app/app/ecosystem.config.js \
/etc/letsencrypt/live/your-domain.com/ \
2>/dev/null || true
# Clean up old backups (90 days)
find "$BACKUP_DIR" -name "config_backup_*.tar.gz" -mtime +90 -delete
echo "Configuration backup created: $BACKUP_FILE"
Setup Cron Job
# Weekly backup on Sunday at 1 AM
0 1 * * 0 /opt/backups/config-backup.sh >> /var/log/backup-config.log 2>&1
Off-Site Backups
S3 Backup (Optional)
If BACKUP_S3_BUCKET environment variable is set, backups are automatically uploaded to S3:
# Set environment variable
export BACKUP_S3_BUCKET=your-backup-bucket
# Install AWS CLI
apt-get install -y awscli
# Configure credentials
aws configure
# Backups will automatically upload to S3
Manual Off-Site Backup
# Copy backups to external storage
rsync -av /opt/backups/ user@backup-server:/backups/moyos-wedding-app/
# Or use SCP
scp -r /opt/backups/ user@backup-server:/backups/moyos-wedding-app/
Backup Monitoring
Check Backup Status
# Check last backup time
ls -lth /opt/backups/db/ | head -5
ls -lth /opt/backups/storage/ | head -5
# Check backup logs
tail -f /var/log/backup-db.log
tail -f /var/log/backup-storage.log
Backup Health Check Script
Create /opt/backups/check-backups.sh:
#!/bin/bash
BACKUP_DIR="/opt/backups"
ALERT_EMAIL="admin@your-domain.com"
# Check if backups exist from last 25 hours
DB_BACKUP=$(find "$BACKUP_DIR/db" -name "*.sql.gz" -mtime -1 | head -1)
STORAGE_BACKUP=$(find "$BACKUP_DIR/storage" -name "*.tar.gz" -mtime -1 | head -1)
if [ -z "$DB_BACKUP" ]; then
echo "WARNING: No database backup found in last 25 hours" | mail -s "Backup Alert" "$ALERT_EMAIL"
fi
if [ -z "$STORAGE_BACKUP" ]; then
echo "WARNING: No storage backup found in last 25 hours" | mail -s "Backup Alert" "$ALERT_EMAIL"
fi
Disaster Recovery
Recovery Time Objective (RTO)
Target: < 4 hours
Recovery Point Objective (RPO)
Target: < 24 hours (daily backups)
Recovery Procedures
-
Identify Issue
- Check application logs
- Verify backup availability
- Determine recovery point
-
Prepare Environment
- Stop application
- Create safety backup
- Verify backup integrity
-
Restore Database
./scripts/restore-db.sh <backup-file> -
Restore Storage
# Filesystem tar -xzf <backup-file> -C /opt/moyos-wedding-app/app/public/ # Supabase (if applicable) supabase storage upload gallery <backup-directory> -
Verify Restore
- Check database contents
- Verify file availability
- Test application functionality
-
Restart Services
pm2 restart moyos-wedding-app systemctl reload nginx -
Post-Recovery
- Monitor application logs
- Verify all features working
- Document recovery process
Backup Best Practices
-
Test Restores Regularly
- Monthly restore tests
- Verify backup integrity
- Document any issues
-
Multiple Backup Locations
- Local backups (primary)
- Off-site backups (S3, external server)
- Multiple retention periods
-
Automated Monitoring
- Backup success/failure alerts
- Disk space monitoring
- Backup age verification
-
Documentation
- Keep backup procedures updated
- Document recovery procedures
- Maintain backup inventory
-
Security
- Encrypt backups (if sensitive)
- Secure backup storage
- Limit backup access
Troubleshooting
Backup Fails
Check:
- Disk space:
df -h - Permissions:
ls -la /opt/backups/ - Logs:
tail -f /var/log/backup-*.log - Database connectivity:
psql $DATABASE_URL -c "SELECT 1;"
Restore Fails
Check:
- Backup file integrity:
gunzip -t <backup-file> - Database connectivity
- Disk space
- Application status (should be stopped)
Backup Too Large
Solutions:
- Compress backups (already done)
- Clean up old backups
- Increase disk space
- Use incremental backups (advanced)
Backup Checklist
Daily
- Verify database backup completed
- Verify storage backup completed
- Check backup disk space
Weekly
- Verify configuration backup
- Test restore procedure (optional)
- Review backup logs
Monthly
- Full restore test
- Verify off-site backups
- Review retention policy
- Update documentation
Status: Backup procedures documented and ready for implementation. ✅