Nextcloud – Datensicherung von Kalendern und Adressbüchern automatisch erstellen

Nextcloud bietet eine sehr gute Kalenderfunktion an, die umfangreiche Möglichkeiten für die Benutzer bietet.
Es kann eine beliebige Anzahl von Kalendern anleget und mit anderen Nextcloud-Benutzern geteilt werden.
Die Synchronisation der Kalender ist auf jedes Endgerät, Windows, Linux, Android, MacOS, iOS, etc. dank der Nutzung von CalDAV und CardDAV problemlos möglich.

In diesem Beitrag geht es darum, die Adressbücher und die Kalender der Benutzer mit Hilfe eines Cron Jobs zu sicheren.
Die Adressbücher werden dabei im vcf- und die Kalender im ics-Format exportiert.

Mit dieser Möglichkeit der Datensicherung habt ihr die Kalender sofort verfügbar und könnt sich im Fall der Fälle auch gleich in ein anderes Adress- und Kalendertool importieren oder so auch in eine andere Nextcloud-Instanz übertragen.

Das in diesem Beitrag verwendete Tool „calcardbackup“ von „BernieO“ exportiert die Adressbücher und Kalender auf ein Speichermedium, z.B. SD-Karte, externe Festplatte, USB-Stick, etc. an eurer Nextcloud.

Ich habe das Ganze ein wenig erweitert, damit der Export in einen tar.gz-Archiv per E-Mail an eine von euch definierte E-Mail-Adresse gesendet wird.

In diesem Beitrag wird ein funktionierender E-Mail-Versand vorausgesetzt. Habt ihr das noch nicht eingerichtet auf eurem Raspberry Pi, schaut euch meinen Beitrag
E-Mail-Versand für den Raspberry Pi konfigurieren an.
Dort beschreibe ich die Installation und Konfiguration von Postfix ausführlich.

Da seit dem einige Zeit vergangen ist und ich meine Sicherungsstrategie ein wenig angepasst habe, hier ein Update.


Inhaltsverzeichnis

Nextcloud – Kalender-App installieren
Kalenderbackup konfigurieren
Mounten des angeschlossenen USB-Sticks
E-Mail-Versand konfigurieren
Testen
Backups in regelmäßigen Abständen automatisch löschen
Meine verwendete Hardware für das Backup

Nextcloud – Kalender-App installieren

Bevor es an die Konfiguration des Backups geht, muss die App „<Calendar“ in Nextcloud installiert werden.

Die Erweiterung ist eine offiziell unterstützte App und läuft ohne Probleme.
Calendar

Eine weitere hilfreiche App ist „<Notifications for calendar event updates„. Es handelt sich um keine offizielle Erweiterung, jedoch hat die bei mir seit der ersten Nextcloud-Installation noch nie Probleme gemacht.
Notifications for calendar event updates

Für die Verwaltung von Adressbücher in Nextcloud wird die offizielle App „Contacts“ verwendet.
Contacts


Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Kalenderbackup konfigurieren

calcardbackup

Auf GitHub findet sich noch immer das „calcardbackup„-Projekt von BernieO.
https://github.com/BernieO/calcardbackup#quick-installation-guide

DasProjekt ist zu Codeberg e.V. umgezogen.
https://codeberg.org/BernieO/calcardbackup

Mein Skript lässt sich ebenfalls von Codeberg herunterladen:
https://codeberg.org/strobelstefan.org/kalenderbackup

Ihr benötigt eigentlich nur die Datei „calcardbackup„. Die anderen Dateien sind nicht wirklich erforderlich und werden für den Sicherungsprozess nicht benötigt.

Ich habe die Datei in das Verzeichnis „/etc/scripts/calcardbackup“ gelegt, wo ich all meine Bash-Skripte ablege.

Die Rechte habe ich anders als in der Anleitung vergeben. Damit wird das Skript mit ROOT-Rechten ausgeführt und erstellt von jedem Benutzer eine Sicherung des Kalender und der Adressbücher. Möchtet ihr das nicht, müssen die Rechte wie in der Anleitung vergeben werden.

sudo chown root:root calcardbackup
sudo chmod 0600 calcardbackup
sudo chmod +x calcardbackup

Änderungen an der Datei „calcardbackup“ habe ich nicht durchgeführt.

calendarbackup.sh

Das Skript „calendarbackup.sh“ habe ich erstellt, um mehr Einstellungsmöglichkeiten über das Backup-Verzeichnis, den Versand von Statusmeldungen und der Backups zu erhalten.

Im Gegensatz zum bisherigen Skript ➡ Nextcloud – Kalender und Adressbücher sichern mit calcardbackup habe ich folgendes geändert.

  1. Die Sicherungen werden nicht mehr über das Netzwerk auf das FRITZ!Box NAS kopiert, sondern auf einen angeschlossenen USB-Stick
  2. Die Prüfung, ob der Mount Point (= FRITZ!Box) eingehängt ist, ist nicht mehr erforderlich.

Durch die Maßnahmen wird das Skript allgemein übersichtlicher und läuft der Datensicherungsprozess läuft stabiler, da das Mounten eines Netzwerklaufwerks entfällt.


#!/bin/bash

# by strobelstefan.de
# 2020-11-27
# Version: 2.0
# Nextcloud - Datensicherung von Kalendern und Adressbücher automatisch erstellen
# # https://strobelstefan.de/2020/12/01/nextcloud-datensicherung-von-kalendern-und-adressbuechern-automatisch-erstellen/

