diff --git a/README.md b/README.md new file mode 100644 index 0000000..852447b --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# Unraid Backup & Recovery Plan + +_Last revised:_ 2025-10-31 +_Server name:_ Gyarados + +--- + +## System Overview + +| Component | Details | +|------------|----------| +| **Array** | 4 drives total (3 data + 1 parity) | +| **Parity** | 1 drive (single parity protection) | +| **Pools** | - `cache_protected` → 500GB RAID1 (btrfs)
- `cache_appdata` → 500GB RAID1 (btrfs)
- `cache` → 4TB XFS (no redundancy)| +| **Important Shares** | `appdata`, `system`, `backups` | +| **Unraid Flash Drive** | Backed up daily by CA Backup/Restore plugin | + +--- + +## Backup Strategy + +### Local / Onsite +| Backup Type | Tool | Frequency | Destination | Notes | +|--------------|------|------------|--------------|-------| +| **Appdata + Flash** | CA Backup/Restore | Daily | `/mnt/user/backups/unraid_backups` on array | Stored in “backups” share, included in offsite sync | +| **Array Data Backup** | `rsync` | Monthly | External 28TB USB drive | Plugged in manually, includes flash + appdata backups | +| **Parity Check** | Unraid checker | Monthly | N/A | Non-correcting, same day as backup | + +### Offsite +| Backup Type | Tool | Frequency | Destination | Notes | +|--------------|------|------------|--------------|-------| +| **1st Critical Data Backup** | Duplicacy | Nightly | Backblaze B2 | Backs up `/mnt/user/backups` share (includes appdata + flash backups) | +| **2nd Critical Data Backup** | rclone | Weekly | Backblaze B2 | Backs up `/mnt/user/backups` share (includes appdata + flash backups) | +| **Offsite Verification** | Scripted Duplicacy restore | Monthly | Local `test_restore` folder | Verifies integrity with checksum comparison | + +--- + +## Maintenance Schedule + +| Task | Frequency | Tool / Command | Notes | +|------|------------|----------------|-------| +| **Parity Check (non-correcting)** | Monthly | Unraid Checker | Run before external backup | +| **External Backup (rsync)** | Monthly | 28TB External Userscript | Rotate drive offsite if possible | +| **btrfs Scrub (cache pools)** | Monthly | `btrfs scrub start -Bd /mnt/cache_protected` and `/mnt/cache_appdata` | Detects and repairs bitrot | +| **Duplicacy Check** | Monthly | `duplicacy check -a -tabular` | Confirms remote chunks are valid | +| **File Integrity Verification** | Monthly | Offsite Verify Userscript | Grab random files, checksum them and compare vs. backup | +| **Recovery Test** | Every 90 days | Manual | Restore 3-5 files from each backup source | + +--- + +## Recovery Procedures + +### Array or Disk Failure +1. Confirm only one disk is disabled and parity is valid before proceeding with rebuild. +2. Identify the failed drive by serial number. Stop the array. +3. Replace the failed drive with a new, precleared one and assign it to the same slot. +4. Start the array — Unraid will begin rebuilding the disk from parity. +5. Run a **non-correcting parity check** to confirm parity accuracy post-rebuild. + +### Flash Drive Failure +1. Replace flash with new USB stick. +2. Copy contents of latest flash backup (gyarados-flash-backup.zip) from `/mnt/user/backups/unraid_backups` or Backblaze. +3. Transfer license using Unraid’s automated license replacement system (Tools → Registration). + +### Appdata Loss / Corruption +1. Stop the Docker service before restoring appdata. +2. Install “CA Backup/Restore Appdata” plugin (if not already). +3. Select most recent backup under `/mnt/user/backups/unraid_backups/`. +4. Click "Restore" at the top of the Appdata Restore plugin and follow instructions. +5. Start the Docker service and verify containers. + +### Full Array Loss / Catastrophic Event +1. Reinstall Unraid on new flash drive if needed. +2. Recreate array and pools matching original layout from system overview. +3. Restore data from: + - External 28TB backup drive (via rsync) + - Duplicacy or rclone (Backblaze) for critical data if External is damaged + +