Sauvegarde / restauration
##########################

.. note:: La sauvegarde des bases de métadonnées MongoDB et Elasticsearch, ainsi que la restauration de leur contenu en cohérence avec les offres sous-jacentes, est déjà gérée par les mécanismes intrinsèques à la solution :term:`VITAM`, cf. le :term:`DAT`, chapitre **reconstruction**. Il est toutefois recommandé de réaliser des sauvegardes lors d'événements d'exploitation, tel que l'upgrade de la plateforme, ou de manière régulière, lorsque le volume de données en base est important, et ce, afin d'éviter un processus de reconstruction trop long.

.. warning:: Cette méthode s'applique uniquement pour des déploiements de petite taille et n'est pas recommandée pour un usage en production dont le volume de données géré est important (plusieurs centaines de millions d'AU).

Les procédures sont issues des documentations officielles :

* mongoDB : https://docs.mongodb.com/manual/tutorial/backup-and-restore-tools/
* elasticsearch : https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html

Sauvegarde
==========

.. note:: Pour que cette sauvegarde soit fonctionnellement correcte, il faut que la solution logicielle :term:`VITAM` soit dans un état stable et cohérent, sans possibilité de réaliser des versements et sans travail de fond (jobs de sécurisation, ...). Il est recommandé de l'exécuter lorsque les services client des bases sont éteints. Pour une sauvegarde à chaud, se référer à la documentation officielle afin de disposer de l'ensemble de la procédure sécurisée.

mongoDB
--------

La commande suivante est à lancer depuis une machine hébergeant le composant ``vitam-mongod`` dans le cas d'un serveur standalone ou ``vitam-mongos`` dans le cas d'un cluster shardé. Il est aussi possible de l'exécuter pour chaque shard, en considérant le serveur primary comme un serveur standalone, autrement dit depuis un composant ``vitam-mongod`` de chaque shard.
La commande est à lancer pour le mongo data ET pour chaque mongo offer de :term:`VITAM` :

    mongodump --host mongodb.example.net --port 27017 --out /data/backup/ --username vitamdb-admin --password "pass" --gzip

.. note:: Vérifier que l'espace disponible dans le répertoire de sauvegarde (défini par ``--out``) est cohérent au volume de données à sauvegarder (compressé)

.. note:: Se reporter au fichier ``deployment/environments/group_vars/all/main/vault-vitam.yml`` de l'ansiblerie de déploiement pour le mot de passe ``vitamdb-admin``

Rapatrier sur un serveur approprié le produit généré dans la valeur de ``--out``.

Pour rappel, il y a un cluster mongo de "data", ainsi qu'un cluster mongo "offer" associé à chaque offre. Pour un système cohérent, il faut effectuer la sauvegarde de chacun de ces *clusters*.

Elasticsearch
-------------

La commande suivante est à lancer depuis une machine elasticsearch de :term:`VITAM` ayant un espace suffisant dans le répertoire de sauvegarde :

    curl -X PUT http://elasticsearch-data.service.${consul_domain}:9200/_snapshot/vitam_backup -d '{ "type": "fs", "settings": { "location": "${output_dir}" } }'

Cette étape va créer le *repository* **vitam_backup** de sauvegarde, l'arborescence étant définie par ``${output_dir}``.


Pour vérifier l'état du *repository* **vitam_backup** sur les noeuds du cluster ::

    curl -X POST http://elasticsearch-data.service.${consul_domain}:9200/_snapshot/vitam_backup/_verify

Pour lancer un *snapshot* (dans l'exemple, appelé snapshot_1) ::

    curl -X PUT http://elasticsearch-data.service.${consul_domain}:9200/_snapshot/vitam_backup/snapshot_1?wait_for_completion=true

.. note:: la commande ne rendra la main qu'à la fin de la procédure de *snapshot*.

A l'issue de la sauvegarde, procéder à une recopie de ``${output_dir}`` sur un serveur à part.

Restauration
=============

.. note:: Comme pour la sauvegarde, la restauration ne peut s'effectuer que sur un environnement :term:`VITAM` stable et cohérent, sans possibilité de réaliser des versements et sans travail de fond (jobs de sécurisation, ...). De plus, le contenu restauré doit être cohérent avec le contenu des offres de stockage sous-jacentes.

mongoDB
----------

Il faut d'abord procéder au rapatriement dans ``${output_dir}`` de la sauvegarde à appliquer.

.. warning:: une sauvegarde ne peut se restaurer que sur un environnement dans la même version.

La commande suivante est à lancer depuis une machine mongo de :term:`VITAM` possédant le répertoire de sauvegarde à restaurer vers le serveur mongod ou mongos (selon le cas sélectionné à l'import et en rapport à la présence d'un serveur standalone ou d'un cluster shardé) :

    mongorestore --host mongodb1.example.net --port 27017 --username vitamdb-admin --password 'pass' ${output_dir}/${fichier} --gzip

.. note:: Se reporter au fichier ``deployment/environments/group_vars/all/main/vault-vitam.yml`` de l'ansiblerie de déploiement pour le mot de passe ``vitamdb-admin``

Elasticsearch
-------------
Il faut d'abord procéder au rapatriement dans ``${output_dir}`` de la sauvegarde à appliquer.

Commande pour lister les *snapshots* de **vitam_backup** (repository) ::

    curl -X GET http://elasticsearch-data.service.${consul_domain}:9200/_snapshot/vitam_backup/

Pour lancer une restauration, placer le nom du *snapshot* à la place de \*snapshot\* dans l'URL suivante ::

    curl -X POST http://elasticsearch-data.service.${consul_domain}:9200/_snapshot/vitam_backup/*snapshot*/_restore

.. _backupidentity:

Cas de la base mongo certificates
==================================

La solution logicielle :term:`VITAM` fournit un playbook de sauvegarde de la base de données ``identity`` ; le `backup` réalisé est stocké sur la machine de déploiement.

Pour lancer le playbook de sauvegarde ::

   ansible-playbook ansible-vitam-exploitation/backup_database_certificates.yml -i environments/hosts.<environnement> --ask-vault-pass

.. note:: Il est recommandé de procéder à une sauvegarde régulière de la collection **identity**, ou suite à des modifications sur les certificats (ajout / mise à jour / révocation).
