Backups mit rsync und cron auf einen anderen Server kopieren

Ich habe einen Backup-Server, der Backups über viele Server hinweg koordiniert. Ich möchte, dass mein Backup-Server Discourse-Backups vom Server meines Forums herunterlädt.

Ich habe darüber nachgedacht, wie ich dem Backup-Server den Zugriff auf die Backup-Dateien auf dem Forumsserver ermöglichen könnte. Der beste Weg, den ich finden konnte, bestand darin, den Remote-Zugriff als Benutzer www-data (der die Discourse-Backups besitzt) zu erlauben.

Ich wollte nicht zulassen, dass der Backup-Server als root auf den Forumsserver shellt (aus üblichen Systemadministrator-Gründen). Außerdem wollte ich nichts tun, was meiner Meinung nach dazu führen könnte, dass Discourse während der Backups oder Wiederherstellungen Probleme bekommt. Zudem wollte ich vermeiden, einen weiteren Dienst auf dem Forumsserver zu hosten.

Hier ist also, wie ich es umgesetzt habe.

Remote-Zugriff als Benutzer www-data erlauben

  1. Bearbeiten Sie /etc/passwd und ersetzen Sie die Shell von www-data durch /bin/bash anstelle von /usr/sbin/nologin.
  2. Bearbeiten Sie /etc/passwd erneut und ersetzen Sie das Home-Verzeichnis von www-data durch /home/www-data anstelle von /var/www (optional, aber für mich ansprechend).
  3. Fügen Sie den SSH-Schlüssel des Backup-Servers zu /home/www-data/.ssh/authorized_keys hinzu.

rsync

Schließlich habe ich auf dem Backup-Server einen stündlichen Cron-Befehl hinzugefügt, der das folgende Skript ausführt:

#!/usr/bin/env bash

set -xe

HOST="$1"
DIR="$2"
if [ -z "$HOST" ] || [ ! -d "$DIR" ]; then
	echo "$0 HOST DIR"
	exit 1
fi

# --ignore-existing lässt rsync alle Backups ignorieren, die bereits
# kopiert wurden.
# --delay-updates stellt sicher, dass nur vollständige Backups in $DIR landen.
# Wenn dies nicht angegeben wird, könnten unvollständige Backups in $DIR landen,
# und da --ignore-existing keine Art von Gleichheitsprüfung durchführt,
# wird das Problem nicht behoben oder erkannt.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

Hoffentlich ist das für jemanden nützlich.

8 „Gefällt mir“

Wow!!
Ich würde es sehr begrüßen, wenn Sie die folgenden Schritte etwas detaillierter erklären würden, damit unerfahrene Benutzer wie ich nichts falsch machen können (und auch verstehen, was jeder Schritt tut).

Was bewirkt das oben Genannte?

Meinen Sie hier den öffentlichen Schlüssel?

1 „Gefällt mir“

Ermöglicht dem www-data-Benutzer die erfolgreiche Anmeldung. Dies ändert die „Login-Shell“, ein gutes Stichwort, nach dem Sie suchen können, um mehr zu erfahren.

Ja. Private Schlüssel sollten (grundsätzlich) niemals außerhalb ihres Host-Rechners kopiert/geteilt werden.

1 „Gefällt mir“

Da Sie eine etwas neue Art von Sucher sind, gibt es vielleicht auch eine einfache Möglichkeit, unser lokales Server-Backup über Cron-Jobs auf verschiedene S3-Buckets zu übertragen, wie z. B. Google S3, iDrive S3?
(Ich weiß, dass wir es direkt für AWS S3-Buckets konfigurieren können, indem wir seinen Schlüssel und sein Geheimnis verwenden).

Wenn Sie S3-Backups konfigurieren, werden diese automatisch nach S3 hochgeladen, obwohl sie entweder alle Uploads oder keine enthalten. Wenn Sie also keine Uploads auf S3 haben, haben Sie mehrere Kopien aller Uploads in den Sicherungsdateien.

2 „Gefällt mir“

