Merge pull request #6 from outis1one/claude/review-repo-docs-QFDqX

Overhaul backup system: rsync for local, rclone for encrypted cloud
This commit is contained in:
outis1one
2025-12-28 10:47:31 -05:00
committed by GitHub
2 changed files with 523 additions and 512 deletions
+143 -119
View File
@@ -8,8 +8,8 @@ Automated setup script for Ubuntu 24.04 Desktop that installs additional tools,
- **Dry-run mode** - Preview what would be installed without making changes - **Dry-run mode** - Preview what would be installed without making changes
- **Unattended mode** - Run with defaults for automated/scripted installs - **Unattended mode** - Run with defaults for automated/scripted installs
- **Logging** - All output logged to `/var/log/post-install.log` - **Logging** - All output logged to `/var/log/post-install.log`
- **Backup options** - Choose rsync (faster, local) or rclone (cloud support) - **Local backup** - rsync to 1-4 drives with customizable names
- **Backup modes** - Full backup (one drive) or split backup (two drives) - **Cloud backup** - Encrypted backup to Google Drive, OneDrive, or 40+ providers
## What This Script Does ## What This Script Does
@@ -33,6 +33,7 @@ Automated setup script for Ubuntu 24.04 Desktop that installs additional tools,
- Protects against SSH brute-force attacks - Protects against SSH brute-force attacks
- Bans IPs after 5 failed attempts for 1 hour - Bans IPs after 5 failed attempts for 1 hour
- Only offered when SSH password authentication remains enabled - Only offered when SSH password authentication remains enabled
- **Note:** fail2ban provides no benefit with key-only SSH because SSH keys cannot be brute-forced (they're 4096-bit cryptographic keys, not passwords)
- **UFW Firewall** - **UFW Firewall**
- Simple firewall management - Simple firewall management
- Automatically allows SSH (port 22) - Automatically allows SSH (port 22)
@@ -61,24 +62,43 @@ Automated setup script for Ubuntu 24.04 Desktop that installs additional tools,
- Detects if already installed - Detects if already installed
### Backup System (Optional) ### Backup System (Optional)
Choose your backup tool and mode:
**Backup Tools:** **Local Backup (rsync):**
- **rsync** (recommended for local drives) - Syncs your primary drive to 1-4 backup drives
- Delta transfers - only changed bytes are copied - Delta transfers - only changed bytes are copied
- Faster incremental backups - Customizable drive names (default: primary, backup1, backup2, etc.)
- Built into most Linux systems - Systemd timer for scheduled daily backups at 2 AM
- **rclone** (better for cloud storage)
- Supports 40+ cloud providers (S3, Google Drive, Dropbox...)
- File-level sync
**Backup Modes:** **Why rsync instead of RAID?**
- **Full** - Mirror entire primary to one backup drive (simpler) - RAID mirrors corruption instantly - rsync gives you time to notice problems
- **Split** - Divide data between two smaller backup drives (budget-friendly) - RAID requires identical drives - rsync works with any sizes
- RAID is complex to set up/recover - rsync is simple copy
- rsync can run on schedule - RAID is always-on (more wear)
- With rsync, backup drives can be disconnected for safety
**Cloud Backup (rclone, optional):**
- Encrypted cloud backup to Google Drive, OneDrive, or 40+ providers
- Files are encrypted BEFORE upload - cloud provider cannot read them
- Guided setup for Google Drive and OneDrive with encryption
- rclone.conf automatically backed up to all local backup drives
**Drive Mount Points (`~/drives/`):**
The script creates and manages mount points for your drives:
```
~/drives/
├── primary/ # Your main data drive
├── backup1/ # First backup drive
└── backup2/ # Second backup drive (split mode only)
```
**Interactive Drive Mounting:**
During backup setup, the script:
1. Shows available block devices (`lsblk`)
2. Asks for device paths (e.g., `/dev/sdb1`, `/dev/sdc1`)
3. Mounts drives to `~/drives/` directories
4. Optionally adds entries to `/etc/fstab` for auto-mount at boot
**Features:** **Features:**
- Mount point management at `~/drives/`
- Interactive drive mounting with automatic fstab configuration
- Systemd timer for scheduled daily backups at 2 AM - Systemd timer for scheduled daily backups at 2 AM
- Detects existing configuration and offers to reconfigure - Detects existing configuration and offers to reconfigure
@@ -149,9 +169,10 @@ The script shows current system status and asks:
- If yes: Set password for Samba user - If yes: Set password for Samba user
- **NetBird**: Install NetBird mesh VPN? (y/n) - **NetBird**: Install NetBird mesh VPN? (y/n)
- **RustDesk**: Install RustDesk remote desktop? (y/n) - **RustDesk**: Install RustDesk remote desktop? (y/n)
- **Backup System**: Set up backup system? (y/n) - **Local Backup**: Set up local backup with rsync? (y/n)
- If yes: Choose tool (rsync/rclone), mode (full/split) - If yes: Configure drive names, mount drives, fstab configuration
- Mount drives now? Device paths, fstab configuration - **Cloud Backup**: Set up encrypted cloud backup? (y/n)
- If yes: Choose provider (Google Drive, OneDrive, other), set up encryption
- **UFW Firewall**: Enable and configure UFW? (y/n) - **UFW Firewall**: Enable and configure UFW? (y/n)
### 5. Post-Installation Steps ### 5. Post-Installation Steps
@@ -162,11 +183,9 @@ The script shows current system status and asks:
logout logout
``` ```
**If you enabled backup system (split mode):** **If you enabled cloud backup:**
```bash - Run `rclone config` if you need to reconfigure
# Configure backup script to set which folders go to which drive - Keep your `~/.config/rclone/rclone.conf` backed up securely off-site
sudo nano /usr/local/bin/backup-scripts/rsync-backup.sh # or rclone-backup.sh
```
## SSH Configuration ## SSH Configuration
@@ -211,93 +230,85 @@ Use it to:
*This section applies if you chose to set up the backup system during installation.* *This section applies if you chose to set up the backup system during installation.*
### rsync vs rclone ### Local Backup (rsync)
| Feature | rsync | rclone | The local backup system uses rsync to sync your primary drive to one or more backup drives.
|---------|-------|--------|
| **Best for** | Local drives | Cloud storage |
| **Transfer method** | Delta (byte-level) | File-level |
| **Speed** | Faster for incremental | Slower for local |
| **Cloud support** | SSH only | 40+ providers |
**Recommendation:** Use rsync for local drive backups, rclone for cloud backups.
### Full vs Split Backup Mode
**Full Backup:**
- Mirrors entire primary → backup1
- Requires: backup drive ≥ primary drive
- Example: 4TB primary → 4TB+ backup
**Split Backup:**
- Divides folders between backup1 and backup2
- Useful when: Primary > each backup drive
- Example: 4TB primary → 2TB backup1 + 2TB backup2
```
# Split backup example:
primary/work/ (500G) → backup1/work/ ┐
primary/photos/ (800G) → backup1/photos/ ├─ 1.3TB on backup1
primary/videos/ (1.2T) → backup2/videos/ ┐
primary/music/ (500G) → backup2/music/ ├─ 1.7TB on backup2
```
### Step-by-Step Backup Setup
Replace `{tool}` with your chosen tool (rsync or rclone).
#### 1. Check Your Folder Sizes (for split mode)
**Run Backup:**
```bash ```bash
du -sh ~/drives/primary/* sudo /usr/local/bin/backup-scripts/local-backup.sh
``` ```
#### 2. Edit the Backup Script (split mode only) **View Log:**
```bash ```bash
sudo nano /usr/local/bin/backup-scripts/{tool}-backup.sh tail -f /var/log/rsync-backup.log
``` ```
Configure which folders go to which backup drive: **Enable Automatic Daily Backups:**
```bash ```bash
# Folders to backup to BACKUP1 only sudo systemctl enable rsync-backup.timer
BACKUP1_DIRS=( sudo systemctl start rsync-backup.timer
"work"
"photos"
)
# Folders to backup to BACKUP2 only
BACKUP2_DIRS=(
"videos"
"music"
)
```
#### 3. Run First Backup
```bash
sudo /usr/local/bin/backup-scripts/{tool}-backup.sh
```
Monitor progress:
```bash
tail -f /var/log/{tool}-backup.log
```
#### 4. Enable Automatic Backups (Optional)
```bash
sudo systemctl enable {tool}-backup.timer
sudo systemctl start {tool}-backup.timer
# Check status # Check status
sudo systemctl status {tool}-backup.timer sudo systemctl list-timers | grep rsync
sudo systemctl list-timers
``` ```
### Cloud Backup (rclone)
If you set up cloud backup, your files are encrypted locally before being uploaded.
**Run Cloud Backup:**
```bash
sudo /usr/local/bin/backup-scripts/cloud-backup.sh
```
**View Log:**
```bash
tail -f /var/log/cloud-backup.log
```
### Protecting Your rclone Configuration
Your `~/.config/rclone/rclone.conf` file contains your encryption keys and cloud credentials. **Without this file, your encrypted cloud files cannot be decrypted.**
**The script automatically:**
- Backs up rclone.conf to all local backup drives
- Reminds you to store a copy off-site
**Recommended off-site backup methods for rclone.conf:**
- **Signal** - End-to-end encrypted; send to yourself or a trusted contact
- **Box.com** - Better privacy policy than some alternatives
- **Password manager** - 1Password, Bitwarden, etc.
- **Encrypted USB drive** - Store at another physical location
**Note on Dropbox:** Works but has broader data access policies. Consider alternatives.
### Restoring Files on Another Computer
If you need to decrypt your cloud-backed files on a new machine:
1. **Install rclone:**
```bash
sudo apt install rclone
```
2. **Copy your rclone.conf to the new machine:**
```bash
mkdir -p ~/.config/rclone
# Copy your backed-up rclone.conf to ~/.config/rclone/rclone.conf
```
3. **Download and decrypt files:**
```bash
# List your encrypted remote
rclone ls cloud-crypt:
# Download and decrypt to local folder
rclone copy cloud-crypt: /path/to/restore/
```
The "cloud-crypt" remote automatically decrypts files during download using the keys stored in rclone.conf.
### Manual Drive Mounting ### Manual Drive Mounting
If you skipped auto-mounting during installation: If you skipped auto-mounting during installation:
@@ -653,21 +664,22 @@ sudo ufw status numbered
sudo ufw delete 3 sudo ufw delete 3
``` ```
## Backup Mode Comparison ## Backup Strategy Summary
### Full Backup ### Local Backup (rsync)
✓ Simpler setup - no folder configuration needed ✓ Simple setup - just specify your drives
Single backup drive to manage Delta transfers - only changed bytes copied (fast incremental backups)
Easy restore - just copy everything back Supports 1-4 backup drives with custom names
⚠️ Requires backup drive ≥ primary size ✓ Time to notice corruption before it propagates (unlike RAID)
✓ Backup drives can be disconnected for safety
✓ Easy restore - just rsync back
### Split Backup ### Cloud Backup (rclone)
Budget-friendly - use two smaller drives Files encrypted locally before upload (cloud provider can't read them)
No RAID complexity Guided setup for Google Drive and OneDrive
Flexible - rebalance folders anytime 40+ cloud providers supported
⚠️ Manual folder configuration required ✓ Config automatically backed up to local drives
⚠️ Need BOTH backup drives to fully restore ⚠️ Requires rclone.conf for decryption - keep it safe!
⚠️ Failed backup = some folders without redundancy
## Files Created by This Script ## Files Created by This Script
@@ -685,15 +697,18 @@ sudo ufw delete 3
# If Samba is installed # If Samba is installed
/etc/samba/smb.conf.backup-TIMESTAMP # Samba config backup /etc/samba/smb.conf.backup-TIMESTAMP # Samba config backup
# If backup system is set up (rsync or rclone) # If local backup is set up
/usr/local/bin/backup-scripts/{tool}-backup.sh # Backup script /usr/local/bin/backup-scripts/local-backup.sh # Local rsync backup script
/etc/systemd/system/{tool}-backup.service # Systemd service /etc/systemd/system/rsync-backup.service # Systemd service
/etc/systemd/system/{tool}-backup.timer # Systemd timer /etc/systemd/system/rsync-backup.timer # Systemd timer (daily at 2 AM)
/var/log/{tool}-backup.log # Backup log /var/log/rsync-backup.log # Backup log
/etc/fstab.backup-TIMESTAMP # fstab backup (if modified) /etc/fstab.backup-TIMESTAMP # fstab backup (if modified)
~/drives/primary/ # Primary mount point ~/drives/{your-drive-names}/ # Mount points (customizable names)
~/drives/backup1/ # Backup1 mount point
~/drives/backup2/ # Backup2 mount point (split mode only) # If cloud backup is set up
/usr/local/bin/backup-scripts/cloud-backup.sh # Cloud rclone backup script
~/.config/rclone/rclone.conf # rclone config (KEEP SAFE - has encryption keys!)
~/drives/*/rclone-config-backup/rclone.conf # Config backed up to each local drive
``` ```
## Security Notes ## Security Notes
@@ -705,6 +720,7 @@ sudo ufw delete 3
- **Samba password** (if installed): Stored separately from system password; change with `sudo smbpasswd username` - **Samba password** (if installed): Stored separately from system password; change with `sudo smbpasswd username`
- **Samba shares** (if installed): Only accessible to configured users; ensure strong passwords - **Samba shares** (if installed): Only accessible to configured users; ensure strong passwords
- **Network security** (if Samba installed): Samba shares are accessible to anyone on your local network who has credentials - **Network security** (if Samba installed): Samba shares are accessible to anyone on your local network who has credentials
- **rclone.conf** (if cloud backup enabled): Contains encryption keys - without it, cloud files cannot be decrypted. Back up securely off-site!
- **Backup drives** (if backup enabled): Consider encrypting sensitive data - **Backup drives** (if backup enabled): Consider encrypting sensitive data
## Support & Feedback ## Support & Feedback
@@ -722,6 +738,14 @@ This script is provided as-is for Ubuntu 24.04 Desktop installations.
## Changelog ## Changelog
- **v2.2**: Backup system overhaul
- Local backups now use rsync exclusively (simpler, better for local drives)
- Support for 1-4 backup drives with customizable names
- Cloud backup added as separate option using rclone with encryption
- Guided setup for Google Drive and OneDrive cloud backups
- rclone.conf automatically backed up to all local drives
- Added guidance for secure off-site config backup (Signal, Box.com, password managers)
- Documentation: why rsync instead of RAID, why fail2ban with key-only SSH is unnecessary
- **v2.1**: QoL improvements - **v2.1**: QoL improvements
- Added `--dry-run` flag to preview installations without changes - Added `--dry-run` flag to preview installations without changes
- Added `--unattended` flag for automated/scripted installs - Added `--unattended` flag for automated/scripted installs
+380 -393
View File
@@ -697,113 +697,91 @@ fi
# Backup System (Optional) # Backup System (Optional)
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "BACKUP SYSTEM (Optional)" echo "LOCAL BACKUP SYSTEM (Optional)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "" echo ""
echo "This sets up an automated backup system for local drives." echo "Set up rsync backup from primary drive(s) to backup drive(s)."
echo ""
echo "Why rsync instead of RAID?"
echo " • RAID mirrors corruption instantly - rsync gives you time to notice"
echo " • RAID requires identical drives - rsync works with any sizes"
echo " • RAID is complex to set up/recover - rsync is simple copy"
echo " • rsync can run on schedule - RAID is always-on (more wear)"
echo " • With rsync, backup drives can be disconnected for safety"
echo "" echo ""
# Check if backup is already configured # Check if backup is already configured
BACKUP_CONFIGURED=false BACKUP_CONFIGURED=false
if [ -f /usr/local/bin/backup-scripts/rclone-backup.sh ] || [ -f /usr/local/bin/backup-scripts/rsync-backup.sh ]; then if [ -f /usr/local/bin/backup-scripts/rsync-backup.sh ]; then
BACKUP_CONFIGURED=true BACKUP_CONFIGURED=true
echo "Backup system is already configured." echo "Local backup system is already configured."
if [ -f /usr/local/bin/backup-scripts/rclone-backup.sh ]; then
echo " Current: rclone backup script"
fi
if [ -f /usr/local/bin/backup-scripts/rsync-backup.sh ]; then
echo " Current: rsync backup script"
fi
echo "" echo ""
prompt_yn "Reconfigure backup system? (y/n):" "n" SETUP_BACKUP prompt_yn "Reconfigure local backup system? (y/n):" "n" SETUP_BACKUP
else else
prompt_yn "Set up backup system? (y/n):" "n" SETUP_BACKUP prompt_yn "Set up local backup system? (y/n):" "n" SETUP_BACKUP
fi fi
if [ "$SETUP_BACKUP" = "y" ] || [ "$SETUP_BACKUP" = "Y" ]; then if [ "$SETUP_BACKUP" = "y" ] || [ "$SETUP_BACKUP" = "Y" ]; then
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "BACKUP TOOL SELECTION" echo "DRIVE CONFIGURATION"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "" echo ""
echo "Choose your backup tool:" echo "Configure your drive mount points in ~/drives/"
echo "" echo "Default names: primary, backup1, backup2, etc."
echo " [1] rsync - RECOMMENDED for local drive backups" echo "You can customize these (e.g., 'media', 'documents', 'photos-backup')"
echo " • Delta transfers (only changed bytes are copied)"
echo " • Faster incremental backups"
echo " • Built into most Linux systems"
echo ""
echo " [2] rclone - Better for cloud storage backups"
echo " • Supports 40+ cloud providers (S3, GDrive, Dropbox...)"
echo " • File-level sync (copies entire changed files)"
echo " • Good for local drives, but rsync is more efficient"
echo ""
prompt_text "Select backup tool [1=rsync, 2=rclone]:" "1" BACKUP_TOOL_CHOICE
if [ "$BACKUP_TOOL_CHOICE" = "2" ]; then
BACKUP_TOOL="rclone"
else
BACKUP_TOOL="rsync"
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "BACKUP MODE SELECTION"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Choose your backup mode:"
echo ""
echo " [1] FULL BACKUP - Mirror entire primary drive to one backup drive"
echo " • Simpler setup (primary → backup1)"
echo " • Requires: backup drive >= primary drive size"
echo " • Example: 4TB primary → 4TB+ backup"
echo ""
echo " [2] SPLIT BACKUP - Divide data between two smaller backup drives"
echo " • Useful when: Primary > each backup drive"
echo " • Example: 4TB primary → 2TB backup1 + 2TB backup2"
echo " • You configure which folders go to which backup"
echo ""
prompt_text "Select backup mode [1=full, 2=split]:" "1" BACKUP_MODE_CHOICE
if [ "$BACKUP_MODE_CHOICE" = "2" ]; then
BACKUP_MODE="split"
else
BACKUP_MODE="full"
fi
echo ""
echo "Selected: $BACKUP_TOOL with $BACKUP_MODE backup mode"
echo ""
echo "Setting up backup configuration..."
echo "" echo ""
# Install the selected backup tool if needed # Install rsync if needed
if [ "$BACKUP_TOOL" = "rsync" ]; then if ! is_rsync_installed; then
if ! is_rsync_installed; then run_cmd apt install -y rsync || echo "Warning: rsync installation failed"
apt install -y rsync || echo "Warning: rsync installation failed"
fi
else
if ! is_rclone_installed; then
apt install -y rclone || echo "Warning: rclone installation failed"
fi
fi fi
# Create backup script directory # Create backup script directory
mkdir -p /usr/local/bin/backup-scripts mkdir -p /usr/local/bin/backup-scripts
# Create mount point directories based on mode # Ask for primary drive name
echo "PRIMARY DRIVE (source for backups):"
prompt_text " Mount point name [default: primary]:" "primary" PRIMARY_NAME
PRIMARY_NAME="${PRIMARY_NAME:-primary}"
# Ask for number of backup drives
echo "" echo ""
echo "Creating mount point directories in $ACTUAL_HOME/drives/..." echo "BACKUP DRIVES (destinations):"
mkdir -p "$ACTUAL_HOME/drives/primary" prompt_text " How many backup drives? [1-4, default: 1]:" "1" NUM_BACKUPS
mkdir -p "$ACTUAL_HOME/drives/backup1" NUM_BACKUPS="${NUM_BACKUPS:-1}"
if [ "$BACKUP_MODE" = "split" ]; then
mkdir -p "$ACTUAL_HOME/drives/backup2" # Validate number
fi case $NUM_BACKUPS in
1|2|3|4) ;;
*) NUM_BACKUPS=1 ;;
esac
# Collect backup drive names
declare -a BACKUP_NAMES
for i in $(seq 1 $NUM_BACKUPS); do
prompt_text " Backup drive $i name [default: backup$i]:" "backup$i" "BACKUP_NAME_$i"
eval "BACKUP_NAMES[$i]=\${BACKUP_NAME_$i:-backup$i}"
done
# Create mount point directories
echo ""
echo "Creating mount point directories..."
mkdir -p "$ACTUAL_HOME/drives/$PRIMARY_NAME"
for i in $(seq 1 $NUM_BACKUPS); do
mkdir -p "$ACTUAL_HOME/drives/${BACKUP_NAMES[$i]}"
done
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$ACTUAL_HOME/drives" chown -R "$ACTUAL_USER:$ACTUAL_USER" "$ACTUAL_HOME/drives"
echo "✓ Created mount points:"
echo " Primary: $ACTUAL_HOME/drives/$PRIMARY_NAME"
for i in $(seq 1 $NUM_BACKUPS); do
echo " Backup$i: $ACTUAL_HOME/drives/${BACKUP_NAMES[$i]}"
done
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "DRIVE SETUP - Mount your drives" echo "DRIVE MOUNTING"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "" echo ""
echo "Available block devices:" echo "Available block devices:"
@@ -811,43 +789,41 @@ if [ "$SETUP_BACKUP" = "y" ] || [ "$SETUP_BACKUP" = "Y" ]; then
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL
echo "" echo ""
read -p "Do you want to mount drives now? (y/n): " MOUNT_NOW prompt_yn "Mount drives now? (y/n):" "n" MOUNT_NOW
if [ "$MOUNT_NOW" = "y" ] || [ "$MOUNT_NOW" = "Y" ]; then if [ "$MOUNT_NOW" = "y" ] || [ "$MOUNT_NOW" = "Y" ]; then
echo "" echo ""
echo "Enter device paths (e.g., /dev/sdb1) or leave blank to skip" echo "Enter device paths (e.g., /dev/sdb1) or leave blank to skip"
echo "" echo ""
read -p "Primary drive device (e.g., /dev/sdb1): " PRIMARY_DEV read -p "Primary drive ($PRIMARY_NAME) device: " PRIMARY_DEV
read -p "Backup1 drive device (e.g., /dev/sdc1): " BACKUP1_DEV
if [ "$BACKUP_MODE" = "split" ]; then declare -a BACKUP_DEVS
read -p "Backup2 drive device (e.g., /dev/sdd1): " BACKUP2_DEV for i in $(seq 1 $NUM_BACKUPS); do
fi read -p "Backup drive ${BACKUP_NAMES[$i]} device: " "BACKUP_DEV_$i"
eval "BACKUP_DEVS[$i]=\$BACKUP_DEV_$i"
done
# Mount primary # Mount primary
if [ -n "$PRIMARY_DEV" ] && [ -b "$PRIMARY_DEV" ]; then if [ -n "$PRIMARY_DEV" ] && [ -b "$PRIMARY_DEV" ]; then
echo "Mounting $PRIMARY_DEV to $ACTUAL_HOME/drives/primary..." echo "Mounting $PRIMARY_DEV to $ACTUAL_HOME/drives/$PRIMARY_NAME..."
mount "$PRIMARY_DEV" "$ACTUAL_HOME/drives/primary" && echo "✓ Primary mounted" || echo "✗ Failed to mount primary" mount "$PRIMARY_DEV" "$ACTUAL_HOME/drives/$PRIMARY_NAME" && echo "$PRIMARY_NAME mounted" || echo "✗ Failed to mount $PRIMARY_NAME"
fi fi
# Mount backup1 # Mount backups
if [ -n "$BACKUP1_DEV" ] && [ -b "$BACKUP1_DEV" ]; then for i in $(seq 1 $NUM_BACKUPS); do
echo "Mounting $BACKUP1_DEV to $ACTUAL_HOME/drives/backup1..." if [ -n "${BACKUP_DEVS[$i]}" ] && [ -b "${BACKUP_DEVS[$i]}" ]; then
mount "$BACKUP1_DEV" "$ACTUAL_HOME/drives/backup1" && echo "✓ Backup1 mounted" || echo "✗ Failed to mount backup1" echo "Mounting ${BACKUP_DEVS[$i]} to $ACTUAL_HOME/drives/${BACKUP_NAMES[$i]}..."
fi mount "${BACKUP_DEVS[$i]}" "$ACTUAL_HOME/drives/${BACKUP_NAMES[$i]}" && echo "${BACKUP_NAMES[$i]} mounted" || echo "✗ Failed to mount ${BACKUP_NAMES[$i]}"
fi
# Mount backup2 (only in split mode) done
if [ "$BACKUP_MODE" = "split" ] && [ -n "$BACKUP2_DEV" ] && [ -b "$BACKUP2_DEV" ]; then
echo "Mounting $BACKUP2_DEV to $ACTUAL_HOME/drives/backup2..."
mount "$BACKUP2_DEV" "$ACTUAL_HOME/drives/backup2" && echo "✓ Backup2 mounted" || echo "✗ Failed to mount backup2"
fi
echo "" echo ""
echo "Current mounts:" echo "Current mounts:"
df -h | grep "$ACTUAL_HOME/drives" df -h | grep "$ACTUAL_HOME/drives" || echo " (no drives currently mounted)"
echo "" echo ""
read -p "Add these mounts to /etc/fstab for automatic mounting at boot? (y/n): " ADD_FSTAB prompt_yn "Add to /etc/fstab for auto-mount at boot? (y/n):" "n" ADD_FSTAB
if [ "$ADD_FSTAB" = "y" ] || [ "$ADD_FSTAB" = "Y" ]; then if [ "$ADD_FSTAB" = "y" ] || [ "$ADD_FSTAB" = "Y" ]; then
echo "" echo ""
@@ -857,318 +833,103 @@ if [ "$SETUP_BACKUP" = "y" ] || [ "$SETUP_BACKUP" = "Y" ]; then
if [ -n "$PRIMARY_DEV" ] && [ -b "$PRIMARY_DEV" ]; then if [ -n "$PRIMARY_DEV" ] && [ -b "$PRIMARY_DEV" ]; then
PRIMARY_UUID=$(blkid -s UUID -o value "$PRIMARY_DEV") PRIMARY_UUID=$(blkid -s UUID -o value "$PRIMARY_DEV")
if [ -n "$PRIMARY_UUID" ]; then if [ -n "$PRIMARY_UUID" ]; then
echo "UUID=$PRIMARY_UUID $ACTUAL_HOME/drives/primary auto defaults 0 2" >> /etc/fstab echo "UUID=$PRIMARY_UUID $ACTUAL_HOME/drives/$PRIMARY_NAME auto defaults,nofail 0 2" >> /etc/fstab
echo "✓ Added primary to fstab" echo "✓ Added $PRIMARY_NAME to fstab"
fi fi
fi fi
if [ -n "$BACKUP1_DEV" ] && [ -b "$BACKUP1_DEV" ]; then for i in $(seq 1 $NUM_BACKUPS); do
BACKUP1_UUID=$(blkid -s UUID -o value "$BACKUP1_DEV") if [ -n "${BACKUP_DEVS[$i]}" ] && [ -b "${BACKUP_DEVS[$i]}" ]; then
if [ -n "$BACKUP1_UUID" ]; then BACKUP_UUID=$(blkid -s UUID -o value "${BACKUP_DEVS[$i]}")
echo "UUID=$BACKUP1_UUID $ACTUAL_HOME/drives/backup1 auto defaults 0 2" >> /etc/fstab if [ -n "$BACKUP_UUID" ]; then
echo "✓ Added backup1 to fstab" echo "UUID=$BACKUP_UUID $ACTUAL_HOME/drives/${BACKUP_NAMES[$i]} auto defaults,nofail 0 2" >> /etc/fstab
echo "✓ Added ${BACKUP_NAMES[$i]} to fstab"
fi
fi fi
fi done
if [ "$BACKUP_MODE" = "split" ] && [ -n "$BACKUP2_DEV" ] && [ -b "$BACKUP2_DEV" ]; then
BACKUP2_UUID=$(blkid -s UUID -o value "$BACKUP2_DEV")
if [ -n "$BACKUP2_UUID" ]; then
echo "UUID=$BACKUP2_UUID $ACTUAL_HOME/drives/backup2 auto defaults 0 2" >> /etc/fstab
echo "✓ Added backup2 to fstab"
fi
fi
echo "✓ Backup of original fstab saved with timestamp"
fi
else
echo ""
echo "Skipping drive mounting. You can mount manually later."
echo "Mount points created at:"
echo " $ACTUAL_HOME/drives/primary"
echo " $ACTUAL_HOME/drives/backup1"
if [ "$BACKUP_MODE" = "split" ]; then
echo " $ACTUAL_HOME/drives/backup2"
fi fi
fi fi
# Create backup script based on selected tool and mode # Create rsync backup script
SCRIPT_NAME="${BACKUP_TOOL}-backup.sh" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "CREATING BACKUP SCRIPT"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if [ "$BACKUP_TOOL" = "rsync" ] && [ "$BACKUP_MODE" = "full" ]; then # Build backup destinations list
# RSYNC FULL BACKUP BACKUP_DESTS=""
cat > /usr/local/bin/backup-scripts/$SCRIPT_NAME << BACKUP_SCRIPT for i in $(seq 1 $NUM_BACKUPS); do
#!/bin/bash BACKUP_DESTS="$BACKUP_DESTS \"$ACTUAL_HOME/drives/${BACKUP_NAMES[$i]}\""
################################################################################
# rsync FULL Backup Script - Mirror entire primary to backup drive
################################################################################
# Tool: rsync (delta transfers - only changed bytes are copied)
# Mode: Full backup (entire primary → backup1)
################################################################################
PRIMARY="$ACTUAL_HOME/drives/primary"
BACKUP1="$ACTUAL_HOME/drives/backup1"
LOG="/var/log/rsync-backup.log"
echo "=== rsync FULL Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "FROM: \$PRIMARY" | tee -a "\$LOG"
echo "TO: \$BACKUP1" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
if [ ! -d "\$PRIMARY" ]; then
echo "ERROR: Primary drive not mounted at \$PRIMARY" | tee -a "\$LOG"
exit 1
fi
if [ ! -d "\$BACKUP1" ]; then
echo "ERROR: Backup drive not mounted at \$BACKUP1" | tee -a "\$LOG"
exit 1
fi
# rsync options:
# -a = archive mode (preserves permissions, timestamps, etc.)
# -v = verbose
# -h = human-readable sizes
# --delete = remove files from backup that don't exist on primary
# --progress = show progress
# --stats = show transfer statistics
rsync -avh --delete --progress --stats "\$PRIMARY/" "\$BACKUP1/" 2>&1 | tee -a "\$LOG"
if [ \$? -eq 0 ]; then
echo "" | tee -a "\$LOG"
echo "✓ Backup completed successfully: \$(date)" | tee -a "\$LOG"
else
echo "" | tee -a "\$LOG"
echo "✗ Backup failed: \$(date)" | tee -a "\$LOG"
fi
BACKUP_SCRIPT
elif [ "$BACKUP_TOOL" = "rsync" ] && [ "$BACKUP_MODE" = "split" ]; then
# RSYNC SPLIT BACKUP
cat > /usr/local/bin/backup-scripts/$SCRIPT_NAME << BACKUP_SCRIPT
#!/bin/bash
################################################################################
# rsync SPLIT Backup Script - Divide data between two backup drives
################################################################################
# Tool: rsync (delta transfers - only changed bytes are copied)
# Mode: Split backup (folders divided between backup1 and backup2)
#
# CONFIGURE: Edit BACKUP1_DIRS and BACKUP2_DIRS below
################################################################################
PRIMARY="$ACTUAL_HOME/drives/primary"
BACKUP1="$ACTUAL_HOME/drives/backup1"
BACKUP2="$ACTUAL_HOME/drives/backup2"
LOG="/var/log/rsync-backup.log"
# ⚠️ CONFIGURE: Which folders go to which backup drive
# Check folder sizes: du -sh $ACTUAL_HOME/drives/primary/*
BACKUP1_DIRS=(
"documents"
"work"
"photos"
)
BACKUP2_DIRS=(
"videos"
"music"
"downloads"
)
echo "=== rsync SPLIT Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "PRIMARY: \$PRIMARY" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
backup_to_drive() {
local dest=\$1
local drive_name=\$2
shift 2
local dirs_array=("\$@")
if [ ! -d "\$dest" ]; then
echo "⚠️ WARNING: \$drive_name (\$dest) not mounted, skipping" | tee -a "\$LOG"
return 1
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "\$LOG"
echo "DESTINATION: \$drive_name (\$dest)" | tee -a "\$LOG"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "\$LOG"
for dir in "\${dirs_array[@]}"; do
if [ ! -d "\$PRIMARY/\$dir" ]; then
echo " ⚠️ WARNING: \$PRIMARY/\$dir does not exist, skipping" | tee -a "\$LOG"
continue
fi
echo "" | tee -a "\$LOG"
echo " Syncing: \$dir → \$dest/\$dir" | tee -a "\$LOG"
rsync -avh --delete --progress "\$PRIMARY/\$dir/" "\$dest/\$dir/" 2>&1 | tee -a "\$LOG"
if [ \$? -eq 0 ]; then
echo " ✓ \$dir synced successfully" | tee -a "\$LOG"
else
echo " ✗ \$dir sync FAILED" | tee -a "\$LOG"
fi
done done
}
backup_to_drive "\$BACKUP1" "Backup Drive 1" "\${BACKUP1_DIRS[@]}" cat > /usr/local/bin/backup-scripts/rsync-backup.sh << BACKUP_SCRIPT
backup_to_drive "\$BACKUP2" "Backup Drive 2" "\${BACKUP2_DIRS[@]}" #!/bin/bash
################################################################################
# rsync Local Backup Script
# Backs up primary drive to all backup drives
################################################################################
PRIMARY="$ACTUAL_HOME/drives/$PRIMARY_NAME"
BACKUP_DRIVES=($BACKUP_DESTS)
LOG="/var/log/rsync-backup.log"
echo "=== rsync Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "Source: \$PRIMARY" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
if [ ! -d "\$PRIMARY" ] || [ -z "\$(ls -A \$PRIMARY 2>/dev/null)" ]; then
echo "ERROR: Primary drive not mounted or empty at \$PRIMARY" | tee -a "\$LOG"
exit 1
fi
for BACKUP in "\${BACKUP_DRIVES[@]}"; do
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "\$LOG"
echo "Backing up to: \$BACKUP" | tee -a "\$LOG"
if [ ! -d "\$BACKUP" ]; then
echo "⚠️ WARNING: \$BACKUP not mounted, skipping" | tee -a "\$LOG"
continue
fi
# rsync options:
# -a = archive mode (preserves permissions, timestamps, etc.)
# -v = verbose
# -h = human-readable sizes
# --delete = remove files from backup that don't exist on primary
# --progress = show progress
rsync -avh --delete --progress "\$PRIMARY/" "\$BACKUP/" 2>&1 | tee -a "\$LOG"
if [ \$? -eq 0 ]; then
echo "✓ Backup to \$BACKUP completed" | tee -a "\$LOG"
else
echo "✗ Backup to \$BACKUP FAILED" | tee -a "\$LOG"
fi
done
echo "" | tee -a "\$LOG" echo "" | tee -a "\$LOG"
echo "=== Backup Completed: \$(date) ===" | tee -a "\$LOG" echo "=== Backup Completed: \$(date) ===" | tee -a "\$LOG"
BACKUP_SCRIPT BACKUP_SCRIPT
elif [ "$BACKUP_TOOL" = "rclone" ] && [ "$BACKUP_MODE" = "full" ]; then chmod +x /usr/local/bin/backup-scripts/rsync-backup.sh
# RCLONE FULL BACKUP
cat > /usr/local/bin/backup-scripts/$SCRIPT_NAME << BACKUP_SCRIPT
#!/bin/bash
################################################################################
# rclone FULL Backup Script - Mirror entire primary to backup drive
################################################################################
# Tool: rclone (file-level sync, great for cloud storage)
# Mode: Full backup (entire primary → backup1)
################################################################################
PRIMARY="$ACTUAL_HOME/drives/primary" # Create systemd service
BACKUP1="$ACTUAL_HOME/drives/backup1" cat > /etc/systemd/system/rsync-backup.service << SERVICE
LOG="/var/log/rclone-backup.log"
echo "=== rclone FULL Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "FROM: \$PRIMARY" | tee -a "\$LOG"
echo "TO: \$BACKUP1" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
if [ ! -d "\$PRIMARY" ]; then
echo "ERROR: Primary drive not mounted at \$PRIMARY" | tee -a "\$LOG"
exit 1
fi
if [ ! -d "\$BACKUP1" ]; then
echo "ERROR: Backup drive not mounted at \$BACKUP1" | tee -a "\$LOG"
exit 1
fi
# rclone sync: one-way sync from source to destination
rclone sync "\$PRIMARY" "\$BACKUP1" \\
--checksum \\
--verbose \\
--progress \\
--stats=30s \\
--log-file="\$LOG"
if [ \$? -eq 0 ]; then
echo "" | tee -a "\$LOG"
echo "✓ Backup completed successfully: \$(date)" | tee -a "\$LOG"
else
echo "" | tee -a "\$LOG"
echo "✗ Backup failed: \$(date)" | tee -a "\$LOG"
fi
BACKUP_SCRIPT
else
# RCLONE SPLIT BACKUP (default)
cat > /usr/local/bin/backup-scripts/$SCRIPT_NAME << BACKUP_SCRIPT
#!/bin/bash
################################################################################
# rclone SPLIT Backup Script - Divide data between two backup drives
################################################################################
# Tool: rclone (file-level sync, great for cloud storage)
# Mode: Split backup (folders divided between backup1 and backup2)
#
# CONFIGURE: Edit BACKUP1_DIRS and BACKUP2_DIRS below
################################################################################
PRIMARY="$ACTUAL_HOME/drives/primary"
BACKUP1="$ACTUAL_HOME/drives/backup1"
BACKUP2="$ACTUAL_HOME/drives/backup2"
LOG="/var/log/rclone-backup.log"
# ⚠️ CONFIGURE: Which folders go to which backup drive
# Check folder sizes: du -sh $ACTUAL_HOME/drives/primary/*
BACKUP1_DIRS=(
"documents"
"work"
"photos"
)
BACKUP2_DIRS=(
"videos"
"music"
"downloads"
)
echo "=== rclone SPLIT Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "PRIMARY: \$PRIMARY" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
backup_to_drive() {
local dest=\$1
local drive_name=\$2
shift 2
local dirs_array=("\$@")
if [ ! -d "\$dest" ]; then
echo "⚠️ WARNING: \$drive_name (\$dest) not mounted, skipping" | tee -a "\$LOG"
return 1
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "\$LOG"
echo "DESTINATION: \$drive_name (\$dest)" | tee -a "\$LOG"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "\$LOG"
for dir in "\${dirs_array[@]}"; do
if [ ! -d "\$PRIMARY/\$dir" ]; then
echo " ⚠️ WARNING: \$PRIMARY/\$dir does not exist, skipping" | tee -a "\$LOG"
continue
fi
echo "" | tee -a "\$LOG"
echo " Syncing: \$dir → \$dest/\$dir" | tee -a "\$LOG"
rclone sync "\$PRIMARY/\$dir" "\$dest/\$dir" \\
--checksum \\
--verbose \\
--progress \\
--stats=30s \\
--log-file="\$LOG"
if [ \$? -eq 0 ]; then
echo " ✓ \$dir synced successfully" | tee -a "\$LOG"
else
echo " ✗ \$dir sync FAILED" | tee -a "\$LOG"
fi
done
}
backup_to_drive "\$BACKUP1" "Backup Drive 1" "\${BACKUP1_DIRS[@]}"
backup_to_drive "\$BACKUP2" "Backup Drive 2" "\${BACKUP2_DIRS[@]}"
echo "" | tee -a "\$LOG"
echo "=== Backup Completed: \$(date) ===" | tee -a "\$LOG"
BACKUP_SCRIPT
fi
chmod +x /usr/local/bin/backup-scripts/$SCRIPT_NAME
# Create systemd service for automatic backups
cat > /etc/systemd/system/${BACKUP_TOOL}-backup.service << SERVICE
[Unit] [Unit]
Description=${BACKUP_TOOL} Backup Service Description=rsync Local Backup Service
After=network.target After=network.target
[Service] [Service]
Type=oneshot Type=oneshot
ExecStart=/usr/local/bin/backup-scripts/${SCRIPT_NAME} ExecStart=/usr/local/bin/backup-scripts/rsync-backup.sh
User=root User=root
SERVICE SERVICE
# Create systemd timer for daily backups at 2 AM # Create systemd timer for daily backups at 2 AM
cat > /etc/systemd/system/${BACKUP_TOOL}-backup.timer << TIMER cat > /etc/systemd/system/rsync-backup.timer << TIMER
[Unit] [Unit]
Description=Daily ${BACKUP_TOOL} Backup Timer Description=Daily rsync Backup Timer
Requires=${BACKUP_TOOL}-backup.service Requires=rsync-backup.service
[Timer] [Timer]
OnCalendar=*-*-* 02:00:00 OnCalendar=*-*-* 02:00:00
@@ -1179,19 +940,245 @@ WantedBy=timers.target
TIMER TIMER
echo "" echo ""
echo "✓ Backup script created: /usr/local/bin/backup-scripts/$SCRIPT_NAME" echo "✓ Backup script created: /usr/local/bin/backup-scripts/rsync-backup.sh"
echo "✓ Systemd service/timer created (disabled by default)" echo "✓ Systemd service/timer created (disabled by default)"
echo "" echo ""
echo "Configuration: $BACKUP_TOOL + $BACKUP_MODE mode" echo "Quick start:"
if [ "$BACKUP_MODE" = "split" ]; then echo " Test backup: sudo /usr/local/bin/backup-scripts/rsync-backup.sh"
echo " Enable daily: sudo systemctl enable --now rsync-backup.timer"
echo " View log: tail -f /var/log/rsync-backup.log"
else
echo "Skipping local backup setup."
fi
# Cloud Backup with rclone (Optional)
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "CLOUD BACKUP (Optional)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Set up encrypted cloud backup using rclone."
echo "Supports: Google Drive, OneDrive, Dropbox, and 40+ other providers."
echo ""
echo "Your files are encrypted BEFORE upload - the cloud provider cannot read them."
echo ""
prompt_yn "Set up encrypted cloud backup? (y/n):" "n" SETUP_CLOUD_BACKUP
if [ "$SETUP_CLOUD_BACKUP" = "y" ] || [ "$SETUP_CLOUD_BACKUP" = "Y" ]; then
echo ""
# Install rclone if needed
if ! is_rclone_installed; then
echo "Installing rclone..."
run_cmd apt install -y rclone || echo "Warning: rclone installation failed"
fi
if is_rclone_installed; then
echo "" echo ""
echo "⚠️ IMPORTANT: Edit the backup script to configure which folders" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " go to which backup drive before running!" echo "CHOOSE CLOUD PROVIDER"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "" echo ""
echo " sudo nano /usr/local/bin/backup-scripts/$SCRIPT_NAME" echo " [1] Google Drive (15GB free)"
echo " [2] Microsoft OneDrive (5GB free, 1TB with Microsoft 365)"
echo " [3] Other (manual rclone config)"
echo ""
prompt_text "Select provider [1/2/3]:" "1" CLOUD_PROVIDER
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "RCLONE CONFIGURATION"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
case $CLOUD_PROVIDER in
1)
echo "Setting up Google Drive..."
echo ""
echo "Step 1: Run 'rclone config' to create a Google Drive remote"
echo "Step 2: When prompted:"
echo " - Choose 'n' for new remote"
echo " - Name it 'gdrive'"
echo " - Choose 'drive' (Google Drive)"
echo " - Leave client_id and client_secret blank"
echo " - Choose scope '1' (full access)"
echo " - Leave root_folder_id blank"
echo " - Leave service_account_file blank"
echo " - Choose 'n' for advanced config"
echo " - Choose 'y' for auto config (opens browser)"
echo " - Choose 'n' for team drive"
echo " - Confirm with 'y'"
echo ""
CLOUD_REMOTE="gdrive"
;;
2)
echo "Setting up Microsoft OneDrive..."
echo ""
echo "Step 1: Run 'rclone config' to create a OneDrive remote"
echo "Step 2: When prompted:"
echo " - Choose 'n' for new remote"
echo " - Name it 'onedrive'"
echo " - Choose 'onedrive' (Microsoft OneDrive)"
echo " - Leave client_id and client_secret blank"
echo " - Choose region (usually 'global')"
echo " - Choose 'n' for advanced config"
echo " - Choose 'y' for auto config (opens browser)"
echo " - Choose 'onedrive' for account type"
echo " - Choose your drive from the list (usually option 0)"
echo " - Confirm with 'y'"
echo ""
CLOUD_REMOTE="onedrive"
;;
*)
echo "Manual configuration selected."
echo "Run 'rclone config' to set up your cloud provider."
echo ""
prompt_text "Enter the remote name you will create:" "cloud" CLOUD_REMOTE
;;
esac
if [ "$UNATTENDED" != true ]; then
echo "Press Enter to launch rclone config..."
read
sudo -u "$ACTUAL_USER" rclone config
else
echo "Skipping interactive rclone config (unattended mode)"
echo "Run 'rclone config' manually to complete setup"
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "ENCRYPTION SETUP"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Now we'll create an encrypted wrapper around your cloud storage."
echo "This encrypts file names AND contents before upload."
echo ""
echo "⚠️ IMPORTANT: You will set a password. Without this password and"
echo " the rclone config file, your files CANNOT be recovered!"
echo ""
if [ "$UNATTENDED" != true ]; then
echo "In rclone config:"
echo " - Choose 'n' for new remote"
echo " - Name it '${CLOUD_REMOTE}-crypt'"
echo " - Choose 'crypt' (Encrypt/Decrypt)"
echo " - Remote: '${CLOUD_REMOTE}:backup' (folder on cloud storage)"
echo " - Choose 'standard' for filename encryption"
echo " - Choose 'true' for directory name encryption"
echo " - Choose 'y' to enter your own password"
echo " - Enter a STRONG password (you'll need this to decrypt!)"
echo " - Choose 'y' for salt password (or 'n' to skip)"
echo " - Confirm with 'y'"
echo ""
echo "Press Enter to continue rclone config..."
read
sudo -u "$ACTUAL_USER" rclone config
fi
# Backup the rclone config to local drives
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "BACKUP YOUR RCLONE CONFIG"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Your rclone config contains your encryption keys."
echo "WITHOUT IT, YOUR ENCRYPTED CLOUD FILES CANNOT BE DECRYPTED!"
echo ""
echo "The config file is at: $ACTUAL_HOME/.config/rclone/rclone.conf"
echo ""
# Copy config to any mounted backup drives
if [ -d "$ACTUAL_HOME/drives" ]; then
for drive_dir in "$ACTUAL_HOME/drives"/*/; do
if [ -d "$drive_dir" ] && mountpoint -q "$drive_dir" 2>/dev/null; then
mkdir -p "${drive_dir}.rclone-config-backup"
if [ -f "$ACTUAL_HOME/.config/rclone/rclone.conf" ]; then
cp "$ACTUAL_HOME/.config/rclone/rclone.conf" "${drive_dir}.rclone-config-backup/rclone.conf.backup"
echo "✓ Config backed up to: ${drive_dir}.rclone-config-backup/"
fi
fi
done
fi
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "SECURE OFF-SITE BACKUP OF CONFIG"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "For disaster recovery, store a copy of rclone.conf OFF-SITE:"
echo ""
echo "Recommended secure methods:"
echo " • Signal (end-to-end encrypted, send to yourself or trusted contact)"
echo " • Box.com (better privacy policy than Dropbox)"
echo " • Password manager (1Password, Bitwarden, etc.)"
echo " • Encrypted USB drive stored at another location"
echo ""
echo "⚠️ Dropbox: Works but has broader data access policies."
echo " Consider encrypting the config file before uploading."
echo ""
echo "To use on another computer:"
echo " 1. Install rclone"
echo " 2. Copy rclone.conf to ~/.config/rclone/"
echo " 3. Run: rclone ls ${CLOUD_REMOTE}-crypt:"
echo ""
# Create cloud backup script
mkdir -p /usr/local/bin/backup-scripts
SOURCE_PATH="${PRIMARY_NAME:-primary}"
cat > /usr/local/bin/backup-scripts/cloud-backup.sh << CLOUD_SCRIPT
#!/bin/bash
################################################################################
# rclone Encrypted Cloud Backup Script
################################################################################
SOURCE="$ACTUAL_HOME/drives/$SOURCE_PATH"
REMOTE="${CLOUD_REMOTE:-gdrive}-crypt"
LOG="/var/log/cloud-backup.log"
echo "=== Cloud Backup Started: \$(date) ===" | tee -a "\$LOG"
echo "Source: \$SOURCE" | tee -a "\$LOG"
echo "Destination: \$REMOTE:" | tee -a "\$LOG"
echo "" | tee -a "\$LOG"
if [ ! -d "\$SOURCE" ] || [ -z "\$(ls -A \$SOURCE 2>/dev/null)" ]; then
echo "ERROR: Source not mounted or empty at \$SOURCE" | tee -a "\$LOG"
exit 1
fi
# Sync to encrypted cloud storage
rclone sync "\$SOURCE" "\$REMOTE:" \\
--progress \\
--stats=30s \\
--log-file="\$LOG" \\
--log-level INFO
if [ \$? -eq 0 ]; then
echo "" | tee -a "\$LOG"
echo "✓ Cloud backup completed: \$(date)" | tee -a "\$LOG"
else
echo "" | tee -a "\$LOG"
echo "✗ Cloud backup FAILED: \$(date)" | tee -a "\$LOG"
fi
CLOUD_SCRIPT
chmod +x /usr/local/bin/backup-scripts/cloud-backup.sh
chown "$ACTUAL_USER:$ACTUAL_USER" /usr/local/bin/backup-scripts/cloud-backup.sh
echo ""
echo "✓ Cloud backup script created: /usr/local/bin/backup-scripts/cloud-backup.sh"
echo ""
echo "Quick start:"
echo " Test backup: sudo /usr/local/bin/backup-scripts/cloud-backup.sh"
echo " View log: tail -f /var/log/cloud-backup.log"
else
echo "rclone installation failed. Skipping cloud backup setup."
fi fi
else else
echo "Skipping backup system setup." echo "Skipping cloud backup setup."
fi fi
# UFW Firewall Configuration (Optional) # UFW Firewall Configuration (Optional)