Copier les sauvegardes vers un autre serveur avec rsync et cron

J’ai un serveur de sauvegarde qui coordonne les sauvegardes sur de nombreux serveurs. Je souhaite que mon serveur de sauvegarde récupère les sauvegardes de Discourse depuis le serveur de mon forum.

J’ai réfléchi à la manière d’autoriser le serveur de sauvegarde à accéder aux fichiers de sauvegarde sur le serveur du forum. La meilleure solution que j’ai trouvée consiste à autoriser l’accès distant en tant que l’utilisateur www-data (qui possède les sauvegardes de Discourse).

Je ne voulais pas permettre au serveur de sauvegarde de se connecter en shell sur le serveur du forum en tant que root (pour des raisons administratives classiques). Je voulais également éviter de faire quoi que ce soit qui pourrait perturber Discourse pendant les sauvegardes ou les restaurations. Enfin, je souhaitais éviter d’héberger un autre service sur le serveur du forum.

Voici comment j’ai procédé.

Autoriser l’accès distant en tant que l’utilisateur www-data

  1. Éditez /etc/passwd et remplacez le shell de www-data par /bin/bash au lieu de /usr/sbin/nologin.
  2. Éditez à nouveau /etc/passwd et remplacez le répertoire personnel de www-data par /home/www-data au lieu de /var/www (facultatif, mais cela m’a semblé plus logique).
  3. Ajoutez la clé SSH du serveur de sauvegarde à /home/www-data/.ssh/authorized_keys.

rsync

Enfin, sur le serveur de sauvegarde, j’ai ajouté une tâche cron horaire exécutant le script suivant :

#!/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 fera en sorte que rsync ignore toutes les sauvegardes déjà
# copiées.
# --delay-updates garantit que seules des sauvegardes complètes sont placées dans $DIR. Si
# cette option n'est pas spécifiée, des sauvegardes partielles pourraient se retrouver dans $DIR, et comme
# --ignore-existing n'effectue aucun type de vérification d'égalité, le problème ne sera
# ni corrigé ni détecté.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

J’espère que cela s’avérera utile pour quelqu’un.

8 « J'aime »

Wow !!
Bien que j’apprécierais beaucoup plus si vous aviez expliqué les étapes ci-dessous un peu plus en détail afin que les utilisateurs novices comme moi ne puissent rien faire de mal (et aient également une idée de ce que fait chaque étape).

Qu’est-ce que cela fait ?

Voulez-vous dire la clé publique ici ?

1 « J'aime »

Permet à l’utilisateur www-data de se connecter avec succès. Cela modifie le « shell de connexion », ce qui est un bon mot-clé pour rechercher et en apprendre davantage.

Oui. Les clés privées ne devraient (en gros) jamais être copiées/partagées en dehors de leur machine hôte.

1 « J'aime »

Étant donné que vous êtes une personne un peu nouvelle dans la recherche, existe-t-il un moyen simple de transférer notre sauvegarde de serveur local vers différents buckets S3, comme Google S3, iDrive S3, via des cron jobs ?
(Je sais que nous pouvons le configurer directement pour un bucket S3 AWS en utilisant sa clé et son secret).

Si vous configurez des sauvegardes S3, elles sont automatiquement téléchargées sur S3, bien qu’elles contiennent soit toutes les téléchargements, soit aucun. Ainsi, à moins que vous n’ayez des téléchargements sur S3, vous avez plusieurs copies de tous les téléchargements dans les fichiers de sauvegarde.

2 « J'aime »

Je le sais déjà et jusqu’à présent, depuis 6 ans, j’utilisais cette configuration (téléchargement de tous les médias et sauvegardes dans un bucket AWS).

Mais je posais la question ci-dessus pour un problème différent auquel je suis confronté.
Maintenant, j’ai configuré la création de sauvegardes (qui incluent les médias ‘Uploads’) sur un serveur Ubuntu local. Mais (comme discuté dans un autre fil de discussion), je ne parviens pas à restaurer ces sauvegardes (de 1 Go). Il manque quelque chose / il y a un problème. Je pensais donc utiliser un bucket Google et abandonner complètement AWS.

1 « J'aime »

Je ne vois pas la différence entre AWS S3 et ceux de Google. Mais peut-être que https://restic.net/ pourra vous aider ? C’est un programme de sauvegarde qui peut sauvegarder dans des buckets S3.

Je ne suis pas sûr de quel est votre problème de restauration.

2 « J'aime »

Pour ceux qui arrivent sur ce fil comme moi, j’aimerais expliquer un peu plus en détail ce premier message du sujet.

  • Il s’agit d’un script bash, qui peut être copié tel quel dans un fichier nommé n’importe comment, mais avec l’extension .sh.
  • La première ligne du script définit simplement l’environnement d’exécution du script, quant au shell ou à l’environnement à utiliser : #!/usr/bin/env bash : Ceci indique au système d’utiliser l’interpréteur bash trouvé via la commande env.
  • Indicateurs (set -xe) :
    • -x : Active le débogage, ce qui signifie que chaque commande et ses arguments seront imprimés dans le terminal avant d’être exécutés. Ceci est utile pour le débogage du script.
    • -e : Provoque la sortie immédiate du script si une commande retourne un statut non nul (indiquant une erreur). Ceci est utile pour empêcher le script de continuer après un échec.
  • Et dans la prochaine étape importante, Variables (HOST="$1" DIR="$2") :
    • HOST="$1" : Assigne le premier argument passé au script ($1) à la variable HOST. C’est-à-dire que lorsque ce script est exécuté, il demandera une entrée à l’utilisateur, et quelle que soit la première entrée ($1) saisie par l’utilisateur, elle sera passée/considérée comme la valeur ‘Host’ (d’où les données seront peut-être copiées).
    • DIR="$2" : Assigne le deuxième argument passé au script ($2) à la variable DIR. Autrement dit, quel que soit le chemin du répertoire ($2) saisi par l’utilisateur après avoir saisi la première valeur, le script le considérera comme le ‘Dir- répertoire cible’.
      Si quelqu’un est intéressé, je peux expliquer les 2 étapes restantes également, mais il suffit de dire que l’étape suivante vérifie simplement que l’utilisateur fournit les bonnes valeurs d’hôte et de répertoire cible lorsqu’il y est invité. Sinon (dernière étape), il retournerait 1 comme sortie d’erreur.
      La chose principale que je voudrais répéter est qu’il s’agit d’un script qui, lorsqu’il est exécuté, demandera à l’utilisateur l’hôte (d’où les données doivent être copiées) et le répertoire cible (où les données doivent être collées). Et vous incluriez le chemin vers ce fichier dans votre fichier cron, qui pourrait exécuter ce fichier script autant de fois par jour que vous le définiriez dans le fichier cron.

Mais ce que je n’ai pas réussi à comprendre, c’est où se trouvent les commandes réelles de copie/collage (ou de sauvegarde) ?
Comment la synchronisation réelle se produira-t-elle ?

1 « J'aime »