← Tilbage til Home Assistant & Netværk Oversigt
Systemadministration & Disaster Recovery

Raspberry Pi: Fuld Automatisk Cloud Backup til Google Drive

Af: Kasper Gyldenlev Damholdt | Struer

Hot Image-Backup, Rclone Synkronisering, Automatisk Oprydning (3 Dages Retention) & Faldgruber
⚡ TL;DR / Kort Konklusion:

Løsningen opretter et komplet, levende OS-image (`.img`) af Raspberry Pi'en på et ext4-formateret eksternt USB-mellemlager og uploader det hver nat til Google Drive via **Rclone**. Scriptet roterer filerne automatisk, så der altid bevares præcis **3 friske backups** i skyen uden at fylde drevet op.

Projektoverblik & Arkitektur

Når man kører kritiske tjenester som Docker, Nginx eller Home Assistant på en Raspberry Pi, er det afgørende med en komplet katastrofe-gendannelsesplan (Disaster Recovery)[cite: 1, 6].

Ved hjælp af værktøjet image-backup skabes en komprimeret kopi af hele systemets partitionstabel og filsystem, mens Pi'en er i drift. Derefter synkroniserer rclone filen direkte op i Google Drive.

Hardware & Software Krav

  • Eksternt mellemlager: USB-stik eller ekstern SSD (min. 32-120 GB) formateret med ext4.
  • Google Konto: Gratis eller betalt Google Drive med min. 30-45 GB ledig plads.
  • Værktøjer: image-backup, rclone, cron.

Trin-for-Trin Opsætningsguide

Trin 1: Klargør USB-drev & Mount i `/etc/fstab`

Find USB-drevet med lsblk og formater det til ext4 for at undgå filstørrelsesgrænser:

# Formater USB-partitionen (ERSTAT sdb1 MED DIT DREV)
sudo mkfs.ext4 -F /dev/sdb1

# Opret mount-punkt og monter
sudo mkdir -p /mnt/backup
sudo mount /dev/sdb1 /mnt/backup

# Find PARTUUID for automatisk mount ved genstart
sudo blkid /dev/sdb1

Tilføj derefter drevet til `/etc/fstab`:

# Åbn fstab
sudo nano /etc/fstab

# Indsæt følgende linje i bunden (erstat med dit PARTUUID):
PARTUUID=DIT-PARTUUID-HER  /mnt/backup  ext4  defaults,noatime  0  2

Trin 2: Installer image-backup scriptet

cd ~
wget https://raw.githubusercontent.com/seamusdemora/RonR-RPi-image-utils/master/image-backup
chmod +x image-backup
sudo mv image-backup /usr/local/bin/

Trin 3: Installer og konfigurer Rclone mod Google Drive

# 1. Installer Rclone
sudo apt update && sudo apt install rclone -y

# 2. Start konfiguration
rclone config

*I guiden vælges `n` (New remote), navn: `googledrive`, vælg Google Drive i listen, og vælg Full Access (`1`). Ved headless SSH godkendelse køres `.\rclone authorize "drive"` på en Windows PC for at få et token.*

Trin 4: Opret den første baseline `.img`-fil (Vigtigt!)

For at initialisere filen skal image-backup køres interaktivt uden sti-argumenter første gang:

sudo image-backup

# Besvar promptne i terminalen:
# 1. Image file to create? -> /mnt/backup/pi_backup.img
# 2. Initial image file ROOT filesystem size (MB)? -> Tryk Enter (Standard)
# 3. Added space for incremental updates (MB)? -> 1000
# 4. Create /mnt/backup/pi_backup.img (y/n)? -> y

Trin 5: Kopier Rclone konfiguration til Root

Da automatisk backup kører under root via cron, skal konfigurationsfilen kopieres:

sudo mkdir -p /root/.config/rclone
sudo cp /home/xdia/.config/rclone/rclone.conf /root/.config/rclone/
sudo chmod 600 /root/.config/rclone/rclone.conf

Trin 6: Opret det samlede Backup & Retention Script

Opret scriptet /usr/local/bin/nightly_drive_backup.sh:

sudo nano /usr/local/bin/nightly_drive_backup.sh

Indsæt koden:

#!/bin/bash

# Variable
LOCAL_DIR="/mnt/backup"
LOCAL_FILE="pi_backup.img"
REMOTE_DIR="googledrive:RaspberryPi_Backups"
DATE=$(date +%Y-%m-%d)
DEST_FILE="pi_backup_${DATE}.img"

# 1. Opdater det lokale image inkrementelt via image-backup
/usr/local/bin/image-backup "${LOCAL_DIR}/${LOCAL_FILE}" >/dev/null 2>&1

# 2. Upload og omdøb filen til Google Drive
/usr/bin/rclone copy "${LOCAL_DIR}/${LOCAL_FILE}" "${REMOTE_DIR}" --no-traverse

# 3. Giv filen dags dato i navnet på Google Drive
/usr/bin/rclone moveto "${REMOTE_DIR}/${LOCAL_FILE}" "${REMOTE_DIR}/${DEST_FILE}" >/dev/null 2>&1

# 4. Retention Policy: Slet backups på Google Drive der er ældre end 3 døgn
/usr/bin/rclone delete "${REMOTE_DIR}" --min-age 3d --include "pi_backup_*.img"

Gør scriptet eksekverbart:

sudo chmod +x /usr/local/bin/nightly_drive_backup.sh

Trin 7: Automatisering via Cron (Kl. 03:00)

sudo crontab -e

# Tilføj følgende linje i bunden:
0 3 * * * /usr/local/bin/nightly_drive_backup.sh >/dev/null 2>&1

Kritiske Faldgruber & Fejlhandling

⚠️ FAT32 Filstørrelsesgrænse

Hvis USB-stikket er formateret som FAT32, vil oprettelsen fejle med File too large når imaget krydser 4 GB. **Løsning:** Formater altid mellemlageret med ext4.

⚠️ Manglende rclone.conf hos Root

Når scriptet kører fra cron som root, fejler Rclone med didn't find section in config file. **Løsning:** Kopier altid rclone.conf til /root/.config/rclone/.

⚠️ Direkte Kørsel uden Baseline

At kalde image-backup /mnt/backup/pi_backup.img direkte før filen findes, resulterer i directory not found. **Løsning:** Kør ren sudo image-backup første gang.

Ofte Stillede Spørgsmål (FAQ)

Hvordan gendannes en backup ved SD-kort eller diskfejl?

Hent `.img`-filen ned fra Google Drive til din PC. Åbn **Raspberry Pi Imager** eller **BalenaEtcher**, vælg 'Use Custom Image', vælg `.img`-filen og flash direkte til et nyt SD-kort eller en ny SSD.

Hvorfor tager det lokale image kun få minutter at opdatere hver nat?

Når baseline-imaget først er oprettet, kører `image-backup` inkrementelt. Den opdaterer kun de ændrede blocks inde i `.img`-filen, hvilket sparer unødig slid på drevet.

Anvendt Teknologi Stack

Raspberry Pi OS Rclone CLI Google Drive API ext4 Filesystem Cron Automations Bash Scripting Disaster Recovery