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:
- Mounted den freigegebenen Ordner der Synology (mount)
- Benutzernamen und Passwort für den Zugriff auf die Synology werden dafür aus dem Apple Schlüsselbund geholt
- temporärer Ordner für Mount Point in definiertem Verzeichnis wird auf dem Client erstellt
- Dateien mit rsync von Client zu Synology übertragen
- Synology Laufwerk auswerfen (umount)
- temporärer Ordner des Mount Point gelöscht (aus Schritt 3)
- von rsync gelöschte Ordner und Dateien als Backup auf MacBook gesichert (= 2te Sicherheitsebene)
- diese gesicherten Ordner und Dateien werde auf dem MacBook nach einer definierten Zeit automatisch gelöscht (Standard 7 Tage)
- 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.
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 LogdateiREMOTE_USER
= Synology-BenutzerREMOTE_SERVER
= IP-Adresse der SynologyREMOTE_MOUNTS
= Name des geteilten Synology OrdnersLOCAL_DESTINATION
= Mount Point für das Synology LaufwerkSOURCE1
= Quelldateien auf dem Mac, die auf Synology kopiert werden sollenTARGET1
= Zielordner auf SynologyBACKUPDIRECTORY
= 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.
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.
Ordner-Freigeben und Zugriffsrechte einrichten
Die Ordnerfreigabe wird im Kontrollzentrum konfiguriert.
oder die Einrichtung über das Menü "USer & Group" vornehmen.
rsync mit einem YubiKey
Der ganze Prozess lässt sich mit einem Hardwaretoken, wie dem YubiKey um einiges vereinfachen.
- 👉 Backup zu Synology mit rsync, SSH und einem YubiKey
- 👉 rsync mit einem YubiKey auf Synology mit einem YubiKey vereinfachen und absichern
Gib mir gerne einen Kaffee ☕ aus ❗️
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.
Follow Me❗️
Source
- Als Inspiration hat mir das gist von 👉 faun geholfen.
- Photo by Alex Cheung on Unsplash