#!/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)
Back-Up of Synology NAS Shared Folders to external Raspberry Pi with attached USB HDD
B