{"id":291,"date":"2020-09-05T11:54:24","date_gmt":"2020-09-05T09:54:24","guid":{"rendered":"https:\/\/jet0jlh.de\/?p=291"},"modified":"2020-09-30T12:01:11","modified_gmt":"2020-09-30T10:01:11","slug":"nextcloud-automatisch-sichern","status":"publish","type":"post","link":"https:\/\/jet0jlh.de\/?p=291","title":{"rendered":"Nextcloud &#8211; Automatisch sichern"},"content":{"rendered":"\n<p>Eine Nextcloud ist eine sch\u00f6ne Sache. Aber was wenn ein Benutzer ausversehen Daten l\u00f6scht oder bei einem Update etwas verherrend schief l\u00e4uft?<br>Aus solchen Gr\u00fcnden erstellt man Backups.<br>Das wollen wir mit diesem Blogeintrag auch einmal gemeinsam machen und das m\u00f6glichst automatisch.<br>Ziel des Backupskripts wird es sein die Cloud in einen sauberen Zustand zu versetzen, die Datenbank zu exportieren, die ver\u00e4nderten Clouddaten zu sichern und danach die Cloud wieder in Betrieb zu nehmen.<\/p>\n\n\n\n<figure class=\"wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Keine Sicherung, kein Mitleid \ud83d\ude09 | Nextcloud bauen mit Jet #08\" width=\"625\" height=\"352\" src=\"https:\/\/www.youtube.com\/embed\/j7Th-oHbWmg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Mein Vorschlag f\u00fcr ein solches Bash Backupskript sieht wie folgt aus (Extra mit vielen &#8222;Kommentaren&#8220; versehen) (<span class=\"has-inline-color has-vivid-red-color\">Skript f\u00fcr eine Nextcloud mit seperaten Datenverzeichnis findet ir weiter unten<\/span>) :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#Hier sind alle anzupassenden Variablen----\nclouddir=\/var\/www\/nextcloud\nbackupdir=\/var\/cloudbackup\ndbname=cloud\n#---------------------------------------\n#Erstelle Backupverzeichnisstruktur falls noch nicht voranden\nmkdir $backupdir\nmkdir $backupdir\/www\nmkdir $backupdir\/db\n\necho Schalte Cloud in den Maintanence Mode...\ncd $clouddir\nsudo -u www-data php occ maintenance:mode --on\necho Sichere Webverzeichnis...\nrsync --progress -h -a --delete $clouddir $backupdir\/www\necho L\u00f6sche alte SQL Backup...\nrm $backupdir\/db\/cloud.sql\necho Erstelle neues SQL Backup...\nmysqldump --single-transaction $dbname > $backupdir\/db\/cloud.sql\necho Schalte Cloud wieder aktiv...\nsudo -u www-data php occ maintenance:mode --off\necho Sicherung abgeschlossen\n<\/pre>\n\n\n\n<p>Wenn ihr nun das Skript \u00fcbernommen habt, die Variablen angepasst und das ganze Skript mit dem Befehl <code>chmod +x &lt;scriptname&gt;<\/code> ausf\u00fchrbar gemacht habt, so solltet ihr nach dem ersten Ausf\u00fchren es Skripts folgende Ordnerstruktur vorfinden.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>$backupdir\/www<ul><li>Hier sollte sich nun das Cloudverzeichnis mit allen Daten befinden<\/li><\/ul><\/li><li>$backupdir\/db<ul><li>Hier sollte sich nun eine export der Clouddatenbank befinden<\/li><\/ul><\/li><li><span class=\"has-inline-color has-vivid-red-color\">$backupdir\/data<\/span><ul><li><span class=\"has-inline-color has-vivid-red-color\">Wird nur beim unteren Skript erstellt, wenn das Datenverzeichnis der Nextcloud seperat liegt (z.B. auf einer Festplatte). In dem Fall befindet sich im $backupdir\/www keine Nutzerdaten.<\/span><\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Beim ersten Lauf des Skriptes wird es je nach Datenmenge etwas dauern. Beim zweiten Mal wird dank rsync daf\u00fcr gesorgt, dass nur die \u00c4nderungen seit dem letzten Backup \u00fcbertragen werden. Dies ist auch der Grund warum ich die Dateien nicht Zipe. Sonst wird das mit dem Pr\u00fcfen auf \u00c4nderung schwierig.<\/p>\n\n\n\n<p>Nun fehlt nur noch ein Eintrag als cronjob damit die Datensicherung automatisch durchgef\u00fchrt wird. Daher geben wir <code>crontab -e<\/code> ein und tragen dort f\u00fcr unser Skript folgende Zeile ein:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">30      2       *       *       *       &lt;pfadZumSkript><\/pre>\n\n\n\n<p>Dieser Eintrag f\u00fchrt nun dazu, dass jede Nacht um 2:30 Uhr das Skipt gestartet wird.<\/p>\n\n\n\n<p>Sollte euer Cloud Datenverzeichnis seperat liegen, dann m\u00fcsstet ihr das Skript um einen weiteren rsync erweitern (Siehe Skript unten), oder einfach nur das Datenverzeichnis sichern. Die Cloud l\u00e4sst sich auch nur mit dem Datenverzeichnis und dem passenden SQL Export wiederherstellen. Aber mit ist es einfacher \ud83d\ude0a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#Hier sind alle anzupassenden Variablen----\nclouddir=\/var\/www\/nextcloud\nclouddatadir=\/media\/festplatte\/nextcloud\nbackupdir=\/media\/festplatte\/cloudbackup\ndbname=cloud\n#---------------------------------------\n#Erstelle Backupverzeichnisstruktur falls noch nicht voranden\nmkdir $backupdir\nmkdir $backupdir\/www\nmkdir $backupdir\/db\nmkdir $backupdir\/data\n\necho Schalte Cloud in den Maintanence Mode...\ncd $clouddir\nsudo -u www-data php occ maintenance:mode --on\necho Sichere Webverzeichnis...\nrsync --progress -h -a --delete $clouddir $backupdir\/www\necho Sichere das Datenverzeichnis...\nrsync --progress -h -a --delete $clouddatadir $backupdir\/data\necho L\u00f6sche alte SQL Backup...\nrm $backupdir\/db\/cloud.sql\necho Erstelle neues SQL Backup...\nmysqldump --single-transaction $dbname > $backupdir\/db\/cloud.sql\necho Schalte Cloud wieder aktiv...\nsudo -u www-data php occ maintenance:mode --off\necho Sicherung abgeschlossen<\/pre>\n\n\n\n<p>Was noch zu erw\u00e4hnen w\u00e4re: Mein Skript ist wirklich nur sehr simpel gehalten. Es finden keinerlei Fehlerbehandlungen statt. Es ist ganz nett f\u00fcr den Einstieg, sollte aber in professionellen Umgebungen mit kritischeren Daten definitiv erweitert werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine Nextcloud ist eine sch\u00f6ne Sache. Aber was wenn ein Benutzer ausversehen Daten l\u00f6scht oder bei einem Update etwas verherrend schief l\u00e4uft?Aus solchen Gr\u00fcnden erstellt man Backups.Das wollen wir mit diesem Blogeintrag auch einmal gemeinsam machen und das m\u00f6glichst automatisch.Ziel des Backupskripts wird es sein die Cloud in einen sauberen&#8230; <a href=\"https:\/\/jet0jlh.de\/?p=291\">Read more &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[26,27],"class_list":["post-291","post","type-post","status-publish","format-standard","hentry","category-nextcloud","tag-backup","tag-script"],"_links":{"self":[{"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/posts\/291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=291"}],"version-history":[{"count":8,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/posts\/291\/revisions"}],"predecessor-version":[{"id":435,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=\/wp\/v2\/posts\/291\/revisions\/435"}],"wp:attachment":[{"href":"https:\/\/jet0jlh.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jet0jlh.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}