#
# This script uses the project calcardbackup (https://codeberg.org/BernieO/calcardbackup) to export calendar and address books
# from Nextcloud and sends it via e-mail to a defined e-mail address

###################################
# Define Variables
###################################

# Storage device as defined in you /etc/fstab.
# Thumb drive attached to the Raspberry Pi
mountpoint='/mnt/usbbackup'

# Location of your Nextcloud
NEXTCLOUD='/var/www/html/nextcloud'

# Location of your log file
LOGFILE="/var/log/calendarbackup.log"

# Location backup path
# Location where the backup copies of calendars and address books are loacted
IMAGE='/mnt/usbbackup/nextcloud/calendar/'

# Location of the calcardbackup script
CALCARDBACKUP='/etc/scripts/calcardbackup/calcardbackup'

# E-mail address where the export should be sent to
EMAILBACKUP="e-mail@mail.de"

# E-mail where the log file should be sent to
EMAIL="e-mail@mail.de"

# Location of the backup script
BACKUPSCRIPT="/etc/scripts/calendarbackup.sh"


###################################
# This removes your old log file
###################################

#rm -f ${LOGFILE}
#echo $(date +%Y-%m-%d_%H-%M-%S) " - Deleted Old Log File ${LOGFILE}" >> ${LOGFILE}


###################################
# Calls the calcardbackup script
# For more information please refer to
# https://codeberg.org/BernieO/calcardbackup
###################################

sudo -u www-data ${CALCARDBACKUP} "${NEXTCLOUD}" -o ${IMAGE} -i -r 90
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully Exported Calendar And Address Books To Local Storage" #>> ${LOGFILE}


###################################
# Send Export via E-Mail
###################################
# Will look for the newest file in the defined path ${IMAGE}
# and send the file as an attachement via e-mail to the defined address ${EMAILBACKUP}

newest=$(ls -rt ${IMAGE}*.tar.gz | tail -n1)
echo $(date +%Y-%m-%d_%H-%M-%S) " - Please find attached the actual export of calendars and address books of your Nextcloud instance." | mutt ${EMAILBACKUP} -a $newest -s "NEXTCLOUD Pi - Calender & Address Book successfully exported"
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully sent export via E-Mail to ${EMAILBACKUP}"  #>> ${LOGFILE}


###################################
# Send Backup Script
###################################
# This sends the log file to ${EMAIL}

echo $(date +%Y-%m-%d_%H-%M-%S) " - Calendar & Address book backup script sent to ${EMAIL}" | mutt ${EMAIL} -a ${BACKUPSCRIPT} -s "NEXTCLOUD Pi - Calendar & Address book backup script" #>> ${LOGFILE}
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully sent Backup Image Script to ${EMAIL}"  #>> ${LOGFILE}


###################################
# Send Log File
###################################
# This sends the log file to ${EMAIL}

#echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully sent Export of Addressbook and Calendars to ${EMAILBACKUP}"  >> ${LOGFILE}
#echo $(date +%Y-%m-%d_%H-%M-%S) " - Kalender & Adressbuch gesichert" | mail -s "NEXTCLOUD Pi - Calender & Address Book successfully exported" ${EMAIL} < ${LOGFILE}

Mounten des angeschlossenen USB-Sticks

Im Skript „calendarbackup.sh“ wird vorausgesetzt, dass der USB-Stick in das Verzeichnis „/mnt/usbbackup“ beim Starten des Raspberry Pis automatisch eingebunden wird. Damit das auch funktioniert, sind zwei Punkte zwingend erforderlich:

  1. Verzeichnis anlegen
  2. /etc/fstab-Eintrag erstellen“

Verzeichnis anlegen

Das Verzeichnis wird einfach mit dem Befehl angelegt.

sudo mkdir /mnt/usbbackup

/etc/fstab-Eintrag erstellen

Damit der USB-Stick auch jedes mal korrekt eingebunden wird, ist die UUID des Datenträgers erforderlich. Das ist eine eindeutige Nummer, mit die jede Partition und jeder angeschlossene Datenträger in einem Linux-System erhält.

Schließt den USB-Stick am Raspberry Pi an und gebt den Befehl ein:

sudo blkid

In der Liste tauchen nun alle Partitionen auf. Sucht nach dem USB-Stick und kopiert euch die UUID. In der Auflistung seht ihr auch die jeweilige Formatierung, z.B. vfat, ext4, ntfs, etc.

Verwendet euer USB-Stick die NTFS-Formatierung müsst ihr noch das folgende Paket installieren, damit der Raspberry Pi schreibend auf den Datenträger zugreifen kann.

sudo apt install ntfs-3g

Die „/etc/fstab“ editiert ihr am einfachsten mit dem Editor nano.

sudo nano /etc/fstab

In der Datei geht ihr bis ans Ende und tragt dort folgendes ein (ACHTUNG! Verwendet die UUID eures USB-Sticks):

# Storage for Calendar & Address book backups
# Script located in /etc/scripts
UUID=123456789 /mnt/usbbackup ntfs defaults,auto,umask=000,users,rw 0 0

Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Cron Job anlegen

Damit die Datensicherung automatisch abläuft ist ein Eintrag in der crontab zu erstellen.

sudo crontab -e

