Files
shell/docs/plex-backup.md

9.6 KiB

Enhanced Plex Backup Script Documentation

This document provides comprehensive documentation for the enhanced backup-plex.sh script. This advanced backup solution includes performance monitoring, parallel processing, intelligent notifications, WAL file handling, and automated testing capabilities.

Script Overview

The enhanced script performs the following advanced tasks:

  1. Performance Monitoring: Tracks backup operations with JSON-based performance logging
  2. Intelligent Backup Detection: Only backs up files that have changed since last backup
  3. WAL File Handling: Properly handles SQLite Write-Ahead Logging files
  4. Database Integrity Verification: Comprehensive integrity checks with automated repair options
  5. Parallel Processing: Concurrent verification for improved performance
  6. Multi-Channel Notifications: Console, webhook, and email notification support
  7. Checksum Caching: Intelligent caching to avoid recalculating unchanged file checksums
  8. Enhanced Service Management: Safe Plex service management with progress indicators
  9. Comprehensive Logging: Detailed logs with color-coded output and timestamps
  10. Automated Cleanup: Configurable retention policies for old backups

Enhanced Features

Performance Tracking

  • JSON Performance Logs: All operations are timed and logged to logs/plex-backup-performance.json
  • Performance Reports: Automatic generation of average performance metrics
  • Operation Monitoring: Tracks backup, verification, service management, and overall script execution times

Notification System

The script supports multiple notification channels:

Console Notifications

  • Color-coded status messages (Success: Green, Error: Red, Warning: Yellow, Info: Blue)
  • Timestamped log entries with clear formatting

Webhook Notifications

./backup-plex.sh --webhook=https://your-webhook-url.com/endpoint

Sends JSON payloads with backup status, hostname, and timestamps.

Email Notifications

./backup-plex.sh --email=admin@example.com

Requires sendmail to be configured on the system.

WAL File Management

The script now properly handles SQLite Write-Ahead Logging files:

  • Automatic Detection: Identifies and backs up .db-wal and .db-shm files when present
  • WAL Checkpointing: Performs PRAGMA wal_checkpoint(FULL) before integrity checks
  • Safe Backup: Ensures WAL files are properly backed up alongside main database files

Database Integrity & Repair

Enhanced database management features:

  • Pre-backup Integrity Checks: Verifies database health before backup operations
  • Automated Repair: Optional automatic repair of corrupted databases using advanced techniques
  • Interactive Repair Mode: Prompts for repair decisions when issues are detected
  • Post-repair Verification: Re-checks integrity after repair operations

Parallel Processing

  • Concurrent Verification: Parallel backup verification for improved performance
  • Fallback Safety: Automatically falls back to sequential processing if parallel mode fails
  • Configurable: Can be disabled with --no-parallel for maximum safety

Command Line Options

Usage: ./backup-plex.sh [OPTIONS]

Options:
  --auto-repair        Automatically attempt to repair corrupted databases
  --check-integrity    Only check database integrity, don't backup
  --non-interactive    Run in non-interactive mode (for automation)
  --no-parallel        Disable parallel verification (slower but safer)
  --no-performance     Disable performance monitoring
  --webhook=URL        Send notifications to webhook URL
  --email=ADDRESS      Send notifications to email address
  -h, --help          Show help message

Detailed Steps

1. Create Log Directory

mkdir -p /mnt/share/media/backups/logs || { echo "Failed to create log directory"; exit 1; }

This command ensures that the log directory exists. If it doesn't, it creates the directory. If the directory creation fails, the script exits with an error message.

2. Define Log File

LOG_FILE="/mnt/share/media/backups/logs/backup_log_$(date +%Y%m%d_%H%M%S).md"

This line defines the log file path, including the current date and time in the filename to ensure uniqueness.

3. Define Log File Details Function

log_file_details() {
    local src=$1
    local dest=$2
    local size=$(du -sh "$dest" | cut -f1)
    echo "Source: $src" >> "$LOG_FILE"
    echo "Destination: $dest" >> "$LOG_FILE"
    echo "Size: $size" >> "$LOG_FILE"
}

This function logs the details of the copied files, including the source, destination, and size.

4. Stop Plex Media Server Service

if systemctl is-active --quiet plexmediaserver.service; then
  /home/acedanger/shell/plex.sh stop || { echo "Failed to stop plexmediaserver.service"; exit 1; }
