Zum Inhalt

Datensicherung von einem Mac auf eine Synology NAS mit rsync (ohne Synology Drive)

Die Datensicherung von einem Mac auf ein Synology NAS kann mit rsync und einem kleinen Shell Script realisiert werden. Der Synology Drive Client ist dafür nicht zwingend erforderlich.

Das hier vorgestellte Skript durchläuft die folgenden Schritte:

  1. Mounted den freigegebenen Ordner der Synology (mount)
  2. Benutzernamen und Passwort für den Zugriff auf die Synology werden dafür aus dem Apple Schlüsselbund geholt
  3. temporärer Ordner für Mount Point in definiertem Verzeichnis wird auf dem Client erstellt
  4. Dateien mit rsync von Client zu Synology übertragen
  5. Synology Laufwerk auswerfen (umount)
  6. temporärer Ordner des Mount Point gelöscht (aus Schritt 3)
  7. von rsync gelöschte Ordner und Dateien als Backup auf MacBook gesichert (= 2te Sicherheitsebene)
  8. diese gesicherten Ordner und Dateien werde auf dem MacBook nach einer definierten Zeit automatisch gelöscht (Standard 7 Tage)
  9. rsync Protokolldatei auf dem MacBook erstellen

Einziges Problem, rsync ist in einer alten Version bei Apples Betriebssystem mit an Bord.
Abhilfe schafft hier aber die Installation der aktuellsten Version mittels Homebrew:

Ein toller Nebeneffekt, der große Synology Drive Client wird nicht benötigt, sondern lediglich das kleine Shell Skript. So spart man sich auch wieder ein paar MB auf der Festplatte des Macs.

Passwörter im Apple Schlüsselbund hinterlegen

Am einfachsten ist das Abspeichern der Zugriffsdaten (Benutzernamen und Passwort) im Menü Passwörter auf dem Mac.

Erkennt das Skript die hinterlegten Informationen, dann erfolgt keine Abfrage beim Benutzer und die Datensicherung startet. Das ist z.B. notwendig, wenn das Skript im Hintergrund automatisch gestartet werden soll und der Benutzer nicht durch die Eingabe eines Passworts gestört werden soll.

Apple Schlüsselbund

Apple Schlüsselbund

Backup-Skript

Das Skript ist irgendwo auf dem Mac abzuspeichern und die Variablen anzupassen.

cd 

nano synology-backup.sh

Der Inhalt des Skripts ist:

#!/usr/bin/env bash

# The script is designed to be used with Apple`s Mac OS X

# Mount shared Synology folder on Mac OS X (= local client) on temp folder on Desktop
# Use login credentials stored in Apple`s own password manager
# Copy folders and files via RSYNC

# Inspired by FAUN`s script :-)
# https://gist.github.com/faun/1c0ffb639b4ba419d07f

# LOGFILE location
LOGFILE="${HOME}/rsync/air-to-synology-documents-"$(date +%Y-%m-%d_%H-%M-%S)".log"

touch ${LOGFILE}
exec 1> ${LOGFILE} 

# Script name
SCRIPTNAME=$(basename -- "$0")
echo "SCRIPTNAME = ${SCRIPTNAME}" >&1

# Working Directory = Location of Shell Script
SCRIPTLOCATION=`pwd`
echo "SCRIPTLOCATION = ${SCRIPTLOCATION}" >&1


# Fetch the password from Apple`s keychain if it exists
PASSWORD_ENTERED=false
ACCOUNT_NAME='login'
SERVICE_NAME='mount_volume'
PASSWORD=$(
security 2> /dev/null \
  find-generic-password -w \
  -a $ACCOUNT_NAME \
  -s $SERVICE_NAME
)

# Stop the script from continuing if there's an error
#set -e

# Remote file user
# User with permission to access Synology drive folder
REMOTE_USER='benutzersynology'

# Remote file server
# IP Address, URL, etc. = Synology identifier
REMOTE_SERVER='192.168.179.123'

