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
Edit /etc/passwd and replace www-data’s shell with /bin/bash rather than /usr/sbin/nologin.
Edit /etc/passwd again and replace www-data’s home directory with /home/www-data rather than /var/www (optional, but appealing to me).
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.
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).
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.
É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.
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.
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.
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 ?