Files
moyosapp_beta.0.0.3/docs/backup-procedures.md
2026-01-15 16:19:14 +02:00

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

  1. Database Backups - PostgreSQL database dumps
  2. Storage Backups - Supabase Storage or filesystem storage
  3. 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:

  1. Stop application: pm2 stop moyos-wedding-app
  2. Create manual backup (safety): ./scripts/backup-db.sh
  3. Run restore: ./scripts/restore-db.sh <backup-file>
  4. Verify restore: Check database contents
  5. 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.gz or storage_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

  1. Identify Issue

    • Check application logs
    • Verify backup availability
    • Determine recovery point
  2. Prepare Environment

    • Stop application
    • Create safety backup
    • Verify backup integrity
  3. Restore Database

    ./scripts/restore-db.sh <backup-file>
    
  4. Restore Storage

    # Filesystem
    tar -xzf <backup-file> -C /opt/moyos-wedding-app/app/public/
    
    # Supabase (if applicable)
    supabase storage upload gallery <backup-directory>
    
  5. Verify Restore

    • Check database contents
    • Verify file availability
    • Test application functionality
  6. Restart Services

    pm2 restart moyos-wedding-app
    systemctl reload nginx
    
  7. Post-Recovery

    • Monitor application logs
    • Verify all features working
    • Document recovery process

Backup Best Practices

  1. Test Restores Regularly

    • Monthly restore tests
    • Verify backup integrity
    • Document any issues
  2. Multiple Backup Locations

    • Local backups (primary)
    • Off-site backups (S3, external server)
    • Multiple retention periods
  3. Automated Monitoring

    • Backup success/failure alerts
    • Disk space monitoring
    • Backup age verification
  4. Documentation

    • Keep backup procedures updated
    • Document recovery procedures
    • Maintain backup inventory
  5. 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.