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:
- Performance Monitoring: Tracks backup operations with JSON-based performance logging
- Intelligent Backup Detection: Only backs up files that have changed since last backup
- WAL File Handling: Properly handles SQLite Write-Ahead Logging files
- Database Integrity Verification: Comprehensive integrity checks with automated repair options
- Parallel Processing: Concurrent verification for improved performance
- Multi-Channel Notifications: Console, webhook, and email notification support
- Checksum Caching: Intelligent caching to avoid recalculating unchanged file checksums
- Enhanced Service Management: Safe Plex service management with progress indicators
- Comprehensive Logging: Detailed logs with color-coded output and timestamps
- 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-waland.db-shmfiles 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-parallelfor 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.shscript is available and executable. This script is used to stop and start the Plex Media Server service. - The script uses
systemctlto manage the Plex Media Server service. Ensure thatsystemctlis available on your system. - New Directory Structure: The enhanced backup system stores only compressed
.tar.gzfiles directly in the backup root directory, eliminating intermediate dated directories. - Archive Naming: Backup files follow the naming convention
plex-backup-YYYYMMDD_HHMMSS.tar.gzfor 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_ROOTvariable. 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.