Dieses Bash-Skript exportiert Kalender und Adressbücher aus ownCloud/Nextcloud als .ics- und .vcf-Dateien und speichert sie in einem komprimierten Archiv. Weitere Optionen stehen zur Verfügung.
config.php
, zum Skript selbst und zu allen benutzten Konfigurationsdateien habenbash --version
)gnupg
, um Backups zu verschlüsselnzip
, um Backups als zip-Datei zu komprimieren (anstelle tar.gz)curl
, wenn die nicht empfohlene Option -g|--get-via-http
gesetzt wirddas Repository auf Ihren Server klonen (nicht ins webroot!) und ins Verzeichnis wechseln:
git clone https://codeberg.org/BernieO/calcardbackup.git
cd calcardbackup
die Besitzrechte des Repository dem Webserver-User zuweisen (hier www-data
):
sudo chown -R www-data:www-data .
das Skript als Webserver-User (hier www-data
) aufrufen und als Argument den Pfad zu ownCloud/Nextcloud übergeben (hier /var/www/nextcloud
):
sudo -u www-data ./calcardbackup "/var/www/nextcloud"
die Ausgabe des Skripts beobachten. Falls weitere Optionen benötigt werden, wird dies ausgegeben.
Das Backup befindet sich im Verzeichnis backups/
.
Es gibt viele weitere Optionen, die dem Skript übergeben werden können (siehe Optionen und Beispiele).
Wenn das Skript fehlerfrei läuft, empfiehlt es sich, die Ausführung zu automatisieren.
Für den täglichen Aufruf kann folgendermaßen ein Cronjob erstellt werden:
zunächst eine Logdatei erstellen und die Besitzrechte dem Webserver-User (hier www-data
) zuweisen:
sudo touch /var/log/calcardbackup.log
sudo chown www-data:www-data /var/log/calcardbackup.log
die Cron-Tabelle des Webserver-Users (hier www-data
) zum Bearbeiten öffnen mit:
sudo crontab -u www-data -e
und am Ende der Datei die folgende Zeile hinzufügen (Pfade anpassen!):
0 2 * * * /pfad/zu/calcardbackup/calcardbackup "/var/www/nextcloud" > /var/log/calcardbackup.log 2>&1
Nun wird Cron calcardbackup jeden Tag um 02:00 Uhr morgens aufrufen.
Die Skriptausgabe der jeweils letzten Ausführung befindet sich in der Logdatei /var/log/calcardbackup.log
.
Es sollte beachtet werden, dass Prozent-Zeichen (%
) in einer crontab-Datei in Zeilenumbrüche umgewandelt werden, sofern sie nicht maskiert sind.
Wenn calcardbackup nach der Schnellinstallation eingerichtet wurde, genügt ein git pull
im Installationsordner, um das Skript zu aktualisieren:
cd /path/to/calcardbackup
sudo -u www-data git pull
Falls die installierte Version noch mit GitHub verknüpft ist, muss einmalig folgender Befehl vor git pull
ausgeführt werden:
sudo -u www-data git remote set-url origin "https://codeberg.org/BernieO/calcardbackup.git"
⚠️ WICHTIG: falls von einer Version <= 0.7.2 aktualisiert wird, sollte auch die Datei mit den Zugangsdaten gelöscht werden (sie wird nicht mehr benötigt)!
Alle Optionen können als Konfigurationsdatei oder über die Kommandozeile übergeben werden. Ohne Optionen, oder nur mit Option -b|--batch
aufgerufen, benutzt das Skript die Datei calcardbackup.conf
im Skriptverzeichnis als Konfigurationsdatei, sofern vorhanden.
Falls keine Konfigurationsdatei über die Option -c|--configfile
an das Skript übergeben wird, muss der Pfad zur ownCloud/Nextcloud Instanz als erstes Argument übergeben werden.
Im Folgenden werden die verfügbaren Optionen ausführlich beschrieben:
Aufruf: ./calcardbackup [VERZEICHNIS] [Option [Argument]] [Option [Argument]] [Option [Argument]] ...
Argumente in Großbuchstaben sind für die jeweiligen Optionen notwendig.
Pfade (DATEI / VERZEICHNIS) sind absolute Pfade oder relative Pfade zum Arbeitsverzeichnis.
Falls ein Pfad mit einer Tilde-Slash Kombination ~/ beginnt, wird die Tilde durch ${HOME} ersetzt.
-a | --address URL
übergibt die URL der ownCloud Installation an das Skript.
nur erforderlich für Option '-g|--get-via-http' in Kombination mit ownCloud < 7.0
-b | --batch
Batchmodus: außer des Pfades zum Backup erfolgt keine Ausgabe.
Abhängig von der Konfiguration ist das:
- absoluter Pfad zum komprimierten Backup-Archiv
oder, falls mit Option '-x|--uncompressed' aufgerufen,
- absoluter Pfad zum Verzeichnis mit den unkomprimierten Backupdateien
-c | --configfile DATEI
Benutze DATEI als Konfigurationsdatei. Siehe 'examples/calcardbackup.conf.example'
Weitere angegebene Optionen mit Ausnahme von '-b|--batch' werden ignoriert!
-d | --date FORMAT
Benutze FORMAT als Dateinamenserweiterung für die komprimierte Backupdatei oder das
Backupverzeichnis. FORMAT muss eine gültige Formatbeschreibung des Befehls date() sein.
Als Standard wird -%Y-%m-%d benutzt, was zu folgender Datei- oder Verzeichnisbenennung führt:
'calcardbackup-2017-03-23.tar.gz' oder 'calcardbackup-2017-03-23'
Informationen über verschiedene Formate und die Syntax finden sich unter 'man date'
-e | --encrypt DATEI
Verschlüssele das komprimierte Backup mit AES256 (gnupg).
Die erste Zeile von DATEI wird als Passphrase benutzt werden.
-g | --get-via-http
ACHTUNG: diese Option ist veraltet und wird möglicherweise in einer zukünftigen Version
von calcardbackup entfernt werden; sie ist nur vorhanden, um Rückwärtskompatibilität zu
gewährleisten.
Fordere Kalender-/Addressbuchdateien über http(s) vom ownCloud/Nextcloud Server an.
Wenn diese Option benutzt wird, ist eine Datei mit Nutzernamen und dazugehörigen
Klartext-Passwörtern zwingend notwendig (siehe Option '-u|--usersfile')
Dies war die Standardvorgehensweise des Skripts bis calcardbackup <= 0.7.2. Es wird davon
abgeraten diese Option zu benutzen wegen des Sicherheitsrisikos, Passwörter im Klartext in
einer eigenen Datei anzugeben.
-h | --help
Gib Versionsnummer und einen kurzen Hilfetext aus
-i | --include-shares
Sichere auch geteilte Adressbücher und Kalender, aber nur einmal: z.B. ein geteilter
Kalender wird nicht erneut gesichert, wenn derselbe Kalender schon für einen anderen
Nutzer gesichert wurde.
ACHTUNG: diese Option wird ignoriert, wenn nicht in Kombination mit '-u|--usersfile' benutzt.
-ltm | --like-time-machine N
Behalte alle Sicherungen der letzten N Tage, für die Zeit davor aber nur solche, die Montags
erstellt wurden.
-na | --no-addressbooks
Sichere keine Adressbücher
-nc | --no-calendars
Sichere keine Kalender
-o | --output VERZEICHNIS
Benutze VERZEICHNIS, um die Backups zu speichern.
Fehlt diese Option, wird das Verzeichnis 'backups/' im Skriptverzeichnis erstellt und benutzt.
-one | --one-file-per-component
Speichere jede Kalender-Komponente (z.B. Event) und jede Addressbuch-Komponente in eine einzelne
Datei mit Namen USERNAME-(CALENDARNAME|ADDRESSBOOKNAME)_UID.(ics|vcf).
In diesem Modus nimmt calcardbackup keine Änderungen an den von der Datenbank erhaltenen Daten
vor, außer die Zeilenenden mit CR+LF zu gestalten (wie in RFC5545/RFC6350 vorgeschrieben).
Mit Hilfe dieser Option können fehlerhafte Datenbankeinträge untersucht oder
Kalender/Addressbücher zu einem Radicale caldav/carddav Server oder zu vdirsyncer migriert
werden.
ACHTUNG: diese Option wird ignoriert, wenn in Kombination mit der veralteten
Option '-g|--get-via-http' benutzt.
-p | --snap
Diese Option ist verpflichtend bei nextcloud-snap (https://github.com/nextcloud/nextcloud-snap).
calcardbackup muss in diesem Fall mit sudo gestartet werden (ausgeführt als root ohne sudo wird
auch scheitern!).
-r | --remove N
Lösche Backups älter als N Tage vom Backupverzeichnis (N muss eine positive Ganzzahl sein).
-s | --selfsigned
Ignoriere ein nicht vertrauenswürdiges (z.B. selbstsigniertes) Zertifikat. Erforderlich in
Kombination mit Option '-g' und nicht vertrauenswürdigen Zertifikaten. In jedem Fall wird cURL
benutzt, um status.php abzurufen und damit zusätzliche Prüfungen durchzuführen.
Falls cURL die URL aufgrund eines nicht vertrauenswürdigen Zertifikates nicht
erreichen kann, wird calcardbackup diese zusätzlichen Prüfungen überspringen.
-u | —usersfile DATEI
Benutze DATEI, die die Nutzernamen der Nutzer enthält, deren Daten gesichert werden sollen.
Ein Nutzer pro Zeile. Siehe 'examples/users.txt.example'
ACHTUNG: diese Option ist zwingend erforderlich, falls das Skript mit der veralteten Option
'-g|--get-via-http' aufgerufen wird. In diesem Fall müssen in DATEI auch die Passwörter der
jeweiligen Nutzer durch einen Doppelpunkt vom Nutzernamen getrennt angegeben werden.
Siehe 'examples/users.txt.example'
-x | --uncompressed
komprimiere das Backup nicht
-z | --zip
Benutze zip, um das Backup zu komprimieren, an Stelle eines gzip-tar-Archivs (tar.gz)
ACHTUNG: die Option '-f|--fetch-from-database' (eingeführt mit calcardbackup 0.6.0) ist
der Standard für calcardbackup >= 0.8.0 und hat daher keine Funktion mehr.
./calcardbackup /var/www/nextcloud -nc -x
Sichere keine Kalender (-nc
) und speichere das Backup unkomprimiert (-x
) im Verzeichnis calcardbackup-YYYY-MM-DD
(Standard) in ./backups/
(Standard).
./calcardbackup /var/www/nextcloud --no-calendars --uncompressed
Dies ist genau dasselbe Kommando wie im ersten Beispiel, allerdings mit langen Optionsnamen statt der kurzen.
./calcardbackup -c /etc/calcardbackup.conf
Benutze die Konfigurationsdatei /etc/calcardbackup.conf (-c /etc/calcardbackup.conf
). Alle Parameter für das gewünschte Verhalten müssen in dieser Datei angegeben werden (siehe examples/calcardbackup.conf.example).
Die Angabe weiterer Optionen entfällt, da sie ignoriert werden (mit Ausnahme von -b|--batch
).
./calcardbackup
Benutze die Datei calcardbackup.conf im Verzeichnis des Skripts als Konfigurationsdatei.
Dies ist im Grunde dasselbe wie Beispiel Nr. 3, nur mit dem Standardpfad der Konfigurationsdatei.
./calcardbackup /var/www/nextcloud -b -d .%d.%H -z -e /home/tom/key -o /media/data/backupfolder/ -u /etc/calcardbackupusers -i -r 15
Unterdrücke alle Ausgaben außer dem Pfad zum Backup (-b
), benutze die Dateinamenserweiterung .DD.HH (-d .%d.%H
), benutze zip, um das Backup zu komprimieren (-z
), verschlüssele das komprimierte Backup und benutze als Schlüssel die erste Zeile der Datei /home/tom/key (-e /home/tom/key
), speichere das Backup im Verzeichnis /media/data/backupfolder/ (-o /media/data/backupfolder/
), sichere nur Elemente von in der Datei /etc/calcardbackupusers angegebenen Nutzern (-u /etc/calcardbackupusers
), schließe mit Nutzern geteilte Adressbücher/Kalender mit ein (-i
) und lösche alle Sicherungen älter als 15 Tage (-r 15
).
sudo ./calcardbackup /var/snap/nextcloud/current/nextcloud -p
Dieses Beispiel ist für Nutzer von nextcloud-snap. calcardbackup wird die Dienstprogramme von nextcloud-snap benutzen (-p
), um alle in der Datenbank vorhandenen Kalender und Adressbücher zu sichern.
./calcardbackup /var/www/nextcloud -ltm 30 -r 180
Behalte alle Sicherungen der letzten 30 Tage, für die Zeit davor aber nur solche, die Montags erstellt wurden (-ltm 30
) und lösche alle Backups, die älter als 180 Tage sind (-r 180
).
⚠️ Es muss sichergestellt werden, dass Backups auch Montags erstellt werden, wenn die Option -ltm
benutzt wird.
Falls Nextcloud-Snap benutzt wird, muss das Skript mit Option -p|--snap
aufgerufen werden. calcardbackup wird dann das im Snap-Paket enthaltene Dienstprogramm nextcloud.mysql-client
benutzen, um auf die Datenbank zuzugreifen.
Damit dies funktioniert, muss calcardbackup mit sudo
aufgerufen werden (als root ohne sudo
aufgerufen wird auch fehlschlagen).
Als Pfad zu Nextcloud muss der Pfad zu den Konfigurationsdateien des Snap Paketes angegeben werden. Bei einer Standardinstallation ist dies /var/snap/nextcloud/current/nextcloud
. Siehe Beispiel Nr. 6.
Unter syncloud muss das Skript als User nextcloud
mit der Option -p
aufgerufen werden. Zusätzlich muss beim Aufruf von calcardbackup der Pfad zu den snap-binaries der Pfad-Variablen hinzugefügt werden:
sudo -u nextcloud PATH="${PATH}:/snap/bin" ./calcardbackup "/var/snap/nextcloud/current/nextcloud" -p
Es gibt auch ein kleines Code-Beispiel über die Benutzung von calcardbackup im Wiki der Syncloud-Plattform.
Beim Synology DiskStation Manager (DSM) muss vor Aufruf von calcardbackup der Pfad zu mysql
der PATH
Variablen hinzugefügt werden. Beispiel:
sudo -u http PATH="${PATH}:/usr/local/mariadb10/bin" ./calcardbackup "/volume1/web/nextcloud"
Falls Sie die Verschlüsselungsoption des Skripts benutzen möchten, seien Sie sich der folgenden Tatsachen bewusst:
gpg -o AUSGABE_DATEI -d VERSCHLÜSSELTE_DATEI.GPG
Ja, das geht! 😃
calcardbackup benötigt lediglich die Datenbank (und Zugang zu ihr) einer ownCloud/Nextcloud Installation, um Kalender/Adressbücher von der Datenbank auszulesen und sie als .ics und .vcf Datein zu sichern.
Gehen Sie folgendermaßen vor:
eine Nextcloud Verzeichnis Attrappe anlegen (inklusive Unterverzeichnis config
):
mkdir -p /usr/local/bin/nextcloud_dummy/config
eine Datei config.php
anlegen und mit folgenden Werten füllen:
nano /usr/local/bin/nextcloud_dummy/config/config.php
den Typ der Datenbank wie in config.sample.php
für MySQL/MariaDB/PostgreSQL:
für SQLite3:
owncloud.db
lauten):cp /path/to/owncloud.db /usr/local/bin/nextcloud_dummy/owncloud.db
falls die Datenbank zu einer Installation von ownCloud <= 8.2 gehört, muss folgende Zeile hinzugefügt werden:
'version' => '8.0.0',
calcardbackup ausführen und als erstes Argument den Pfad zu der in Schritt 1 angelegten Nextcloud Verzeichnisattrappe angeben:
./calcardbackup /usr/local/bin/nextcloud_dummy
public function mergeObjects
public function generateVCF
⚠️ Diese Option ist veraltet und es wird davon abgeraten sie zu benutzen wegen der Notwendigkeit, Klartext-Passwörter in einer eigenen Datei anzugeben! Sie wird möglicherweise in einer zukünftigen Version von calcardbackup entfernt werden.
Standardmäßig erstellt calcardbackup Sicherungsdateien von Kalendern und Adressbüchern durch Auslesen der entsprechenden Daten direkt von der Datenbank. Falls das Skript jedoch mit der Option -g|--get-via-http
aufgerufen wird, wird calcardbackup die veraltete Methode benutzen, um die Sicherung zu erstellen und Kalender und Addressbücher vom ownCloud/Nextcloud Webinterface herunterladen. Hierfür ist eine Datei mit Nutzernamen und Passwörtern notwendig, die an das Skript mit der Option -u|--usersfile
übergeben wird.
Neben des Sicherheitsrisikos, Klartextpasswörter in einer Datei zu speichern, birgt diese Option die Gefahr von Timeouts, die dazu führen, dass calcardbackup große Adressbücher nicht sichern kann.
Lange Rede kurzer Sinn: alles was Sie über die Option -g|--get-via-http
wissen müssen ist, sie NICHT zu benutzen (außer Sie haben einen guten Grund, die Passwörter der zu sichernden ownCloud/Nextcloud Nutzer preiszugeben).