Scrollt an das Ende der Datei und tragt dort ein:

# Calender & Address book backup
00 20 * * * /bin/bash /etc/scripts/kalenderbackup.sh

Das Skript wird jeden Tag um 20:00 automatisch ausgeführt.

E-Mail-Versand konfigurieren

Zum Schluss ist noch die Installation des E-Mail-Server notwendig, damit der Raspberry Pi die Dateien an die definierten E-Mail-Adressen versendet.

In einem älteren Beitrag auf meiner Seite ist dazu bereits eine Anleitung. Der Artikel wurde von mir mehrmals überarbeitet und ist aktuell. Beachtet die Änderungen am Ende der Seite.
Motion mit E-Mail-Versand

Testen

Die Datensicherung lässt sich sehr leicht konfigurieren, indem das Skript „calendarbackup.sh“ von euch ausgeführt wird.

cd /etc/scripts
sudo ./calendarbackup.sh

Backups in regelmäßigen Abständen automatisch löschen

Das Skript speichert die Datensicherungen aktuell noch solange auf den externen Speicher, bis dieser komplett voll ist. Anschließend funktioniert das Backup nicht mehr. Um hier Abhilfe zu schafen gibt es eine einfache Lösung, eine automatisierte Löschung von alten Backups, die nicht mehr gebraucht werden.

Ich habe dazu bereits eine kleine Anleitung geschrieben.
Nextcloud – Backups in regelmäßigen automatisch Abständen löschen

Ändert den Pfad in dem Skript auf den Pfad, in den die Backups gespeichert werden. In diesem Beispiel ist das im Skript in der Variablen „mountpoint=’/mnt/usbbackup‚“ definiert.

Danach passt ihr den Cron Job noch an. Bei mir läuft die automatische Löschung alter Dateien einmal am Tag.

Meine verwendete Hardware für das Backup

An meinem Raspberry Pi habe ich für die Datensicherung von Kalender und Adressbuch den USB-Stick ➡ SanDisk Ultra Fit USB 3.1 Flash-Laufwerk 256 GB angeschlossen.

Die Größe des Sticks ist rein für die Speicherung der Adressbücher und Kalender ein wenig überdimensioniert.

Ihr könnt dort z.B. auch eine vollständige Sicherung der internen SD-Karte ablegen, also der gesamten Nextcloud-Instanz (ohne Daten), wie hier in meinem Beitrag beschrieben:
Raspberry Pi Image verkleinern

Raspberry Pi SD-Karte im Livebetrieb klonen – Neue Version

Photo by Denise Jans on Unsplash

In meinem Beitrag ➡ Raspberry Pi SD-Karte im Livebetrieb klonen habe ich ein Skript erstellt, dass ein komplettes Image der SD-Karte eines Raspberry Pis im laufenden Betrieb erstellt. Das Skript habe ich ein wenig optimiert und angepasst.

Es werden für das neue Skript zwei Tools benötigt:

  1. Mutt – The Mutt Mail User Agent
  2. PiShrink

Das erste Tool ist in den Repositories enthalten und kann ganz einfach installiert werden:

sudo aptitude install mutt

Das zweite Tool ist auf GitHub verfügbar und kann von dort heruntergeladen werden. Zu dem Tool habe ich bereits einen Artikel geschrieben
Raspberry Pi Image verkleinern

Das neue Skript verwendet das Tool „PiShrink„, um das mit „dd“ erstellt Image zu verkleinern. Damit wird weniger Speicherplatz im Backup-Archiv verwendet und ihr könnt sehr schnell das Image bei Bedarf auf andere SD-Karten (andere Größe, anderer Hersteller) ohne großen Aufwand schreiben . Durch das Verkleinern des Image mit dem neuen Skript verkürzt sich dadurch hoffentlich die Wiederherstellungszeit und damit die Ausfallzeit eures Systems im Notfall.


Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Zudem sollte beachtet werden, dass das neue Skript mehr Ressourcen durch PiShrink benötigt. Auf älteren Raspberry Pi-Versionen kann das ggf. zu einigen Problemen führen!
Ich verwende das Skript auf einem Raspberry Pi 4 mit 4GB RAM. Der externe Speicher ist an den USB-3.0-Anschluss angeschlossen, wodurch die Schreibgeschwindigkeit ebenfalls erhöht wird.
Die Laufzeit des gesamten Skripts, für die Erstellung des Images und dessen Verkleinerung beträgt trotzdem fas 2 Stunden.

#!/bin/bash

# by strobelstefan.org
# 2019-10-23
# Version: 2.0
# https://strobelstefan.de/?p=5985

#
# This script creates a full clone of your Raspberry Pi´s SD card.
#

###################################
# Define Variables
###################################

# Storage device as defined in your /etc/fstab.
mountpoint='/mnt/backup/'

# Path were the image of your SD card should be saved to
STORAGEPATH="/mnt/backup/imagebackup"

# Location of Nextcloud Installation
NEXTCLOUDINSTALLATION="/var/www/html/nextcloud"

# E-Mail Address
EMAIL="mail@email.de"

# Image name
IMAGENAME="rpi"

#Log File location and name
LOGFILE="/var/log/"$HOSTNAME_${IMAGENAME}_"backup-image.log"



###################################
# This removes your old log file
###################################
# This removes your old log file.
# When you run the script the first time an error will be displayed, 
# because no log file is in the defined path.
rm ${LOGFILE}