Das weiß ich bereits und bis jetzt, seit Beginn vor 6 Jahren, habe ich dieses Setup verwendet (alle Medien und Backups in einen AWS-Bucket hochladen).

Aber ich habe oben nach einem anderen Problem gefragt, mit dem ich konfrontiert bin.
Jetzt habe ich eingerichtet, Backups (die Medien ‘Uploads’ enthalten) auf einem lokalen Ubuntu-Server zu erstellen. Aber (wie in einem anderen Thread besprochen) kann ich diese (1 GB großen) Backups nicht wiederherstellen. Etwas fehlt/verursacht Probleme. Deshalb dachte ich daran, Google Bucket zu verwenden und AWS komplett aufzugeben.

1 „Gefällt mir“

Ich sehe keinen Unterschied zwischen AWS S3 und Google. Aber vielleicht hilft Ihnen https://restic.net/ weiter? Es ist ein Backup-Programm, das Backups in S3-Buckets erstellen kann.

Ich bin mir nicht sicher, was Ihr Wiederherstellungsproblem ist.

2 „Gefällt mir“

Für alle, die wie ich auf diesen Thread stoßen, möchte ich diesen ersten Beitrag des Themas etwas weiter erläutern.

  • Dies ist ein Bash-Skript, das „so wie es ist“ in eine Datei mit beliebigem Namen, aber mit der Erweiterung .sh, kopiert werden kann.
  • Die erste Zeile des Skripts legt lediglich die Umgebung für die Ausführung des Skripts fest, z. B. welche Shell oder Umgebung verwendet werden soll: #!/usr/bin/env bash: Dies weist das System an, den über den Befehl env gefundenen bash-Interpreter zu verwenden.
  • Flags (set -xe):
  • -x: Aktiviert das Debugging, d. h. jeder Befehl und seine Argumente werden vor der Ausführung auf dem Terminal ausgegeben. Dies ist hilfreich beim Debuggen des Skripts.
  • -e: Veranlasst das Skript, sofort beendet zu werden, wenn ein Befehl einen Rückgabewert ungleich Null (der einen Fehler anzeigt) zurückgibt. Dies ist nützlich, um zu verhindern, dass das Skript nach einem Fehler fortgesetzt wird.
  • Und im nächsten wichtigen Schritt, Variablen (HOST="$1" DIR="$2"):
  • HOST="$1": Weist das erste an das Skript übergebene Argument ($1) der Variablen HOST zu. Das bedeutet, wenn dieses Skript ausgeführt wird, fordert es eine Eingabe vom Benutzer an, und welche erste Eingabe ($1) der Benutzer eingibt, wird als Wert für „Host“ (von wo Daten möglicherweise kopiert werden) übergeben/betrachtet.
  • DIR="$2": Weist das zweite an das Skript übergebene Argument ($2) der Variablen DIR zu. D. h., welcher (Verzeichnispfad) auch immer vom Benutzer nach der Eingabe des ersten Werts (genannt „$2“) eingegeben wird, wird vom Skript als „Zielverzeichnis“ übernommen.
    Wenn jemand interessiert ist, kann ich auch die restlichen 2 Schritte erklären, aber es genügt zu sagen, dass der nächste Schritt lediglich prüft, ob der Benutzer die richtigen Host- und Zielverzeichniswerte angibt, wenn er dazu aufgefordert wird. Andernfalls würde (der letzte Schritt) 1 als Fehlerausgabe zurückgeben.
    Das Wichtigste, was ich wiederholen möchte, ist, dass dies ein Skript ist, das bei Ausführung den Benutzer nach dem Host (von dem Daten kopiert werden sollen) und dem Zielverzeichnis (wo die Daten eingefügt werden sollen) fragt. Und Sie würden den Pfad zu dieser Datei in Ihre Cron-Job-Datei aufnehmen, die dieses Skript möglicherweise so oft am Tag ausführt, wie Sie es in der Cron-Datei festlegen.

Aber was ich nicht verstanden habe, ist, wo die eigentlichen Kopier- (oder Backup-) Befehle sind?
Wie erfolgt die eigentliche Synchronisierung?

1 „Gefällt mir“