# Volumes to mount
# Name of shared Synology folder that should be mounted on your Mac
declare -a REMOTE_MOUNTS=(homes)

# Where to mount volumes
# Location on your local Mac where the Synology folder should be mounted = Mount Point
LOCAL_DESTINATION="${HOME}/Desktop/"



# Check Synology Availability
# If Synology is not pingable, script will stop
echo "$(date +%Y-%m-%d_%H-%M-%S) - Check Synology Availability - Send PING" >&1
echo "Synology Address = ${REMOTE_SERVER}" >&1

ping -c1 ${REMOTE_SERVER} >&1
if [ $? -eq 0 ]
  then 
    echo "$(date +%Y-%m-%d_%H-%M-%S) - Synology available - continue" >&1
  else
    echo "$(date +%Y-%m-%d_%H-%M-%S) - Synology NOT available - STOPP Script" >&1
    echo "$(date +%Y-%m-%d_%H-%M-%S) - BACKUP Failed" >&1
    exit 1
fi


# Prompt for password if not in keychain
if [ -z $PASSWORD ]; then
  echo "Enter the password for user ${REMOTE_USER} on ${REMOTE_SERVER}:"
  read -s PASSWORD
  PASSWORD_ENTERED=true
fi

# URL escape the password (allow for special characters in the password)
ENCODED_PASSWORD="$(
perl -MURI::Escape -e \
  'print uri_escape($ARGV[0]);' \
  "$PASSWORD"
)"


# Mount each volume from $REMOTE_MOUNTS to $LOCAL_DESTINATION
for MOUNT in ${REMOTE_MOUNTS[*]}
do
  mkdir -p "$LOCAL_DESTINATION/$MOUNT"
  mount_smbfs -o \
    automounted \
    -N "//${REMOTE_USER}:$ENCODED_PASSWORD@${REMOTE_SERVER}/${MOUNT}/" \
    "$LOCAL_DESTINATION/$MOUNT"
done



# Save the password to the keychain if provided
if [ $PASSWORD_ENTERED != false ]
then
  security add-generic-password \
  -a $ACCOUNT_NAME \
    -l "Volume mount password for user ${REMOTE_USER} on ${REMOTE_SERVER}" \
    -s $SERVICE_NAME \
    -w $PASSWORD
fi



#####################
# RSYNC Section
#####################

###
# 1st Backup Folder Definition
###
# Source
# What folder should be synced to Synology
SOURCE1="${HOME}/Documents"

# Target Directory On Synology
TARGET1="${LOCAL_DESTINATION}/homes/benutzersynology/test"

# Exclude from RSYNC file
# Path to your exclude file 
# normale the same as the script location
#EXCLUDEFILE="${SCRIPTLOCATION}/rsync-macos-excludefile"

# BACKUP Directory
# Into this directory all files are copied which are deleted during the rsync run by the option --delete.
# This option creates a high system load and a very long runtime of the script.
BACKUPDIRECTORY="${HOME}/rsync/"

echo "$(date +%Y-%m-%d_%H-%M-%S) - Start 1st RSYNC Process" >&1

# Comment to display variable in LOGFILE
echo "SOURCE1 = ${SOURCE1}" >&1
echo "TARGET1 = ${TARGET1}" >&1
#echo "EXCLUDEFILE = ${EXCLUDEFILE}" >&1
echo "BACKUPDIRECTORY = ${BACKUPDIRECTORY}" >&1

rsync -avhbP --iconv=UTF8,UTF8-MAC --stats --delete --log-file=${LOGFILE} --backup-dir=${BACKUPDIRECTORY} ${SOURCE1} ${TARGET1}

# Unmount the Synology drive
diskutil unmount ${LOCAL_DESTINATION}${MOUNT} >&1

# Deletes The Mount Point Folder
rm -r ${LOCAL_DESTINATION}${MOUNT} >&1

# Delete files in ${BACKUPDIRECTORY} on local client older than
find ${BACKUPDIRECTORY}* -mtime +7 -exec rm -r {} \; >&1