fi

This block checks if the Plex Media Server service is running. If it is, the script stops the service using a custom script (plex.sh).

5. Backup Plex Database Files and Preferences

The enhanced backup system now creates compressed archives directly, eliminating intermediate directories:

# Files are copied to temporary staging area for verification
cp "/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db" "$BACKUP_PATH/"
log_file_details "com.plexapp.plugins.library.db" "$BACKUP_PATH/"

cp "/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.blobs.db" "$BACKUP_PATH/"
log_file_details "com.plexapp.plugins.library.blobs.db" "$BACKUP_PATH/"

cp "/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Preferences.xml" "$BACKUP_PATH/"
log_file_details "Preferences.xml" "$BACKUP_PATH/"

These commands copy the Plex database files and preferences directly to the backup root directory. Each file copy operation includes integrity verification and checksum validation.

6. Create Compressed Archive

# Create archive directly with timestamp naming convention
final_archive="${BACKUP_ROOT}/plex-backup-$(date '+%Y%m%d_%H%M%S').tar.gz"
tar -czf "$final_archive" -C "$temp_staging_dir" .

The system now creates compressed archives directly using a timestamp-based naming convention (plex-backup-YYYYMMDD_HHMMSS.tar.gz), eliminating the need for intermediate dated directories.

7. Archive Validation and Cleanup

# Validate archive integrity
if tar -tzf "$final_archive" >/dev/null 2>&1; then
    log_success "Archive created and validated: $(basename "$final_archive")"
    # Clean up temporary staging files
    rm -rf "$temp_staging_dir"
else
    log_error "Archive validation failed"
    rm -f "$final_archive"
fi

The system validates the created archive and removes temporary staging files, ensuring only valid compressed backups are retained in the backup root directory.

8. Send Notification

curl \
    -H tags:popcorn,backup,plex,${HOSTNAME} \
    -d "The Plex databases have been saved to the /media/backups/plex folder as plex-backup-YYYYMMDD_HHMMSS.tar.gz" \
    https://notify.peterwood.rocks/lab || { echo "Failed to send notification"; exit 1; }

This command sends a notification upon completion of the backup process, indicating the compressed archive has been created. If the notification fails, the script exits with an error message.

9. Restart Plex Media Server Service

if systemctl is-enabled --quiet plexmediaserver.service; then
  /home/acedanger/shell/plex.sh start || { echo "Failed to start plexmediaserver.service"; exit 1; }
fi

This block checks if the Plex Media Server service is enabled. If it is, the script restarts the service using a custom script (plex.sh).

10. Legacy Cleanup

# Clean up any remaining dated directories from old backup structure
find "${BACKUP_ROOT}" -maxdepth 1 -type d -name "????????" -exec rm -rf {} \; 2>/dev/null || true

The enhanced system includes cleanup of legacy dated directories from previous backup structure versions, ensuring a clean tar.gz-only backup directory.

Important Information

  • Ensure that the plex.sh script is available and executable. This script is used to stop and start the Plex Media Server service.
  • The script uses systemctl to manage the Plex Media Server service. Ensure that systemctl is available on your system.
  • New Directory Structure: The enhanced backup system stores only compressed .tar.gz files directly in the backup root directory, eliminating intermediate dated directories.
  • Archive Naming: Backup files follow the naming convention plex-backup-YYYYMMDD_HHMMSS.tar.gz for easy identification and sorting.
  • Legacy Compatibility: The system automatically cleans up old dated directories from previous backup versions during operation.
  • The backup directory path is configurable through the BACKUP_ROOT variable. Modify this path as needed to fit your environment.
  • The script logs important actions and errors to timestamped log files. Check the log files for details if any issues arise.
  • Backup Validation: All archives undergo integrity checking to ensure backup reliability.

Final Directory Structure

/mnt/share/media/backups/plex/
├── plex-backup-20250125_143022.tar.gz
├── plex-backup-20250124_143011.tar.gz
├── plex-backup-20250123_143008.tar.gz
└── logs/
    ├── backup_log_20250125_143022.md
    └── plex-backup-performance.json

By following this documentation, you should be able to understand and use the enhanced backup-plex.sh script effectively with its new streamlined tar.gz-only structure.