Problèmes de restauration

Basé sur le dépôt discourse_docker, j’ai écrit un petit script pour automatiser son utilisation dans une machine Vagrant (exécutez avec set -x pour voir ce qui est réellement fait)

Est-ce que j’ai copié la sauvegarde au mauvais endroit ?

Et que signifie la ligne de journal
Vérification que /var/www/discourse/tmp/restores/default/2020-05-13-190832 existe... ?

~/infra/discourse sur  master! ⌚ 21:14:07
$ pwd
/home/pihentagy/infra/discourse
~/infra/discourse sur  master! ⌚ 21:01:14
$ ./wl.sh start
+ set -e
+ VAGRANT_MACHINE_NAME=guest
+ cd discourse
+ case "$1" in
+ init
+ printf 'Vérification et mise à jour du dépôt…\n'
Vérification et mise à jour du dépôt…
+ cd ..
+ git clone https://github.com/discourse/discourse_docker.git discourse
fatal: le chemin de destination 'discourse' existe déjà et n'est pas un répertoire vide.
+ printf 'Dépôt déjà présent\n'
Dépôt déjà présent
+ cd discourse
+ printf 'Mise à jour du dépôt…\n'
Mise à jour du dépôt…
+ git pull -r
remote: Énumération des objets : 6, terminé.
remote: Comptage des objets : 100% (6/6), terminé.
remote: Compression des objets : 100% (4/4), terminé.
remote: Total 6 (delta 2), réutilisé 5 (delta 2), pack non réutilisé 0
Décompression des objets : 100% (6/6), terminé.
De https://github.com/discourse/discourse_docker
   3e465a2..49ed141  master     -> origin/master
Autostash créé : 36aae80
HEAD est maintenant sur 3e465a2 Supprimer toutes les traces pg12 pour éviter la confusion de pg_wrapper
Tout d'abord, retour à la tête pour rejouer votre travail par-dessus...
Avancement rapide de master vers 49ed14152971f7f4a7437657987952be44c33c0a.
L'application de l'autostash a entraîné des conflits.
Vos modifications sont sécurisées dans le stash.
Vous pouvez exécuter "git stash pop" ou "git stash drop" à tout moment.
+ printf 'Copie du fichier de configuration…\n'
Copie du fichier de configuration…
+ cp ../resources/discourse.yml containers/
+ echo 'Démarrage de la machine Vagrant...'
Démarrage de la machine Vagrant...
+ vagrant up
Mise en service de la machine 'dockerhost' avec le fournisseur 'virtualbox'...
===> dockerhost: Vérification si la boîte 'ubuntu/xenial64' est à jour...
===> dockerhost: La machine est déjà approvisionnée. Exécutez `vagrant provision` ou utilisez le flag `--provision`
===> dockerhost: pour forcer l'approvisionnement. Les provisionneurs marqués pour toujours s'exécuter continueront de le faire.
+ vagrant ssh -c 'cd /vagrant;sudo ./launcher start discourse'
2627afdfbaac
Rien à faire, votre conteneur a déjà démarré !
Connexion à 127.0.0.1 fermée.
+ exit 0

