Backups mit rsync und cron auf einen anderen Server kopieren

I have a backup server that coordinates backups across many servers. I want my backup server to grab Discourse backups from my forum’s server.

I gave some thought to how I’d allow the backup server to access the backup files on the forum’s server. The best way I could come up with is allowing remote access as the www-data user (who owns Discourse’s backups).

I didn’t want to allow the backup server to shell into the forum’s server as root (for standard sysadmin reasons). I also wanted to avoid doing anything that I thought could cause Discourse to choke during backups or restores. I also wanted to avoid hosting another service on forum server.

Anyways, here’s how I did it.

Allow remote access as the www-data user

  1. Edit /etc/passwd and replace www-data’s shell with /bin/bash rather than /usr/sbin/nologin.
  2. Edit /etc/passwd again and replace www-data’s home directory with /home/www-data rather than /var/www (optional, but appealing to me).
  3. Add the backup server’s SSH key to /home/www-data/.ssh/authorized_keys.

rsync

Finally, on the backup server, I added an hourly cron command that ran the following script:

#!/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 will have rsync ignore any backups that have already been
# copied.
# --delay-updates ensures that only complete backups ever make it into $DIR. If
# this isn't specified, partial backups could end up in $DIR, and because
# --ignore-existing won't perform any kind of equality check, the problem will
# not be corrected or detected.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

Hopefully this proves useful to someone out there.

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“