blue-ox.nl From coffee-fueled fruity tech to fast runs—think different, let’s run them.

Back-Up of Synology NAS Shared Folders to external Raspberry Pi with attached USB HDD

B

#!/bin/bash

# Backup Configuratie
BACKUP_KEY="/var/services/homes/Erik/.ssh/id_ed25519"
REMOTE_USER="erik"
REMOTE_HOST="backup.janssengelen.nl"
REMOTE_ROOT="/mnt/backup/synology_backup"
LOG_FILE="/volume1/scripts/backup.log"
LOG_MAX_SIZE=10485760  # Max log size in bytes (10MB)
LOG_BACKUP_COUNT=7     # Number of backup logs to keep

# Bronmappen voor backup
SOURCES=(
    "/volume1/homes"
    "/volume1/NetBackup"
    "/volume1/photoBackup"
    "/volume1/scans"
    "/volume1/RPi-archive"
)

# Logging functie met timestamp
log_message() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "$timestamp - $1" | tee -a "$LOG_FILE"
}

# Logrotatie functie
rotate_logs() {
    if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -ge $LOG_MAX_SIZE ]; then
        for ((i=LOG_BACKUP_COUNT-1; i>=1; i--)); do
            if [ -f "$LOG_FILE.$i" ]; then
                mv "$LOG_FILE.$i" "$LOG_FILE.$((i+1))"
            fi
        done
        mv "$LOG_FILE" "$LOG_FILE.1"
        touch "$LOG_FILE"
    fi
}

# Backup functie met error handling
perform_backup() {
    local TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
    local BACKUP_PATH="${REMOTE_ROOT}/backups/${TIMESTAMP}"
    
    # Maak backup directory
    if ! ssh -i "$BACKUP_KEY" ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p $BACKUP_PATH"; then
        log_message "NOK - Kon backup directory niet aanmaken"
        return 1
    fi
    
    local overall_status=0
    
    for SOURCE in "${SOURCES[@]}"; do
        local SHARE_NAME=$(basename "$SOURCE")
        log_message "BEG begin backup $SHARE_NAME"
        
        # Check voor vorige backup (hardlinks)
        if ssh -i "$BACKUP_KEY" ${REMOTE_USER}@${REMOTE_HOST} "test -d ${REMOTE_ROOT}/latest/${SHARE_NAME}"; then
            HARDLINK_ARG="--link-dest=${REMOTE_ROOT}/latest/${SHARE_NAME}"
        else
            HARDLINK_ARG=""
        fi
        
        # Voer rsync uit
        rsync -av --progress \
            -e "ssh -i $BACKUP_KEY" \
            $HARDLINK_ARG \
            --exclude='@eaDir' \
            --exclude='#recycle' \
            --exclude='.DS_Store' \
            "$SOURCE/" \
            "${REMOTE_USER}@${REMOTE_HOST}:${BACKUP_PATH}/${SHARE_NAME}/"
        
        if [ $? -eq 0 ]; then
            log_message " OK succes backup $SHARE_NAME"
        else
            log_message "NOK failed backup $SHARE_NAME"
            overall_status=1
        fi
    done
    
    # Update latest symlink bij succes
    if [ $overall_status -eq 0 ]; then
        ssh -i "$BACKUP_KEY" ${REMOTE_USER}@${REMOTE_HOST} \
            "rm -f ${REMOTE_ROOT}/latest && ln -s ${BACKUP_PATH} ${REMOTE_ROOT}/latest"
        
        # Cleanup oude backups (30 dagen)
        ssh -i "$BACKUP_KEY" ${REMOTE_USER}@${REMOTE_HOST} \
            "find ${REMOTE_ROOT}/backups -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;"
        
        log_message "**********[ FINISH - backup proces SUCCESFULL ]**********"
    else
        log_message "**********[ FINISH - backup proces FAILED ]**********"
    fi
    
    return $overall_status
}

# Zorg dat log directory bestaat
mkdir -p "$(dirname "$LOG_FILE")"

# Start backup proces
rotate_logs
log_message "**********[ START - backup proces BEGIN ]**********"
perform_backup
exit $?Code language: PHP (php)

About the author

Add comment

By Erik
blue-ox.nl From coffee-fueled fruity tech to fast runs—think different, let’s run them.

Pages

Tags