# Delete empty folders on local client older than
find ${BACKUPDIRECTORY}* -empty -type d -delete >&1


exit 0

Die folgenden Variablen sind anzupassen:

  • LOGFILE = Ordner für die Logdatei
  • REMOTE_USER = Synology-Benutzer
  • REMOTE_SERVER = IP-Adresse der Synology
  • REMOTE_MOUNTS = Name des geteilten Synology Ordners
  • LOCAL_DESTINATION = Mount Point für das Synology Laufwerk
  • SOURCE1 = Quelldateien auf dem Mac, die auf Synology kopiert werden sollen
  • TARGET1 = Zielordner auf Synology
  • BACKUPDIRECTORY = Order auf dem Mac

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Skript ausführen

Nachdem die Variablen angepasst sind, das Skript einfach irgendwo auf dem Mac ablegen. Gestartet wird es mit dem einfachen Befehl:

sh ./synology-backup.sh

Mehrere rsync-Läufe in diesem Skript

In dem Skript lassen sich ohne weiteres mehrere rsync-Läufe definieren. Dazu ist der Abschnitt RSYNC Section zu kopieren und die Variablen mit einer 2, einer 3, einer 4, etc. zu versehen und anzupassen.

Voraussetzung, es wird alles im Synology Ordner REMOTE_MOUNTS gesichert.

Beispiel:

###
# 2nd Backup Folder Definition
###
# Source
# What folder should be synced to Synology
SOURCE2="${HOME}/Pictures"

# Target Directory On Synology
TARGET2="${LOCAL_DESTINATION}/homes/benutzersynology/Pictures"

# Exclude from RSYNC file
# Path to your exclude file 
# normale the same as the script location
#EXCLUDEFILE="${SCRIPTLOCATION}/rsync-macos-excludefilet"

# BACKUP Directory
# Into this directory all files are copied which are deleted during the rsync run by the option --delete.
# This option creates a high system load and a very long runtime of the script.
BACKUPDIRECTORY="${HOME}/rsync/"

echo "$(date +%Y-%m-%d_%H-%M-%S) - Start 2nd RSYNC Process" >&1

# Comment to display variable in LOGFILE
echo "SOURCE1 = ${SOURCE2}" >&1
echo "TARGET1 = ${TARGET2}" >&1
#echo "EXCLUDEFILE = ${EXCLUDEFILE}" >&1
echo "BACKUPDIRECTORY = ${BACKUPDIRECTORY}" >&1

rsync -avhbP --iconv=UTF8,UTF8-MAC --stats --delete --log-file=${LOGFILE} --backup-dir=${BACKUPDIRECTORY} ${SOURCE2} ${TARGET2}

Skript mit Mausklick starten

Mit Apple´s Automator kann ein Programm für das Skript erstellt werden und mit einem Mausklick gestartet werden.

Weitere rsync Optionen

Der rsync-Befehl lässt sich auch noch nachjustieren. Dafür stehen eine Vielzahl von Optionen.

Eine vollständige Liste findet sich in den manpages.

man rsync

Synology Einstellungen

Auf der Synology ist der Ordner per SMB freizugeben und einem Benutzer (= REMOTE_USER) darauf Schreib- und Leserechte zu gewähren.

SMB-Dienst aktivieren

Ordner-Freigeben und Zugriffsrechte einrichten

Die Ordnerfreigabe wird im Kontrollzentrum konfiguriert.

Ordner-Freigabe einrichten

oder die Einrichtung über das Menü "USer & Group" vornehmen.

Zugriffsrechte einrichten

rsync mit einem YubiKey

Der ganze Prozess lässt sich mit einem Hardwaretoken, wie dem YubiKey um einiges vereinfachen.

Gib mir gerne einen Kaffee ☕ aus ❗️

Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Source
  • Als Inspiration hat mir das gist von 👉 faun geholfen.
  • Photo by Alex Cheung on Unsplash