~/infra/discourse sur  master! ⌚ 21:07:56
$ ./wl.sh restore /home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz
+ set -e
+ VAGRANT_MACHINE_NAME=guest
+ cd discourse
+ case "$1" in
+ shift
+ backup=/home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz
+ discourse_backup_dir=shared/standalone/backups/default
+ mkdir --parents shared/standalone/backups/default
+ rsync -P --verbose /home/pihentagy/infra/icontest-2020-05-12-033823-v20200506044956.tar.gz shared/standalone/backups/default
icontest-2020-05-12-033823-v20200506044956.tar.gz
    390,774,609 100%  317.41Mo/s    0:00:01 (xfr#1, to-chk=0/1)

envoyé 390,870,133 octets reçu 35 octets 156,348,067.20 octets/seconde
total de la taille 390,774,609  accélération de 1.00
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse enable_restore'
La restauration est désormais autorisée. Désactivez-la avec `disable_restore`
Connexion à 127.0.0.1 fermée.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore'
Vous devez fournir un nom de fichier à restaurer. Voulez-vous dire l'un des suivants ?

Connexion à 127.0.0.1 fermée.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore icontest-2020-05-12-033823-v20200506044956.tar.gz'
Démarrage de la restauration : icontest-2020-05-12-033823-v20200506044956.tar.gz
[DÉBUTÉ]
'system' a lancé la restauration !
Marquage de la restauration comme en cours...
Vérification que /var/www/discourse/tmp/restores/default/2020-05-13-190832 existe...
Copie de l'archive vers le répertoire temporaire...
EXCEPTION : lib/discourse.rb:90:in `exec': Échec de la copie de l'archive vers le répertoire temporaire.
cp: impossible de stat '/var/www/discourse/public/backups/default/icontest-2020-05-12-033823-v20200506044956.tar.gz' : Aucun fichier ou répertoire de ce type
lib/discourse.rb:100:in `execute_command'
lib/discourse.rb:90:in `exec'
lib/discourse.rb:40:in `execute_command'
/var/www/discourse/lib/backup_restore/local_backup_store.rb:42:in `download_file'
/var/www/discourse/lib/backup_restore/backup_file_handler.rb:61:in `copy_archive_to_tmp_directory'
/var/www/discourse/lib/backup_restore/backup_file_handler.rb:21:in `decompress'
/var/www/discourse/lib/backup_restore/restorer.rb:42:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tentative de retour en arrière...
Aucun besoin de retour en arrière
Nettoyage...
Suppression du répertoire temporaire '/var/www/discourse/tmp/restores/default/2020-05-13-190832'...
Reprise de sidekiq...
Marquage de la restauration comme terminée...
Notification à 'system' de la fin de la restauration...
Terminé !
[ÉCHOUÉ]
Restauration terminée.
Connexion à 127.0.0.1 fermée.

vagrant n’est pas pris en charge, mais voici tout de même quelques conseils. :wink:

Je ne suis pas sûr de savoir comment fonctionne rsync. Le chemin doit-il se terminer par une barre oblique ? Si le fichier se retrouve dans le bon répertoire, assurez-vous que le fichier copié est lisible par le serveur.

4 « J'aime »

Donc, est-ce que vagrant (virtualbox) peut causer certains problèmes ?

~/infra/discourse on  master! ⌚ 23:22:23
$ tree discourse/shared 
discourse/shared
└── standalone
    └── backups
        └── default
            └── icontest-2020-05-12-033823-v20200506044956.tar.gz

3 répertoires, 1 fichier

~/infra/discourse on  master! ⌚ 23:22:27
$ ls discourse/shared/standalone/backups/default 
icontest-2020-05-12-033823-v20200506044956.tar.gz

~/infra/discourse on  master! ⌚ 23:22:36
$ ls -l discourse/shared/standalone/backups/default
total 381620
-rw-r--r-- 1 pihentagy pihentagy 390774609 May 13 21:08 icontest-2020-05-12-033823-v20200506044956.tar.gz

Il semble que le fichier soit lisible par tous et qu’il se trouve au bon endroit. Depuis l’intérieur du conteneur Docker discourse, où devrais-je voir la sauvegarde ? Mon script de restauration automatique est-il correct ou dois-je copier le fichier à l’intérieur du conteneur Docker ? Si oui, où ? (Peut-être y a-t-il des guides sur la façon d’automatiser Discourse depuis l’extérieur [de Docker] ?)

+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore'
Vous devez fournir un nom de fichier à restaurer. Voulez-vous dire l'un des suivants ?

Connection to 127.0.0.1 closed.
+ vagrant ssh -c 'sudo docker exec -w /var/www/discourse -i discourse discourse restore icontest-2020-05-12-033823-v20200506044956.tar.gz'
Démarrage de la restauration : icontest-2020-05-12-033823-v20200506044956.tar.gz
[

Ce n’est pas obligatoire, mais ne pas terminer le chemin par une barre oblique est une mauvaise pratique, car le résultat dépend du fait que le répertoire existe déjà ou non.

Si le répertoire de destination existe déjà, une barre oblique n’est pas nécessaire et le fichier est copié à l’intérieur de ce répertoire.
Si le répertoire de destination n’existe pas et qu’il n’y a pas de barre oblique à la fin, le fichier est copié sous le nom ‘default’.
Si le répertoire de destination n’existe pas et qu’il y a une barre oblique à la fin, le répertoire est créé et le fichier est copié à l’intérieur.

Dans ce cas, la copie semble réussir (par chance).

Cependant,

Puisqu’aucune suggestion n’apparaît après « Voulez-vous dire l’un des éléments suivants ? », le fichier n’est pas au bon endroit. Il semble que les lecteurs soient mappés incorrectement dans le conteneur Docker.

Vous pouvez lancer une sauvegarde depuis l’intérieur de Docker (discourse backup) et vérifier où elle se trouve sur votre système de fichiers hôte.

3 « J'aime »

Étrangement, elle n’est pas visible depuis le système de fichiers hôte. Est-ce normal ?

vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse backup
Démarrage de la sauvegarde...
[COMMENCÉ]
'system' a lancé la sauvegarde !
Marquage de la sauvegarde comme en cours...
Vérification de l'existence de '/var/www/discourse/tmp/backups/default/2020-05-14-121930'...
Vérification de l'existence de '/var/www/discourse/public/backups/default'...
Mise à jour des métadonnées...
Mise en pause de sidekiq...
Attente de la fin des tâches en cours par sidekiq...
Vidage du schéma public de la base de données...


Beaucoup de choses liées à pg_dump

Reprise de sidekiq...
Finalisation de la sauvegarde...
Création de l'archive : discourse-2020-05-14-121930-v20200512064023.tar.gz
Vérification que l'archive n'existe pas déjà...
Création d'une archive vide...
Archivage du vidage des données...
Archivage des fichiers uploadés...
Suppression du répertoire temporaire '/var/www/discourse/tmp/backups/default/2020-05-14-121930'...
Compression gzip de l'archive, cela peut prendre un certain temps...
Exécution du crochet after_create_hook pour la sauvegarde...
Suppression des anciennes sauvegardes...
Nettoyage...
Suppression des restes '.tar'...
Marquage de la sauvegarde comme terminée...
Actualisation des statistiques du disque...
Terminé !
[SUCCÈS]
Sauvegarde effectuée.
Le fichier de sortie se trouve dans : /var/www/discourse/public/backups/default/discourse-2020-05-14-121930-v20200512064023.tar.gz

vagrant@ubuntu-xenial:~$ find / -name discourse-2020-05-14-121930-v20200512064023.tar.gz 2>/dev/null
vagrant@ubuntu-xenial:~$ sudo docer exec -w /var/www/discourse -i discourse discourse enable_restore
sudo: docer: commande introuvable
vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse enable_restore
La restauration est maintenant autorisée. Désactivez-la avec `disable_restore`
vagrant@ubuntu-xenial:~$ sudo docker exec -w /var/www/discourse -i discourse discourse restore
Vous devez fournir un nom de fichier à restaurer. Voulez-vous dire l'un des suivants ?

discourse restore discourse-2020-05-14-121930-v20200512064023.tar.gz
discourse restore discourse-2020-05-14-121710-v20200512064023.tar.gz
discourse restore discourse-2020-05-14-120436-v20200512064023.tar.gz

Hors sujet : y a-t-il un moyen de surligner des lignes dans les blocs de code ?

```bash

Le défaut ici est le texte. Je pense que le défaut pour les nouvelles installations est « deviner le langage »,

Je voulais dire : « Regardez, la ligne 5 est importante ! », donc en gros, mettre en évidence une ou plusieurs lignes spécifiques.

En général, /var/discourse/shared/standalone/backups est le répertoire qui est visible dans votre conteneur sous le chemin /var/www/discourse/public/backups (d’où le mot shared). Votre commande rsync place la sauvegarde dans ce répertoire afin de la rendre accessible depuis l’intérieur du conteneur.

À l’inverse, si le conteneur écrit dans public/backups, cela devrait être visible sur votre hôte dans le répertoire partagé.

J’ai écrit /var/discourse/shared.... ci-dessus. Mais il semble que vous travailliez dans ~/infra/discourse, donc vous copiez vers ~/infra/discourse/shared/standalone/backups/default.

Habituellement, le conteneur est mappé sur /var/discourse/shared/....

Cela pourrait être le problème. Pouvez-vous vérifier si vous avez un répertoire /var/discourse/shared ?

Non. Vous ne pouvez pas faire cela dans un bloc de code, car tout est présenté à l’identique.

Eh bien, je viens de faire une sauvegarde et de vérifier si elle pouvait être trouvée en dehors de la machine Docker, mais ce n’est pas le cas.

vagrant@ubuntu-xenial:~$ sudo docker inspect -f "{{.Mounts}}" discourse
[{bind  /var/discourse/shared/standalone /shared   true rprivate} {bind  /var/discourse/shared/standalone/log/var-log /var/log   true rprivate}]

C’est vrai, mais je l’ai ignoré pour l’instant. Au fait, ce rsync a été effectué en dehors de la machine (vagrant) où j’ai exécuté mon Discourse.

Mais pour l’instant, comme vous l’avez suggéré, j’ai fait ce qui suit :

  • J’ai fait vagrant ssh pour me connecter à la machine et, de l’intérieur :
    • J’ai effectué une sauvegarde avec sudo docker exec -w /var/www/discourse -i discourse discourse backup
    • J’ai remarqué le chemin du fichier :
      Output file is in: /var/www/discourse/public/backups/default/discourse-2020-05-14-125606-v20200512064023.tar.gz
      
    • J’ai recherché cette fichier spécifique sur toute la machine vagrant, mais je n’ai rien trouvé
      find / -name discourse-2020-05-14-125606-v20200512064023.tar.gz 2>/dev/null
      
    • Cependant, si j’entre dans la machine Docker, il est là
      root@ubuntu-xenial-discourse:/var/www/discourse/public/backups/default# ls
      discourse-2020-05-14-120436-v20200512064023.tar.gz  discourse-2020-05-14-121930-v20200512064023.tar.gz
      discourse-2020-05-14-121710-v20200512064023.tar.gz  discourse-2020-05-14-125606-v20200512064023.tar.gz
      

Ma question est donc : si je crée une sauvegarde, devrais-je la voir depuis l’extérieur de Docker ?

En attendant, j’ai simplement créé une machine vagrant et fait un git clone depuis l’intérieur dans le répertoire standard /var/discourse. La seule “bizarrerie” est que j’ai un fichier discourse.yml à l’intérieur du conteneur, et non app.yml.

Oui, et c’est la même chose que votre problème initial :
« si vous avez une sauvegarde en dehors de Docker et que vous la placez dans le répertoire partagé, vous devriez la voir à l’intérieur de Docker » (et vous ne la voyez pas).

Le problème vient de vos répertoires partagés et cela est dû à ceci :

Je voulais dire : pour l’instant, j’ai recréé une nouvelle machine Vagrant, sans copier de sauvegardes précédentes. J’ai effectué le bootstrap et lancé le conteneur Docker. J’ai ensuite réalisé la sauvegarde.

Rien n’est visible dans la machine Vagrant en dehors du conteneur Docker.

Je pense avoir trouvé le problème : j’ai monté ce dossier partagé Docker dans la machine Vagrant parente.

config.vm.synced_folder "discourse/", "/var/discourse"

Si je commente cette ligne dans mon fichier Vagrantfile, les sauvegardes réapparaissent “magiquement”.

Le problème venait donc du fait que le dossier partagé Vagrant (vers le haut) et le dossier partagé Docker (vers le bas) entraient en conflit, rendant le montage invalide.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.