###################################
# MOUNTPOINT Section - Check Mount point Availability
###################################
# It checks if your mount point is accessible by your RPi.
# This is a crucial step, if the storage is not available the clone process of the SD card cannot conducted.
# Process
# 1. Check if mount point is accessible
# 2. If YES go to DELETION Section
# 3.1 If NO, try to mount storage device as defined in /etc/fstab
# 3.2 If mount is again not successful exit script, no further action will be conducted

if [ "$(findmnt ${mountpoint})" ] ;
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Mount point accessible by your "$HOSTNAME >> ${LOGFILE}
    else
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Mount point was not accessible, try to mount it now as defined in your /etc/fstab" >> ${LOGFILE}

    #This command mounts all storages defined in /etc/fstab
    mount -a

    if [ $? != 0 ]
        then
            echo $(date +%Y-%m-%d_%H-%M-%S) " - Mount of storage in first try successfully completed" >> ${LOGFILE}
        sleep 5
            mount -a
        if [ $? != 0 ]
        then
            echo $(date +%Y-%m-%d_%H-%M-%S) " - Backup FAILED! Was not able to mount your storage device. Stop backup process. You have to check it manually." >> ${LOGFILE}
            echo "Sent backup status via e-mail" | mutt ${EMAIL} -a ${LOGFILE} -s $HOSTNAME" - Backup FAILED" >> ${LOGFILE}
        exit
        fi
    fi

fi


##################################################################
# DELETION Section - Remove old Images from Storage Device
##################################################################
# Use this command with CAUTION!
# This will help you to automatically remove old images from your storage device to avoid that your
# storage will run out of disk space

echo $(date +%Y-%m-%d_%H-%M-%S) " - Start to delete files older than defined time " >> ${LOGFILE}


# Uncomment if the files should be identified by days, file > 30 days than it gets deleted
#find ${STORAGEPATH}/*.* -mtime +30 -exec rm -r {} \;

