221 lines
6.9 KiB
Markdown
221 lines
6.9 KiB
Markdown
This guide is a work in progress and generated by ai, dont have time for guides. so this works
|
||
|
||
Rsync Setup Guide
|
||
|
||
Status: Work in Progress
|
||
For the unRAID Rsync Ecosystem — common.sh · Master.conf · rsync.sh · daily_sync.sh
|
||
|
||
Overview
|
||
|
||
This guide walks through setting up the rsync ecosystem on both your primary and secondary unRAID 7.x servers. By the end you will have:
|
||
|
||
SSH keys configured for server-to-server communication
|
||
Tailscale running on both servers for secure networking
|
||
Scripts scheduled and running via the User Scripts plugin
|
||
Automated daily sync of media shares and appdata profiles
|
||
Prerequisites
|
||
|
||
Both servers need the following before starting:
|
||
|
||
unRAID 7.x
|
||
User Scripts plugin installed via Community Applications
|
||
Tailscale plugin installed via Community Applications
|
||
Terminal access to both servers (via unRAID UI → Tools → Terminal, or SSH)
|
||
Step 1 — Tailscale Setup
|
||
|
||
Tailscale provides the secure network tunnel between your two servers. The scripts resolve the remote server's IP via Tailscale at runtime.
|
||
|
||
On Both Servers
|
||
|
||
Open Apps in the unRAID UI
|
||
Search for Tailscale and install the plugin
|
||
Once installed, go to Settings → Tailscale
|
||
Click Connect and authenticate with your Tailscale account
|
||
Verify both servers appear in your Tailscale admin console
|
||
|
||
Verify Connectivity
|
||
|
||
Run this on the primary to confirm it can see the secondary:
|
||
|
||
tailscale ip -4 unRAID-Jayred365
|
||
|
||
You should get back a 100.x.x.x IP. If not, check both servers in the Tailscale admin console.
|
||
|
||
Note: The hostnames used in Master.conf (HOST1 and HOST2) must match the Tailscale machine names exactly — these are case sensitive.
|
||
|
||
Step 2 — Generate SSH Keys (Server-to-Server)
|
||
|
||
The scripts use SSH keys for server-to-server rsync.
|
||
|
||
On Primary (unRAID-Gmer4Lfe):
|
||
|
||
ssh-keygen -t ed25519 -f /root/.ssh/Gmer4Lfe-rsync-key -C "gmer4lfe-rsync" -N ""
|
||
|
||
On Secondary (unRAID-Jayred365):
|
||
|
||
ssh-keygen -t ed25519 -f /root/.ssh/Jayred365-rsync-key -C "jayred365-rsync" -N ""
|
||
Copy Public Keys to Each Server
|
||
|
||
Primary → Secondary
|
||
|
||
# On primary
|
||
cat /root/.ssh/Gmer4Lfe-rsync-key.pub
|
||
|
||
Copy the output. Then on secondary:
|
||
|
||
mkdir -p /root/.ssh
|
||
echo "PASTE_PUBLIC_KEY_HERE" >> /root/.ssh/authorized_keys
|
||
chmod 600 /root/.ssh/authorized_keys
|
||
|
||
Secondary → Primary
|
||
|
||
# On secondary
|
||
cat /root/.ssh/Jayred365-rsync-key.pub
|
||
|
||
Copy the output. Then on primary:
|
||
|
||
mkdir -p /root/.ssh
|
||
echo "PASTE_PUBLIC_KEY_HERE" >> /root/.ssh/authorized_keys
|
||
chmod 600 /root/.ssh/authorized_keys
|
||
Test the Connection
|
||
|
||
From the primary, test SSH access to the secondary:
|
||
|
||
ssh -i /root/.ssh/Gmer4Lfe-rsync-key root@$(tailscale ip -4 unRAID-Jayred365) "echo connected"
|
||
|
||
You should see connected. If prompted for a password, recheck the key authorization.
|
||
|
||
Step 3 — Enable SSH on unRAID
|
||
|
||
unRAID 7.x has SSH disabled by default. Enable it on both servers so the scripts can connect:
|
||
|
||
Go to Settings → Management Access
|
||
Under Secure Shell, set SSH to Enabled
|
||
Set SSH port to 22 (default)
|
||
Click Apply
|
||
|
||
Security note: SSH is only exposed on your local network and Tailscale interface. The rsync scripts connect via Tailscale IP, so traffic is encrypted end-to-end.
|
||
|
||
Step 4 — Configure Master.conf
|
||
|
||
All user configuration lives in Master.conf. Open it and adjust the following to match your setup:
|
||
|
||
nano /mnt/user/appdata/unraid_scripts/Master.conf
|
||
|
||
Required Changes:
|
||
|
||
Variable Description Example
|
||
HOST1 Hostname of your primary server unRAID-Gmer4Lfe
|
||
HOST2 Hostname of your secondary server unRAID-Jayred365
|
||
HOST1_SSH_KEY Path to primary's rsync private key /root/.ssh/Gmer4Lfe-rsync-key
|
||
HOST2_SSH_KEY Path to secondary's rsync private key /root/.ssh/Jayred365-rsync-key
|
||
BW_LIMIT Global bandwidth limit in KB/s 12500
|
||
ROOTFS_WARN Remote rootfs % threshold before aborting 75
|
||
|
||
Daily Sync Shares
|
||
|
||
Add the full paths of all media shares you want synced nightly:
|
||
|
||
DAILY_SYNC_SHARES=(
|
||
/mnt/user/Movies
|
||
/mnt/user/Tv_Shows
|
||
/mnt/user/Music
|
||
# add more here
|
||
)
|
||
|
||
Profiles
|
||
|
||
Profiles control per-share rsync behaviour for your frequently synced appdata shares.
|
||
|
||
declare -A PROFILE_CRITICAL_CONTAINER_NAMES=(
|
||
[arrs_stack]="Sonarr Radarr Lidarr Prowlarr"
|
||
[important-data]="Postgres-NextCloud NextCloud"
|
||
)
|
||
|
||
Any share with no matching profile falls through to the global DEFAULT_RSYNC_OPTS.
|
||
|
||
Step 5 — Set Up User Scripts
|
||
|
||
The User Scripts plugin schedules and runs the scripts. Each sync job is its own script entry.
|
||
|
||
Frequent Sync Jobs
|
||
|
||
Create one script entry per appdata profile (Plugins → User Scripts → Add New Script)
|
||
Example for ARR stack:
|
||
#!/bin/bash
|
||
bash /mnt/user/appdata/unraid_scripts/Rsync/rsync.sh /mnt/user/appdata-Failover/Arrs_Stack
|
||
|
||
Daily Sync Orchestrator
|
||
|
||
#!/bin/bash
|
||
bash /mnt/user/appdata/unraid_scripts/Orchestrators/daily_sync.sh
|
||
Schedule daily at 01:00
|
||
Set scripts to run as Background Tasks
|
||
Step 6 — Verify the Setup
|
||
|
||
Manually test from the primary:
|
||
|
||
bash /mnt/user/appdata/unraid_scripts/Rsync/rsync.sh /mnt/user/appdata-Failover/Arrs_Stack --log
|
||
|
||
You should see a healthy run with:
|
||
|
||
━━━ ⚙️ Setup ━━━
|
||
ℹ️ [INFO] 🖥️ Host: unRAID-Gmer4Lfe → unRAID-Jayred365
|
||
ℹ️ [INFO] 🌐 Remote IP: 100.x.x.x
|
||
...
|
||
✅ [OK] All disks backing share are online
|
||
Step 7 — Secondary Server Initial Setup
|
||
|
||
If setting up secondary from scratch:
|
||
|
||
Complete Steps 1–5 on the secondary
|
||
Start the array and create your shares in the unRAID UI
|
||
Run the share recreation tool:
|
||
bash /mnt/user/appdata/unraid_scripts/Tools/recreate_shares.sh
|
||
Temporarily remove --delete from DEFAULT_RSYNC_OPTS for initial push
|
||
Restore --delete after the first run; next nightly run will clean .recovery files automatically
|
||
Troubleshooting
|
||
|
||
SSH connection refused
|
||
|
||
Verify SSH is enabled on target server (Step 3)
|
||
Check correct key referenced in Master.conf
|
||
Confirm Tailscale IP resolves
|
||
|
||
Pre-flight aborts
|
||
|
||
Rootfs above ROOTFS_WARN
|
||
Share exists but empty
|
||
Disk offline
|
||
|
||
Script not found
|
||
|
||
Verify scripts exist in /mnt/user/appdata/unraid_scripts/
|
||
Make scripts executable:
|
||
chmod +x /mnt/user/appdata/unraid_scripts/Rsync/rsync.sh
|
||
chmod +x /mnt/user/appdata/unraid_scripts/Orchestrators/daily_sync.sh
|
||
chmod +x /mnt/user/appdata/unraid_scripts/Tools/recreate_shares.sh
|
||
Available Flags
|
||
Flag Description
|
||
--dry-run or -n Run without making changes
|
||
--log Enable verbose logging
|
||
--no-log Disable logging
|
||
--status Print resolved configuration and exit
|
||
|
||
Examples
|
||
|
||
# Preview what would be synced without transferring
|
||
bash rsync.sh /mnt/user/Movies --dry-run --log
|
||
|
||
# Check profile and settings resolved for a share
|
||
bash rsync.sh /mnt/user/appdata-Failover/Arrs_Stack --status
|
||
Repository Structure
|
||
Unraid_Scripts/
|
||
├── Master.conf # All user configuration — edit this file only
|
||
├── common.sh # Shared library — functions used by all scripts
|
||
├── Rsync/
|
||
│ └── rsync.sh # Core rsync script — called per share
|
||
├── Orchestrators/
|
||
│ └── daily_sync.sh # Daily media sync orchestrator
|
||
└── Tools/
|
||
└── recreate_shares.sh # Share directory recreation from cfg fil |