Opérations d'exploitation suite à l'installation sécuriée de eLabFTW
Il y a quelques points nécessaires à abordrer après une installation sécurisée de elabFTW avec MySQL et sur plusieurs machines virtuelles.
Sauvegarde régulière et chiffrée de elabFTW (recommandé)
1.Les pré-requis
Les pré-requis sont : - Borgbackup doit être installé et configuré; - il est recommandé de mettre en place un volume ou montage persistant sécurisé de type NFS ou CIFS.
2.Les objectifs
Les objectifs se situent à plusieurs niveaux :
- Il s'agit de sécuriser et pérenniser les données
- après un incident, il faut pouvoir revenir sur une sauvegarde antérieure;
- il faut s'assurer de la poursuite ou de la reprise de l'activité scientifique.
3.La méthode pour une sauvegarde sécurise
Le plus souvent la sauvegarde est réalisée de façon automatique par un script et par le biais d'un plan de sauvegarde. Il est également possible de faire et de programmer des sauvegardes des machines virtuelles au sein de l'hyperviseur (Proxmox par exemple). La page officielles du site eLabFTW donne aussi quelques explications sur la sauvegarde How to Backup
Il existe plusieurs façons de sauvegarder les données sur votre installation :
- il est possible de faire une archive compressée des répertoires ou des exports des conteneurs Docker et de copier ailleurs;
- le mieux est de faire un mysqldump des bases et d'utiliser Borg pour envoyer sur un filer ou une autre machine virtuelle;
- par exemple, voici le script ci-après: sauvegarde avec mysqldump et la commande Docker pour stocker dans le répertoire /backups_mysql, et avec effacement des fichiers de sauvegarde de plus de 60 jours.
#!/bin/bash
# run by crontab
# m h dom mon dow command
# 23 11 * * * /home/rmsb/Docker/elabftw_cnrs/backup_mysql.sh
cd /home/rmsb/Docker/elabftw_cnrs
# backup all database from mysql elabftw server
docker exec mysql_cnrs_ssl mysqldump --defaults-extra-file=/credentials/mysqldump.cnf --all-databases > backups_mysql/all-databases-$(date +%Y-%m-%d_%H:%M).sql
# delete files older than 2 months
find backups_mysql/all-databases* -mtime +60 -exec rm {} \;
4.Retour et cas concret d'une méthode de sauvegarde sécurisée à l'aide de BORGBACKUP
Le logiciel BorgBackup assure le chiffrement et la déduplication.
- INSTALLER BORGBACKUP DU LA VM DE LA DATABASE
sudo apt install borgbackup
Voici les étapes d'installation ci-après
a) INITIALISATION D'UN DEPOT DE SAUVEGARDE CHIFFRE
- Faire un montage NFS, CIFS ou ISCI avec un espace NAS déporté
/mnt/backup-cle
- Initialiser (mettre une passphrase):
sudo borg init --encryption=repokey-blake2 /mnt/backup-cle/elabftw-db-repo
- Créer 3 dossiers :
sudo mkdir /var/elabftw/mysqldump
sudo mkdir /var/elabftw/olddump
sudo mkdir /root/.borg
- Créer le fichier passphrase
sudo nano /home/root/.borg passphrase la-passphrase
- Commandes utiles : Lister les sauvegardes et les restaurer
sudo borg list /mnt/backup-cle/elabftw-db-repo
sudo borg mount /mnt/backup-cle/elabftw-db-repo.xxx /mnt/restauration
- Créer un fichier d'execution :
Apres vérification du point de montage, ce fichier fait un dump de la database puis le zip, ensuite il le sauvegarde avec borg et le transfert dans /var/elabftw/olddump ou l'on ne conserve que les 60 derniers. A noter que toute les actions sont loggées dans /var/log/borg/elab-db.log
sudo nano /root/elab-db.sh
#!/bin/sh
#
# Script de sauvegarde database
set +e
LOG_PATH=/var/log/borg/elab-db.log
echo ------------------------------------------------------ \>\> \${LOG_PATH}
echo ---------------- Test du fstab ---------------------- \>\> \${LOG_PATH}
echo ------------------------------------------------------ \>\> \${LOG_PATH}
MOUNT_FILER2=/mnt/backup-cle/ne-pas-supprimer.txt
if \[ ! -f \$MOUNT_FILER2 \]; then
echo "\########### ERROR \##############" \>\> \${LOG_PATH}
echo "Impossible de mounter le backup-cle" \>\> \${LOG_PATH}
echo "\###################################" \>\> \${LOG_PATH}
exit 1
fi
echo \>\> \${LOG_PATH}
echo \>\> \${LOG_PATH}
echo ------------------------------------------------ \>\> \${LOG_PATH}
echo --------- New Archive elab-db ------------------ \>\> \${LOG_PATH}
echo ------------------------------------------------ \>\> \${LOG_PATH}
BACKUP_DATE=`date +%Y-%m-%d_%H:%M`
echo \$BACKUP_DATE \>\> ${LOG_PATH}
DUMP_FILE=/var/elabftw/mysqldump/all-databases-${BACKUP_DATE}.sql
echo Dumpfile = \$DUMP_FILE \>\> ${LOG_PATH}
# backup all database from mysql elabftw server
docker exec -it mysql bash -c 'mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --all-databases' \> \$DUMP_FILE
gzip -f --best \$DUMP_FILE
chmod 600 \$DUMP_FILE.gz
D1=/var/elabftw/mysqldump
BORG=/usr/bin/borg
export BORG_PASSPHRASE="`cat ~root/.borg/passphrase`"
BORG_REPOSITORY=/mnt/backup-cle/elabftw-db-repo
BORG_ARCHIVE=${BORG_REPOSITORY}::${BACKUP_DATE}
BORG_SOURCE=\${D1}
echo \$BORG_SOURCE \>\> \${LOG_PATH}
$BORG create \
-v --stats \
$BORG_ARCHIVE\
\$BORG_SOURCE\
\>\> ${LOG_PATH} 2>&1
ERROR=$?
if \[ \$ERROR -ne 0 \]; then
echo "Erreur numero = \$ERROR";
fi
# move old dumpfile
mv \$DUMP_FILE.gz /var/elabftw/olddump
# delete files older than 2 months
find /var/elabftw/olddump/all-databases\* -mtime +60 -exec rm {} ;
echo ---------------Fin -------------------- \>\> \${LOG_PATH}
BACKUP_DATE=`date +%Y-%m-%d_%H:%M`
echo FIN : \$BACKUP_DATE \>\> \${LOG_PATH}
b) CREATION DU FICHIER DE NETTOYAGE DES SAUVEGARDES
Après vérification du point de montage, ce fichier fait le nettoyage des 5 der nière semaines et des 6 derniers mois. A noter que toute les act ions sont loggées dans /var/log/borg/elab-db.log
sudo nano/root/prune-elab-db.sh
#!/bin/sh
#
# Script nettoyage des sauvegardes
set -e
LOG_PATH=/var/log/borg/prune-elab-db.log
echo ------------------------------------------------------ \>\> \${LOG_PATH}
echo ---------------- Test du fstab ---------------------- \>\> \${LOG_PATH}
echo ------------------------------------------------------\>\> \${LOG_PATH}
MOUNT_FILER2=/mnt/backup-cle/ne-pas-supprimer.txt
if \[ ! -f \$MOUNT_FILER2 \]; then
echo "\########### ERROR \##############" \>\> \${LOG_PATH}
echo "Impossible de mounter le backup-cle" \>\> \${LOG_PATH}
echo "\###################################" \>\> \${LOG_PATH}
exit 1
fi
echo \>\> \${LOG_PATH}
echo \>\> \${LOG_PATH}
echo ------------------------------------------------ \>\> \${LOG_PATH}
echo -----------Prune elab-db ------------------- \>\> \${LOG_PATH}
echo ------------------------------------------------ \>\> \${LOG_PATH}
BACKUP_DATE=`date +%Y-%m-%d_%H:%M`
echo \$BACKUP_DATE \>\> ${LOG_PATH}
D1=/var/elabftw/mysqldump
BORG=/usr/bin/borg
export BORG_PASSPHRASE="`cat ~root/.borg/passphrase`"
BORG_REPOSITORY=/mnt/backup-cle/elabftw-db-repo
BORG_SOURCE=${D1}
echo \$BORG_SOURCE \>\> \${LOG_PATH}
$BORG prune -v --list \
--keep-weekly=5 \
--keep-monthly=6 \
$BORG_REPOSITORY\
\>\> \${LOG_PATH} 2\>&1
echo ---------------Fin Prune --------------------- \>\> \${LOG_PATH}
BACKUP_DATE=`date +%Y-%m-%d_%H:%M`
echo \$BACKUP_DATE \>\> \${LOG_PATH}
c) AJOUTER A /ETC/CRONTAB
Par exemple, sauvegarde le samedi a 20h30 et le nettoyage le dimanche 20h30
30 20 **7 root /root/.borg/elab-db.sh &\> /dev/null
30 20 **0 root /root/.borg/prune-elab-db.sh &\> /dev/null
- INSTALLER BORGBACKUP DU LA VM DE LA ELABFTW POUR LES UPLOADS
C'est le même principe, je n'indique que les changements.
a) INITIALISATION D'UN DEPOT DE SAUVEGARDE CHIFFRE
Initialiser et mettre une passphase:
sudo borg init --encryption=repokey-blake2 /mnt/backup-cle/elabftwuploads-repo
Créer un fichier d'execution :
Apres verification du point de mountage, ce fichier fait un dump de la database puis le zip, ensuite il le sauvegarde avec borg et le transfert dans /var/elabftw/olddump ou l'on ne conserve que les 60 derniers. A noter que toute les actions sont loggées dans /var/log/borg/ elabuploads.log
Les changements par rapport au precedent
sudo nano /root/elab-uploads.sh
LOG_PATH=/var/log/borg/elab-uploads.log
D1=/var/elabftw/uploads
b) CREATION DU FICHIER DE NETTOYAGE DES SAUVEGARDES
Après vérification du point de montage, ce fichier fait le nettoyage des 5 derniere semaines et des 6 derniers mois. A noter que toute les actions sont loggées dans /var/log/borg/ prune-elabupload.log
Les changements par rapport au précèdent
sudo nano /root/prune-elab-upload.sh
LOG_PATH=/var/log/borg/prune-elab-upload.log
D1=/var/elabftw/uploads
c) AJOUTER A /ETC/CRONTAB
Par exemple, sauvegarde le samedi a 20h30 et le nettoyage le dimanche 30 20 30 20
30 20 **7 root /root/.borg/elab-upload.sh &\> /dev/null
30 20 **0 root /root/.borg/prune-elab-upload.sh &\> /dev/null
Mise à jour de elabFTW (recommandé)
1.Les pré-requis:
- je dispose d'un fichier « docker-compose.yml » basé sur celui d'elabFTW (en général sous /etc/elabftw.yml)
- docker-compose est installé
Je dispose bien d'une sauvegarde de la base ou des dossiers et/ou d'un mysqldump de la base MySQL.
2.Les étapes:
0) faire un backup de la base MySQL avant toute mise à jour !
1) taper la commande: ***docker-compose down*** #pour arrêter et effacer les conteneurs
2) modifier la version de l'image dans le fichier docker-compose.yml (éditer le fichier pour saisir la nouvelle version de l'image elabFTW)
3) exécuter la commande: ***docker-compose up -d*** # pour télécharger la nouvelle image et relancer le conteneur elabFTW
4) éxecuter la commande: ***docker exec -ti elabftw bin/console db:update*** #pour mettre à jour les tables MySQL et dans la bonne version
Mise à jour du script CLEbot (procédure interne au CNRS)
Voir le lien internet de la DOC du CNRS. Guide CNRS
Restauration de elabFTW et de la base de données MySQL, migration (procédure d'urgence et depuis un fichier mysqldump .sql)
Depuis la page web officielle How to restore
1.Les pré-requis:
- le container MySQL doit être démarré;
- il faut disposer du fichier de sauvegarde mysql_dump-YYYY-MM-DD.sql;
- il faut disposer des répertoires images, documents sauvegadés ou récupérés (sous /var/elabftw/web)
2.Les étapes (à réaliser dans un terminal shell linux ou MySQL):
1) ***docker cp mysqlr_dump-YYYY-MM-DD.sql mysql:/i*** # copy it inside the mysql container
2) *** docker exec -it mysql bash*** # spawn a shell in the mysql container
3) ***mysql -uroot -p$MYSQL_ROOT_PASSWORD*** # login to mysql prompt
4) Mysql> ***drop database elabftw;*** # delete the brand new database
5) Mysql> ***create database elabftw character set utf8mb4 collate utf8mb4_0900_ai_ci;*** # create a new one
6) Mysql> ***use elabftw;*** # select it
7) Mysql> ***set names utf8mb4;*** # make sure you import in utf8 (don't do this if you are in latin1)
8) Mysql> ***source mysql_dump-YYYY-MM-DD.sql;*** # import the backup
9) Mysql> ***exit;***
10) ***docker exec -ti elabftw bin/console db:update*** # update the database
11) copier le contenu du répertoire /var/elabftw/web sur votre nouvelle installation. (ce qui permet de retrouver les documents et les images dans l'application et les expériences)
Pour une migration, il faudra migrer l'ancienne base de données MySQL vers la nouvelle installation et penser à faire la configuration pour l'authentification renforcée Janus+ du CNRS. Guide CNRS