# Uncomment if you would like to use minutes file > 10080 minutes than it gets deleted
find ${STORAGEPATH}/*.* -type f -mmin +43200 -exec rm {} \;

if [ $? != 0 ]
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Deletion of old image files successfully completed" >> ${LOGFILE}
     if [ $? != 0 ]
     then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Was not able to delete old image files. You have to check it manually." >> ${LOGFILE}
    break
    fi
fi


###################################
# Nextcloud Maintenance Mode ON
###################################
#Aktiviere den Maintenancemode für Nextcloud - Keine Useranmeldung mehr möglich!

#Wechsel in das Nexcloud-Verzeichnis
cd ${NEXTCLOUDINSTALLATION}

sudo -u www-data php occ maintenance:mode --on

echo $(date +%Y-%m-%d_%H-%M-%S) " - Nextcloud maintenance mode ON" >> ${LOGFILE}


###################################
# CLONE Section - Clone SD Card Image
###################################
# This line creates a full copy of the SD card and writes it as an image file to the defined patch

echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to clone image" >> ${LOGFILE}

# Saves a plain img file on your storage device
sudo dd if=/dev/mmcblk0 of=${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d).img bs=1MB

echo $(date +%Y-%m-%d_%H-%M-%S) " - Finished to clone image" >> ${LOGFILE}


###################################
# Nextcloud Maintenance Mode OFF
###################################
#Entferne den Maintenancemode für Nextcloud - Useranmeldungen sind wieder möglich!

#Wechsel in das Nexcloud-Verzeichnis
cd ${NEXTCLOUDINSTALLATION}

sudo -u www-data php occ maintenance:mode --off

echo $(date +%Y-%m-%d_%H-%M-%S) " - Nextcloud maintenance mode OFF" >> ${LOGFILE}


###################################
# Resize dd Image
###################################
# Resize image with pishrink
# Please see https://github.com/Drewsif/PiShrink for further details
# pishrink.sh must be located in the same directory as this script!

echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to resize image" >> ${LOGFILE}

sudo /bin/bash /etc/scripts/pishrink.sh -d ${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d).img ${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d)-small.img

echo $(date +%Y-%m-%d_%H-%M-%S) " - Finished to resize big image" >> ${LOGFILE}


#Delete big image file
echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to delete big image" >> ${LOGFILE}

sudo rm ${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d).img

echo $(date +%Y-%m-%d_%H-%M-%S) " - Finished to delete big image" >> ${LOGFILE}



# Creates a compressed file of the resized image
# This command will create a compressed gz archive of the small image file.
# The small file will get deleted during the process if you would like to keep
# the small image file use the command gzip -k ${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d)-small.img
# Before you change the compression process check your disk space size

echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to compress small image" >> ${LOGFILE}

gzip -q ${STORAGEPATH}/${IMAGENAME}_$(date +%Y-%m-%d)-small.img

echo $(date +%Y-%m-%d_%H-%M-%S) " - Finished to compress small image" >> ${LOGFILE}




if [ $? != 0 ]
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Image file created" >> ${LOGFILE}
     if [ $? != 0 ]
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Was not able to create your image file. You have to check it manually." >> ${LOGFILE}
    break
    fi
fi



###################################
# UMOUNT Section - Unmount Storage Device
###################################
# This command unmounts the defined storage device.
# In the first try it will gently try to unmount, if the device is busy the command will force the unmount.

if [ "$(umount ${mountpoint})" ] ; 
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Umounted your storage device" >> ${LOGFILE}
    else
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Umount of storage device was not possible in first run, wait for 30 seconds" >> ${LOGFILE}
 
	sleep 30
 
    if [ $? != 0 ]
        then
            echo $(date +%Y-%m-%d_%H-%M-%S) " - Umount was successful" >> ${LOGFILE}
        sleep 5
            umount ${mountpoint}
        if [ $? != 0 ]
        then
            echo $(date +%Y-%m-%d_%H-%M-%S) " - Umount successful" >> ${LOGFILE}
        exit
        fi
    fi
 
fi

# Skript finished
echo $(date +%Y-%m-%d_%H-%M-%S) " - Mission Accomplished!!! System is going for a reboot." >> ${LOGFILE}

# Send status via e-mail
echo "Sent backup status via e-mail" | mutt ${EMAIL} -a ${LOGFILE} pishrink.log -s $HOSTNAME" - Backup SUCCESSFULL" >> ${LOGFILE}

#Optional
# If you like to reboot your system, please uncomment
#sudo reboot

Nun das Skript noch ausführbar machen

sudo chmod +x skript.sh

Zu automatischen Sicherung ist noch ein Crontab zu erstellen:

sudo crontab -e

Dort tragt ihr die Zeile ein, um das Skript zu einem bestimmten Zeitpunkt zu starten.

0 23 1 * * /bin/bash /home/pi/skripte/skript.sh

Photo by Denise Jans on Unsplash

Raspberry Pi Image verkleinern mit pishrink

Photo by Denise Jans on Unsplash

Ich hatte kürzlich das Problem, dass auf einem meiner Raspberry Pis die SD-Karte ausgetauscht werden musste. Ich habe dort eine 32GB-Karte von Samsung im Einsatz gehabt. Bei einem Onlinehändler habe ich mir ebenfalls eine 32GB-Karte jedoch von SanDisk gekauft.

Glücklicherweise habe ich für den Raspberry Pi ein Backup eingestellt gehabt, dass ein komplettes Image der SD-Karte erstellt und auf einen externen Datenträger schreibt.
Die Anleitung dafür gibt es hier
Raspberry Pi SD-Karte im Livebetrieb klonen.

Das so erstellte Image wollte ich mit dem Tool Etcher ( ➡ https://www.balena.io/etcher/) auf die neue Karte schreiben lassen. Jedoch gab es dabei eine unschöne Überraschung. Obwohl auf beiden SD-Karten 32GB aufgedruckt war, war nicht 32GB drin. Bei der neuen Karte meldete Etcher, dass Speicherplatz fehlt und deshalb das Image nicht auf die Karte geschrieben werden kann. Es galt also das Image zu verkleinern, um es auf die neue SD-Karte zu bekommen.

Es gibt dafür das recht cooles kleine Skript „pishrink“ von Drewsif auf github.com, dass diese Aufgabe übernimmt.
https://github.com/Drewsif/PiShrink.
Die Bedienung ist sehr einfach gehalten und das Ganze funktioniert ohne Probleme.

Ich habe für das Shrinken einen Raspberry Pi 4 verwendet, da er mehr Leistung und über USB 3.0-Ports verfügt als der alte Raspberry Pi 3. Es geht auch ein älterer Pi, jedoch benötigt dieser für die Aufgabe wesentlich mehr Zeit.

Die Funktionsweise des Skripts ist schnell erklärt:

  1. Original-Image wird ausgewählt
  2. pishrink erstellt eine exakte Kopie des Original-Images
  3. pishrink verkleinert die Kopie
  4. Original-Image und Kopie werden im gleichen Ordner belassen

Es ist also bei diesem ganzen Prozess unbedingt darauf zu achten, dass eine ausreichend große Festplatte verwendet wird, auf der beide Image-Dateien Platz finden.

Hier ein Screenshot, der das besser veranschaulicht:

pishrink
pishrink

Ich habe mir das Skript in das Verzeichnis „/etc/skripte“ geladen.

wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
sudo mv pishrink.sh /etc/skripte/

Im nächsten Schritt habe ich das Skript ausgeführt

sudo /bin/bash pishrink.sh nextcloud_2019-10-19.img nextcloud_2019-10-19_klein.img

Im obigen Screenshot ist schön zu sehen, was genau passiert und die einzelnen Schritte sind gut nachvollziehbar.

Im nächsten Schritt werde ich versuchen „pishrink.sh“ sinnvoll in beim Backup-Skript ( ➡ Raspberry Pi SD-Karte im Livebetrieb klonen)zu integrieren. Wahrscheinlich ist das nur sinnvoll bei einem Raspberry Pi 4, da sonst ggf. ältere Pis mit geringerem RAM swappen und dadurch die SD-Karte in Mitleidenschaft gezogen wird.

Ich habe das Image auf einer externen Festplatte gespeichert und diese an den RPi angebunden.
Hier noch ganz kurz, wenn ihr eine Festplatte direkt per /etc/fstab einhängen wollt.

UUID der Festplatte identifizieren

sudo blkid

Mount Piont erstellen

/mnt/pishrink

/etc/fstab editieren

sudo nano /etc/fstab

Die externe Festplatte ist im NTFS-Format formatiert.
Damit das Speichermedium schreibend eingebunden werden kann, wird das Paket „ntfs-3g“ benötigt.
Installiert wird das mit

sudo aptitude install ntfs-3g

Die folgende Zeile am Ende der Datei einfügen und die UUID anpassen.

# wird nur für das verkleinern eines Image eingebunden.
UUID=xyxyxyxyxy /mnt/pishrink ntfs defaults,noauto,umask=000,users,rw 0 0

Festplatte einhängen

sudo mount /mnt/pishrink

Das wars, nun könnt ihr mit „pishrink“ das Image auf der Festplatte verkleinern und anschließend auf die neue SD-Karte schreiben.


Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Photo by Denise Jans on Unsplash

Cannot open access to console the root account is locked.

Cannot open access to console the root account is locked„, diesen Fehler habe ich erhalten, als ich meinen Raspberry Pi nach einigen Anpassungen in der „/etc/fstab“ gemacht habe.

Damit ihr die Fehlermeldung seht, ist der Raspberry Pi an einen externen Monitor anzuschließen. Eine Remote-Verbindung ist nicht mehr möglich, der Pi ist bei diesem Fehler nicht einmal pingbar.

Ich habe versucht eine SD-Karte als Speicher während dem Bootvorgang als Laufwerk einzuhängen. Der Eintrag in der /etc/fstab lt.:

UUID=xyxyxyxyxyxyxyxy /mnt/SDCARD32GB ntfs defaults,auto,umask=000,users,rw 0 0

Der anschließende Versuch die SD-Karte manuell einzubinden hatte die Fehlermeldung zur Folge.

Mount is denied because the NTFS volume is already exclusively opened.
The volume may be already mounted, or another software may use it which
could be identified for example by the help of the ‚fuser‘ command.

Tja, Pech für mich. Ich habe mir nicht weiter dabei gedacht und den Pi neu gestartet und dann eben die Fehlermeldung „Cannot open access to console the root account is locked.“ erhalten.

Eine Analyse des Problems hat ergeben, dass der SD-Karten-Adapter scheinbar einen Defekt hat. Bei der Verwendung eines andern Adapters konnte ich die SD-Karte ohne Probleme mounten. Den Adapter habe ich bereits seit einigen Jahren genutzt und irgendwann scheint der einfach „durch“ zu sein und Ersatz wird benötigt.

Aber es gilt ja nach wie vor das Problem zu lösen, um den Pi wieder wie gewohnt nutzen zu können.
Eine gute Anleitung habe ich auf diesem Blog gefunden
https://samx18.io/blog/2017/11/05/piBootIssue.html.


Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Nextcloud – Kalender und Adressbücher sichern mit calcardbackup

Vor kurzem habe ich nach einer Lösung gesucht, wie ich die Kalender und Adressbücher meiner Nextcloud einfach und schnell sichern kann. Ein ganz wichtiger Punkt für mich war, beides muss auch ohne eine Nextcloud wieder hergestellt werden können, z.B. bei meinem E-Mail-Provider.


Bei einer privat gehosteten Nextcloud-Instanz, die auf einem Raspberry Pi läuft finde ich das sehr wichtig. Schließlich gibt es einige Faktoren bei denen der kleine Pi von heute auf morgen den Geist aufgeben kann, z.B. Hardware kaputt, SD-Karte defekt, Überspannung, Blitzschlag, etc.


Ich bin bei meiner Suche auf das Projekt „calcardbackup“ gestoßen, dass genau das macht was ich brauche. Es speichert die Adressbücher im „vcf„-Format und die Kalender im „ics„-Format auf ein definierten Verzeichnis.

Das Skript kann von GitHub heruntergeladen werden
https://github.com/BernieO/calcardbackup

Die Installation ist dann wie in der Dokumentation beschrieben vorzunehmen.


Ich habe mich das Ganze noch ein wenig angepasst, da ich eine Speicherung der Adressbücher- und der Kalenderdateien auf meiner FRITZ!Box haben wollte und nicht irgendwo auf der SD-Karte des Pis einer angeschlossenen Festplatte. Zusätzlich sollte die Datei auch nochmal per E-Mail an meine Adresse versendet werden.

Ich verwende dabei ein paar Code-Schnipsel aus meinem Artikel
Raspberry Pi SD-Karte im Livebetrieb sichern, um das Share auf meiner Fritzbox zu mounten.

ACHTUNG NEUE VERSION DES SKRIPTS GIBT ES ➡ hier

Hier nun mein Skript:

#!/bin/bash

# by strobelstefan.de
# 2019-01-13
# Version: 1.0
# https://strobelstefan.de/?p=6094

#
# This script uses the project calcardbackup (https://github.com/BernieO/calcardbackup) to export calendar and address books 
# from Nextcloud and sends is via e-mail to a defined address 

###################################
# Define Variables
###################################

# Storage device as defined in you /etc/fstab.
mountpoint='/mnt/fritzbox'

# Location of your Nextcloud
NEXTCLOUD='/var/www/html/nextcloud'

# Location of your log file
LOGFILE="/var/log/kalenderbackup.log"

# Location Backup Path
IMAGE='/mnt/fritzbox/Nextcloud/calcardbackup'

# Location of the calcardbackup script
CALCARDBACKUP='/etc/scripts/calcardbackup/calcardbackup'

# E-Mail Address where the export should be emailed to
EMAILBACKUP="backup@email.de"

# E-Mail where the log file should be mailed to
EMAIL="logfile@email.de"



###################################
# This removes your old log file
###################################

rm ${LOGFILE}


###################################
# MOUNTPOINT Section - Check Mountpoint Availability
###################################
# It checks if your mountpoint is accessible by your RPi.
# This is a crucial step, if the sotrage is not available the clone process of the SD card cannot conducted.
# Process
# 1. Check if mountpoint is accessible
# 2. If YES go to DELETION Section
# 3.1 If NO, try to mount storage device as defined in /etc/fstab
# 3.2 If mount is again not sucessful exit script, no futher action will be conducted

if [ "$(findmnt ${mountpoint})" ] ;
        then
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Mountpoint accessible by your Raspberry Pi" >> ${LOGFILE}
        else
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Mountpoint was not mounted, try to mount it now as defined in your /etc/fstab" >> ${LOGFILE}

        #This command mounts all storages defined in /etc/fstab
        mount -a

        if [ $? != 0 ]
                then
                        echo $(date +%Y-%m-%d_%H-%M-%S) " - Mount of storage in first try sucessfully completed" >> ${LOGFILE}
                sleep 5
                        mount -a
                if [ $? != 0 ]
                then
                        echo $(date +%Y-%m-%d_%H-%M-%S) " - Backup FAILED! Was not able to mount your storage device. Stop backup process. You have to check it manually." >> ${LOGFILE}
                        echo "Sent backup status via e-mail" | mail -a ${LOGFILE} -s "NEXTCLOUD Pi - Backup FAILED" ${EMAIL} < ${LOGFILE}
                exit
                fi
        fi

fi


###################################
# Calls the calcardbackup script
# For more information please refer to
# https://github.com/BernieO/calcardbackup
###################################

sudo -u www-data ${CALCARDBACKUP} "${NEXTCLOUD}" -o ${IMAGE} -i -r 90
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully exported calendar and address books to AVM" >> ${LOGFILE}


###################################
# Send Export via E-Mail
###################################
# Will look for the newest file in the defined path ${IMAGE}
# and send the file as an attachement via e-mail to the defined address ${EMAILBACKUP}

newest=$(ls -rt ${IMAGE}*.tar.gz | tail -n1)
echo $(date +%Y-%m-%d_%H-%M-%S) " - Please find attached the actual export of calendars and address books of your Nextcloud instance." | mutt ${EMAILBACKUP} -a $newest -s "NEXTCLOUD Pi - Exported Calendar and Address Book"
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully sent export via E-Mail to ${EMAILBACKUP}"  >> ${LOGFILE}


###################################
# UMOUNT Section - Unmount Storage Device
###################################
# This command unmounts the defined storage device
# In the first try it will gently try to unmount, if the device is busy the command will force the unmount.

echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to unmount storage device">> ${LOGFILE}

umount ${mountpoint}

if [ $? != 0 ]
        then
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Device busy, unmount forcefully" >> ${LOGFILE}
        sleep 5
                umount -l ${mountpoint}
        if [ $? != 0 ]
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Issue with umount you storage, check manually" >> ${LOGFILE}
    break
        fi
fi


###################################
# Send Log File
###################################
# This sends the log file to ${EMAIL}

echo $(date +%Y-%m-%d_%H-%M-%S) " - Calendar & Address Book exported and saved" | mail -a ${LOGFILE} -s "NEXTCLOUD Pi - Calendar & Address Book exported and saved" ${EMAIL} < ${LOGFILE}

Das Skript noch ausführbar machen

sudo chmod +x skript.sh

Und dann testen

sudo ./skript.sh

Automatisieren kann man den ganzen Prozess mit einen CRON Job:

sudo crontab -e

Dort die folgenden Zeilen eintragen, damit einmal am Tag um 0:00 Uhr der Export gestartet wird

#Calender & Addressbook Backup
@daily /bin/bash /etc/scripts/skript.sh

Und hier das Skript zu herunterladen:
https://codeberg.org/strobelstefan.org/kalenderbackup


Gib mir gerne einen Kaffee ☕ aus!

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

PayPal Logo


liberapay.com/strobelstefan.org


Kaffee via Bitcoin

bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


Skript-Verbesserungen

Der Entwickler von calcardbackup BernieO hat mir ein paar Verbesserungen für das Skript vorgeschlagen, die ich euch nicht vorenthalten möchte.
Hier das neue SKript mit den Kommentaren

#!/bin/bash

# by strobelstefan.de
# 2019-01-13
# Version: 1.0
# https://strobelstefan.de/?p=6094

#
# This script uses the project calcardbackup (https://github.com/BernieO/calcardbackup) to export calendar and address books 
# from Nextcloud and sends is via e-mail to a defined address 

###################################
# Define Variables
###################################

# Storage device as defined in you /etc/fstab.
mountpoint='/mnt/fritzbox'

# Location of your Nextcloud
NEXTCLOUD='/var/www/html/nextcloud'

# Location of your log file
LOGFILE="/var/log/kalenderbackup.log"

# Location Backup Path
IMAGE='/mnt/fritzbox/Nextcloud/calcardbackup'

# Location of the calcardbackup script
CALCARDBACKUP='/etc/scripts/calcardbackup/calcardbackup'

# E-Mail Address where the export should be emailed to
EMAILBACKUP="backup@email.de"

# E-Mail where the log file should be mailed to
EMAIL="logfile@email.de"



###################################
# This removes your old log file
###################################

rm ${LOGFILE}


###################################
# MOUNTPOINT Section - Check Mountpoint Availability
###################################
# It checks if your mountpoint is accessible by your RPi.
# This is a crucial step, if the sotrage is not available the clone process of the SD card cannot conducted.
# Process
# 1. Check if mountpoint is accessible
# 2. If YES go to DELETION Section
# 3.1 If NO, try to mount storage device as defined in /etc/fstab
# 3.2 If mount is again not sucessful exit script, no futher action will be conducted

if [ "$(findmnt ${mountpoint})" ] ;
        then
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Mountpoint accessible by your Raspberry Pi" >> ${LOGFILE}
        else
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Mountpoint was not mounted, try to mount it now as defined in your /etc/fstab" >> ${LOGFILE}

        #This command mounts all storages defined in /etc/fstab
        mount -a

# hier schlage ich vor, auf Fehlercode "0" zu prüfen, dann stimmt die Textausgabe in Zeile 69:
        if [ $? == 0 ]  # Original: if [ $? != 0 ]
                then
                        echo $(date +%Y-%m-%d_%H-%M-%S) " - Mount of storage in first try sucessfully completed" >> ${LOGFILE}
# die nächste Zeile ('else') habe ich neu eingefügt. Der else-Block wird nur ausgeführt, wenn 'mount -a' Fehler ausgespuckt hat.
                else
                        sleep 5
                        mount -a
                        if [ $? != 0 ]
                            then
                                echo $(date +%Y-%m-%d_%H-%M-%S) " - Backup FAILED! Was not able to mount your storage device. Stop backup process. You have to check it manually." >> ${LOGFILE}
                                echo "Sent backup status via e-mail" | mail -a ${LOGFILE} -s "NEXTCLOUD Pi - Backup FAILED" ${EMAIL} < ${LOGFILE}
                            exit
                        fi
        fi

fi


###################################
# Calls the calcardbackup script
# For more information please refer to
# https://github.com/BernieO/calcardbackup
###################################

# diese Zeile:
# sudo -u www-data ${CALCARDBACKUP} "${NEXTCLOUD}" -o ${IMAGE} -i -r 90
# ersetzen durch (hierbei wird der Variablen 'newest' der Pfad zur Backup-Datei zugewiesen (batch-mode von calcardbackup))
# nicht irritieren lassen durch die vielen Gänsefüßchen - die Variablenzuweisung stimmt so (command substitution!):
newest="$(sudo -u www-data "${CALCARDBACKUP}" "${NEXTCLOUD}" -o "${IMAGE}" -i -r 90 -b)"
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully exported calendar and address books to AVM" >> ${LOGFILE}


###################################
# Send Export via E-Mail
###################################
# Will look for the newest file in the defined path ${IMAGE}
# and send the file as an attachement via e-mail to the defined address ${EMAILBACKUP}

# folgende Zeile kann wegfallen, da ${newest} schon den Pfad zur Backup-Datei enthält (siehe Zeile 94):
# newest=$(ls -rt ${IMAGE}*.tar.gz | tail -n1)
echo $(date +%Y-%m-%d_%H-%M-%S) " - Please find attached the actual export of calendars and address books of your Nextcloud instance." | mutt ${EMAILBACKUP} -a $newest -s "NEXTCLOUD Pi - Exported Calendar and Address Book"
echo $(date +%Y-%m-%d_%H-%M-%S) " - Successfully sent export via E-Mail to ${EMAILBACKUP}"  >> ${LOGFILE}


###################################
# UMOUNT Section - Unmount Storage Device
###################################
# This command unmounts the defined storage device
# In the first try it will gently try to unmount, if the device is busy the command will force the unmount.

echo $(date +%Y-%m-%d_%H-%M-%S) " - Started to unmount storage device">> ${LOGFILE}

umount ${mountpoint}

if [ $? != 0 ]
        then
                echo $(date +%Y-%m-%d_%H-%M-%S) " - Device busy, unmount forcefully" >> ${LOGFILE}
        sleep 5
                umount -l ${mountpoint}
        if [ $? != 0 ]
    then
        echo $(date +%Y-%m-%d_%H-%M-%S) " - Issue with umount you storage, check manually" >> ${LOGFILE}
# die folgende Zeile kann wegfallen, da "break" bei "if" keinerlei Funktion hat.
#    break
        fi
fi


###################################
# Send Log File
###################################
# This sends the log file to ${EMAIL}

echo $(date +%Y-%m-%d_%H-%M-%S) " - Calendar & Address Book exported and saved" | mail -a ${LOGFILE} -s "NEXTCLOUD Pi - Calendar & Address Book exported and saved" ${EMAIL} < ${LOGFILE}

Raspberry Pi SD-Karte im Livebetrieb klonen

Photo by Markus Winkler on Unsplash

Seit einigen Wochen betreibe ich eine Nextcloud auf einem Raspberry Pi. Datensicherungen von den Konfigurationsdateien und von der MariaDB werden in regelmäßigen Abständen automatisch mit Hilfe von Cron Jobs auf ein externes Speichermedium gesichert. Jedoch bleibt ein Risiko, dass mit einem Raspberry Pi theoretisch jederzeit auftreten kann, die SD-Karte geht kaputt.