{"id":386,"date":"2020-09-27T17:02:46","date_gmt":"2020-09-27T15:02:46","guid":{"rendered":"https:\/\/pascal-korz.de\/blog\/?p=386"},"modified":"2020-09-27T17:02:46","modified_gmt":"2020-09-27T15:02:46","slug":"automatische-backups-unter-linux-in-die-cloud-mit-rclone","status":"publish","type":"post","link":"https:\/\/pascal-korz.de\/blog\/2020\/09\/27\/automatische-backups-unter-linux-in-die-cloud-mit-rclone\/","title":{"rendered":"Automatische Backups unter Linux in die Cloud mit rclone"},"content":{"rendered":"\n<p>Wie man regelm\u00e4\u00dfige Backups mit borg auf einen externen Datentr\u00e4ger einrichtet, zeigt der j\u00fcngste Artikel <a rel=\"noreferrer noopener\" href=\"https:\/\/pascal-korz.de\/blog\/2020\/09\/25\/automatische-backups-unter-linux-mit-borg-und-borgmatic\/\" data-type=\"URL\" data-id=\"https:\/\/pascal-korz.de\/blog\/2020\/09\/25\/automatische-backups-unter-linux-mit-borg-und-borgmatic\/\" target=\"_blank\">Automatische Backups unter Linux mit borg und borgmatic<\/a>. Man sollte aber stets auch Sicherungen auf weiteren Ger\u00e4ten und am besten auch an anderen Standorten ablegen. Cloud-Speicher erf\u00fcllt gleich beide Bedingungen.<\/p>\n\n\n\n<p>Zwar kann borg nicht nativ WebDAV oder andere \u00fcbliche Protokolle sprechen, aber man k\u00f6nnte entfernte Dateisysteme zun\u00e4chst mit Zusatzsoftware wie zum Beispiel <code>davfs2<\/code> einh\u00e4ngen und borg so gleich in den Cloud-Speicher schreiben lassen. Deutlich praktischer finde ich allerdings ein Programm, das speziell f\u00fcr das Kopieren in die Cloud entwickelt wurde: <a rel=\"noreferrer noopener\" href=\"https:\/\/rclone.org\/\" data-type=\"URL\" data-id=\"https:\/\/rclone.org\/\" target=\"_blank\">rclone<\/a>.<\/p>\n\n\n\n<p>Mit rclone lassen sich Dateien verschl\u00fcsselt kopieren, synchronisieren und auch wieder entfernen. Die Synchronisation ist bewusst unidirektional: Die entfernten Daten lassen sich also auf den gleichen Stand wie die lokalen Daten bringen, doch umgekehrt werden niemals lokale Daten gel\u00f6scht oder ge\u00e4ndert, wenn die entfernten Daten sich \u00e4ndern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Speicheranbindung an rclone<\/h2>\n\n\n\n<p>Zun\u00e4chst muss rclone zum Beispiel \u00fcber die Paketverwaltung installiert werden. Danach macht man rclone mit dem Remote-Speicher bekannt. Ein einfacher Assistent f\u00fchrt durch die Einrichtung:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rclone config<\/code><\/pre>\n\n\n\n<p>Man wird mit folgenden Optionen begr\u00fc\u00dft:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>No remotes found - make a new one\nn) New remote\ns) Set configuration password\nq) Quit config<\/code><\/pre>\n\n\n\n<p>Um einen neuen Speicher anzubinden, tippt man also <code>n<\/code> und best\u00e4tigt mit Enter. Man wird nach einem beliebigen Namen gefragt, unter dem der Speicher von rclone angesprochen werden soll, zum Beispiel <code>next<\/code> f\u00fcr NextCloud:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name> next<\/code><\/pre>\n\n\n\n<p>Nun muss man anhand einer Nummer den Anbieter oder das Protokoll ausw\u00e4hlen, in diesem Fall WebDAV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>34 \/ Webdav\n   \\ \"webdav\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Storage> 34<\/code><\/pre>\n\n\n\n<p>Ich nehme hier exemplarisch die manuelle Konfiguration vor und werde anschlie\u00dfend nach der Adresse des Speichers gefragt (die Adresse muss nat\u00fcrlich individuell angepasst werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>url> https:\/\/nextcloudserver\/remote.php\/webdav\/<\/code><\/pre>\n\n\n\n<p>Danach wird man nach dem Benutzernamen und dem Kennwort gefragt. Wichtig zu wissen: Die Anmeldeinformationen werden in leicht unkenntlicher Form lokal in der rclone-Konfigurationsdatei <strong>~\/.config\/rclone\/rclone.conf<\/strong> gespeichert, auf welche ausschlie\u00dflich der Besitzer Lese- und Schreibrechte hat. Wem das noch zu unsicher ist, sollte ein Konfigurationskennwort setzen, mit dem der Inhalt der Datei verschl\u00fcsselt wird. Das Kennwort muss dann nat\u00fcrlich gut aufbewahrt und bei jedem rclone-Aufruf eingegeben werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rclone config\ne\/n\/d\/r\/c\/s\/q> s<\/code><\/pre>\n\n\n\n<p>F\u00fcr eine vollkommene Automatisierung kann das ein Hindernis sein, weshalb ich diesen Schritt nur der Vollst\u00e4ndigkeit halber beschreibe. Im Folgenden gehe ich davon aus, dass kein Konfigurationskennwort gesetzt ist.<\/p>\n\n\n\n<p>Mit einem initialen Copy-Befehl kann man sich davon \u00fcberzeugen, dass rclone auf den Speicher zugreifen kann. Dabei wird der eingangs gew\u00e4hlte Name f\u00fcr den Speicher als Identifikator genutzt. In diesem Beispiel kopiere ich das bereits verschl\u00fcsselte borg-Repository <strong>\/mnt\/backups<\/strong> in den Ordner Backups in der Cloud:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rclone copy \/mnt\/backups next:Backups<\/code><\/pre>\n\n\n\n<p>In der Cloud sollten sich nun die Dateien wiederfinden. Um nicht nur zu kopieren, sondern Richtung Cloud zu synchronisieren, tauscht man einfach den Befehl <code>clone<\/code> gegen <code>sync<\/code> aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rclone sync \/mnt\/backups next:Backups<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Geplante Aufgaben mit systemd<\/h2>\n\n\n\n<p>Genau wie im Artikel \u00fcber borg m\u00f6chte ich diesen Befehl nicht selber ausf\u00fchren m\u00fcssen, sondern die Synchronisation t\u00e4glich zum Beispiel um 21 Uhr beginnen. Dazu greife ich erneut auf systemd zur\u00fcck und erstelle nach dem gleichen Muster einen Timer und einen Service. Diesmal gehe ich aber davon aus, in Zukunft noch weitere Cloud-Speicher an denselben Timer binden zu wollen, weshalb ich den eigentlichen rclone-Befehl in einen zweiten Service verschiebe, der von dem ersten Service abh\u00e4ngt. So ist das System flexibel und anschlussf\u00e4hig f\u00fcr weitere zuk\u00fcnftige rclone-Ziele.<\/p>\n\n\n\n<p>Die erste Datei f\u00fcr den Timer <strong>~\/.config\/systemd\/user\/rclone-daily.timer<\/strong> sieht wie folgt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Run daily rclone syncs\n\n&#91;Timer]\nOnCalendar=*-*-* 21:00\nPersistent=true\n\n&#91;Install]\nWantedBy=default.target<\/code><\/pre>\n\n\n\n<p>Der dazugeh\u00f6rige Service <strong>~\/.config\/systemd\/user\/rclone-daily.service<\/strong> hat folgenden Inhalt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=rclone sync\nWants=network-online.target\nAfter=network-online.target\nConditionACPower=true\n\n&#91;Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=\/bin\/true<\/code><\/pre>\n\n\n\n<p>Im Abschnitt <code>[Unit]<\/code> mache ich den Start des Service von einer aktiven Netzwerkverbindung und von einem angeschlossenen Netzteil abh\u00e4ngig. Unter <code>[Service]<\/code> nutze ich <code>\/bin\/true<\/code> als Dummy-Programm, das ausgef\u00fchrt wird, weil ich eine <code>ExecStart<\/code>-Zeile ben\u00f6tige. Die Magie steckt in <code>RemainAfterExit=yes<\/code>, weil der Service so noch aktiv und f\u00fcr die davon abh\u00e4ngigen Services verf\u00fcgbar bleibt.<\/p>\n\n\n\n<p>Die dritte Unit-Datei <strong>~\/.config\/systemd\/user\/rclone-backups-to-nextcloud.service<\/strong> f\u00fchrt schlie\u00dflich die rclone-Synchronisierung aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=rclone sync backups to cloud\nPartOf=rclone-daily.service\nAfter=rclone-daily.service\nConditionPathIsMountPoint=\/mnt\/backups\n\n&#91;Service]\nRestart=no\nExecStart=rclone sync \/mnt\/backups next:Backups\n\n&#91;Install]\nWantedBy=rclone-daily.service<\/code><\/pre>\n\n\n\n<p>Nicht nur klinkt sich der Service mit <code>WantedBy<\/code> als Abh\u00e4ngigkeit bei rclone-daily.service ein, er macht sich mit <code>PartOf<\/code> auch zum Teil dieses Services und wird automatisch gestoppt oder neugestartet, wenn rclone-daily.service gestoppt bzw. neugestartet wird. Und nat\u00fcrlich soll der Service nur laufen, wenn der als Quelle definerte externe Datentr\u00e4ger <strong>\/mnt\/backups <\/strong>eingeh\u00e4ngt ist.<\/p>\n\n\n\n<p>Genau wie dieser letzte Service k\u00f6nnten auch weitere rclone-Jobs angelegt werden, die dann ebenfalls vom Timer mitgestartet w\u00fcrden.<\/p>\n\n\n\n<p>Schlie\u00dflich m\u00fcssen die Units nat\u00fcrlich noch aktiviert werden, damit sie bei der n\u00e4chsten Anmeldung gestartet werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl --user enable rclone-daily.timer rclone-daily.service rclone-backups-to-nextcloud.service<\/code><\/pre>\n\n\n\n<p>Ich hoffe, hier waren wieder ein paar n\u00fctzliche Informationen zur Automatisierung von Backups dabei!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie man regelm\u00e4\u00dfige Backups mit borg auf einen externen Datentr\u00e4ger einrichtet, zeigt der j\u00fcngste Artikel Automatische Backups unter Linux mit borg und borgmatic. Man sollte aber stets auch Sicherungen auf weiteren Ger\u00e4ten und am besten auch an anderen Standorten ablegen. Cloud-Speicher erf\u00fcllt gleich beide Bedingungen. Zwar kann borg nicht nativ WebDAV oder andere \u00fcbliche Protokolle&hellip; <a class=\"more-link\" href=\"https:\/\/pascal-korz.de\/blog\/2020\/09\/27\/automatische-backups-unter-linux-in-die-cloud-mit-rclone\/\"><span class=\"screen-reader-text\">Automatische Backups unter Linux in die Cloud mit rclone<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":6,"featured_media":284,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,8],"tags":[],"class_list":["post-386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backups","category-linux","entry"],"_links":{"self":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/comments?post=386"}],"version-history":[{"count":2,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/386\/revisions"}],"predecessor-version":[{"id":389,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/posts\/386\/revisions\/389"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media\/284"}],"wp:attachment":[{"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/media?parent=386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/categories?post=386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pascal-korz.de\/blog\/wp-json\/wp\/v2\/tags?post=386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}