[Update 2023] Faire un Backup Total de son Serveur Dédié avec Rsnapshot

Publié par David le

Dans cet article, je noterai

  • Serveur de Sauvegarde : le serveur qui sauvegarde vos données
  • Serveur de Donnée : le serveur usité à sauvegarder

Personnellement, pour le serveur de sauvegarde, j’utilise un vieux ordinateur de récupération avec Lubuntu. J’aimerai bien essayer de le remplacer par mon NAS Synology. Ce sera le sujet d’une mise à jour de ce billet 🙂

J’utilise un disque dur externe pour la sauvegarde de mes serveurs. Je le note /media/<computer>/<hdd_backup>.

Chacun de mes serveurs écoutent sur un port SSH différents, je le note <port_ssh>.

On notera respectivement les ips des serveurs de sauvegarde et de donnée <ip_serveur_sauvegarde> et <ip_serveur_donnee>.

Préparation du disque dur externe

Pour préparer votre disque dur externe, commencer par installer GParted :

sudo apt install gparted

Puis formatter votre disque dur en ext4 et redémarrer votre ordinateur de sauvegarde.

Initialisation du serveur de sauvegarde et du serveur de donnée

Exécuter sur le serveur de sauvegarde et le serveur de donnée.

sudo apt update &&
sudo apt upgrade &&
sudo apt install gedit rsync grsync rsnapshot -y

Exécuter sur le serveur de donnée.

apt install bzip2

Exécuter sur le serveur de sauvegarde.

sudo su
mkdir /media/<computer>/<hdd_backup>/backup
chmod a+rwx /media/<computer>/<hdd_backup>/backup
chmod o-w /media/<computer>/<hdd_backup>/backup
sudo mkdir -p /mnt/backup_test/test_1
sudo mkdir -p /mnt/backup_test/test_2

Test de la connexion SSH à distance

Sur chaque serveur, on réalise le test suivant pour vérifier que rsync est bien installé. Vérifier que votre répertoire /home/ se copie dans /mnt/backup_test/ et annuler la procédure avec CTRL-C.
Exécuter sur le serveur de sauvegarde.

sudo rsync -azv --dry-run /home/ /mnt/backup_test/test_1
sudo rsync -azv -e /home/ /mnt/backup_test/test_1

On réalise le test suivant pour vérifier que l’on puisse copié des clés SSH. Vous devrez entrer votre mot de passe root lors de cette manipulation
Exécuter sur le serveur de sauvegarde.

sudo su backup_user
cd $HOME
mkdir .ssh
chmod 755 .ssh
ssh-keygen -N "" -f /$HOME/.ssh/id_rsa
ssh-copy-id -i /$HOME/.ssh/id_rsa.pub -p <port_ssh> root@<ip_serveur_donnee>
sudo bash
exit

Puis on teste la connexion

ssh user@<ip_serveur_donnee> -p <port_ssh>
exit

Et la synchronisation rsync à distance

sudo rsync -azv -e 'ssh -p <port_ssh>' root@<ip_serveur_donnee>:/home/ /mnt/backup_test/test_1

Configuration du serveur de donnée

Création de l’utilisateur

On se connecte au serveur de donnée et on créé le profil de l’utilisateur backup

sudo adduser backup_user -u 400
sudo mkdir /home/backup_user/.ssh
sudo chmod 700 /home/backup_user/.ssh
sudo mkdir /home/backup_user/bin

Script principal

sudo nano /home/backup_user/bin/rsync-wrapper.sh

Remplir le fichier ouvert avec ce script :

#!/bin/bash

# This script is a wrapper around rsync, so that rsync can run as root,
# and at the same time, eliminate any security risks.

# Location of the Log file
LOG="/home/backup_user/backup.log"

# Place in the log file information concerning the execution of this script
echo "rsync wrapper script executed on `date`" >> $LOG
echo "options passed to rsync: " $@ >> $LOG
echo "---------------------------------------------" >> $LOG

# Now execute the script
/usr/bin/sudo /usr/bin/rsync $@

Script Externes

On créé ensuite les scripts pour sauvegarder les bases de données, les dossier SVN, ect.

Vous pouvez tester les scripts ci-dessous avec la commande :

su - backup_user -c "sh /home/backup_user/bin/<script_name>.sh"

ou

su - backup_user -c ". /home/backup_user/bin/<script_name>.sh"

Script MySQL v1

sudo nano /home/backup_user/bin/backup_mysql_ext.sh

Remplir le fichier ouvert avec ce script, n’oublier de remplacer <mot_de_passe_mysql> par votre mot de passe MySQL :

#!/bin/sh

if [ ! -d "$DIRECTORY" ]; then
        # Control will enter here if $DIRECTORY doesn't exist.
        mkdir -p "/home/backup_user/files/mysql"
fi

# On supprime les fichier vieux de plus de 5 jours
find /home/backup_user/files/mysql -type f -name '*.tar.bz2' -mtime +5 -exec rm {} \;

date_str=$(date +"%Y%m%d_%H%M%S")

# Récupère toutes les bases de données
databases=`mysql --user=root --password=<mot_de_passe_mysql> -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`

for i in $databases; do

echo "saving" $i

## Sauvegarde des bases de donnees en fichiers .sql
mysqldump -uroot -p<mot_de_passe_mysql> ${i} > /home/backup_user/files/mysql/${i}.$date_str.sql

## Compression des exports en tar.bz2 (le meilleur taux de compression)
tar jcf /home/backup_user/files/mysql/${i}.$date_str.sql.tar.bz2 /home/backup_user/files/mysql/${i}.$date_str.sql

## Suppression des exports non compresses
rm /home/backup_user/files/mysql/${i}.$date_str.sql
done

Prendre soin de remplacer les deux chaînes de caractères <mot_de_passe_mysql> par votre mot de passe root de la base de donnée MySQL.

Script MySQL v2

Si une erreur du type « Warning: Using a password on the command line interface can be insecure. » apparaît lors de la sauvegarde des base MySQL alors vous devrez changer le script v1 par le script v2 ci-dessous. Ceci est dû à une mise à jour de MySQL pour la sécurité

#!/bin/sh

if [ ! -d "$DIRECTORY" ]; then
        # Control will enter here if $DIRECTORY doesn't exist.
        mkdir -p "/home/backup_user/files/mysql"
fi

cd /home/backup_user/files/mysql

# On supprime les fichier vieux de plus de 5 jours
find /home/backup_user/files/mysql -type f -name '*.tar.bz2' -mtime +5 -exec rm {} \;

date_str=$(date +"%Y%m%d_%H%M%S")

# Récupère toutes les bases de données
databases=`mysql --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`

for i in $databases; do

echo "saving" $i "to" ${i}.$date_str

## Sauvegarde des bases de donnees en fichiers .sql
mysqldump --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf --single-transaction --databases ${i} > /home/backup_user/files/mysql/${i}.$date_str.sql

echo "compressing" $i

## Compression des exports en tar.bz2 (le meilleur taux de compression)
tar jcf ${i}.$date_str.sql.tar.bz2 ${i}.$date_str.sql

## Suppression des exports non compresses
rm /home/backup_user/files/mysql/${i}.$date_str.sql
done

Et vous devez créer le fichier

sudo nano /etc/mysql/mysql-backup-script.cnf

et le remplir ainsi

[client]
user = root
password = votremotdepasse

Source : https://www.skyminds.net/mysql-resoudre-warning-using-a-password-on-the-command-line-interface-can-be-insecure/

Pour récupérer le mot de passe de MySQL avec myVesta
sudo cat /usr/local/vesta/conf/mysql.conf

Script PostgreSQL

sudo nano /home/backup_user/bin/backup_postgresql_ext.sh

Remplir le fichier ouvert avec ce script :

#!/bin/sh

function output_file_size {
  size=`stat $1 --printf="%s"`
  kb_size=`echo "scale=2; $size / 1024.0" | bc`
  echo "Finished backup for $2 - size is $kb_size KB" >> /tmp/db_backup_info.log
}

# On supprime les fichier vieux de plus de 7 jours
find /home/backup_user/files/psql/ -type f -mtime +7 -exec rm {} \;
rmdir /home/backup_user/files/psql/*

echo "" > /tmp/db_backup.log
echo "" > /tmp/db_backup_info.log
date_str=$(date +"%Y%m%d_%H%M%S")
backup_dir=/home/backup_user/files/psql/pg_backup.$date_str

mkdir -p $backup_dir
pushd $backup_dir > /dev/null
dbs=`sudo -u postgres psql -Upostgres -lt | cut -d \| -f 1 | grep -v template | grep -v -e '^\s*$' | sed -e 's/  *$//'|  tr '\n' ' '`
#dbs='dgul  hrms  mailer_server  missions  postgres'
echo "Will backup: $dbs to $backup_dir" >> /tmp/db_backup_info.log
for db in $dbs; do
  echo "Starting backup for $db" >> /tmp/db_backup_info.log
  filename=$db.$date_str.sql.gz
  filename_binary=$db.$date_str.bak.gz
  sudo -u postgres vacuumdb --analyze -Upostgres $db >> /tmp/db_backup.log
  sudo -u postgres pg_dump -Upostgres -v $db -F p 2>> /tmp/db_backup.log | gzip > $filename
  sudo -u postgres pg_dump -Upostgres -v $db -F c 2>> /tmp/db_backup.log | gzip > $filename_binary
  output_file_size $filename "$db sql"
  output_file_size $filename_binary "$db bin"
done
echo "Backing up global objects" >> /tmp/db_backup_info.log
filename=global.$date_str.sql.gz
sudo -u postgres pg_dumpall -Upostgres -v -g 2>> /tmp/db_backup.log | gzip > $filename
output_file_size $filename global
echo "Ok!" >> /tmp/db_backup_info.log
#mail -s "Backup results" spapas@hcg.gr  < /tmp/db_backup_info.log
#popd > /dev/null

Script SVN

sudo nano /home/backup_user/bin/backup_svn_ext.sh

Remplir le fichier ouvert avec ce script, n’oublier de remplacer <repertoire_svn> par le dossier racine de votre SVN :

#!/bin/sh
# Backup SVN

svnrepo="<repertoire_svn>"

if [ ! -d "$DIRECTORY" ]; then
        # Control will enter here if $DIRECTORY doesn't exist.
        mkdir -p "/home/backup_user/files/svn/"
fi

# On supprime les fichier vieux de plus de 2 jours
find /home/backup_user/files/svn/ -type f -name '*.svndump' -mtime +2 -exec rm {} \;
#find /home/backup_user/files/svn/ -type f -name '*.svndump.gz' -mtime +2 -exec rm {} \;

date_str=$(date +"%Y%m%d_%H%M%S")

for i in `ls $svnrepo`
    do
    svnadmin -q dump $svnrepo/$i > /home/backup_user/files/svn/$i.$date_str.svndump
    #gzip -f /home/backup_user/files/svn/$i.$date_str.svndump
    #rm /tmp/rsnapshot/svn/$i.svndump
done

Script Elasticsearch

sudo nano /home/backup_user/bin/elasticsearch_snapshot.sh

Remplir le fichier ouvert avec ce script :

#!/bin/bash

#This script automates the creation of elasticsearch index backup(.kibana)
mkdir -p /home/backup_user/files/elasticseacrhData/es-backup
chown -R elasticsearch:elasticsearch /home/backup_user/files/elasticseacrhData/es-backup
sudo apt install curl

#add the required path.repo to elasticsearch yaml file
cat >> /etc/elasticsearch/elasticsearch.yml << EOF
path.repo: ["/home/backup_user/files/elasticseacrhData/es-backup"]
EOF
URL_REQ="http://localhost:9200/_snapshot/es-backup'"

#inform elasticsearch of the backup repository
curl -m 30 -XPUT $URL_REQ -H "Content-Type: application/json" -d '{
 "type": "fs",
 "settings": {
 "location": "/home/backup_user/files/elasticseacrhData/es-backup",
 "compress": true
 }
}'
backup_index=”.kibana”
TIMESTAMP=`date +"%Y%m%d_%H%M%S"`

#specify the index to backup
#include_global_state: to prevent the cluster global state to be stored as part of the snapshot
curl -XPUT "$URL_REQ/$TIMESTAMP?wait_for_completion=true" -H "Content-Type: application/json" -d '{
 "indices": "$backup_index",
 "ignore_unavailable": true,
 "include_global_state": false
}'

mv /home/backup_user/files/elasticseacrhData/es-backup /home/backup_user/files/elasticseacrhData/es-backup-$TIMESTAMP
tar -zcvf /home/backup_user/files/elasticseacrhData/es-backup-$TIMESTAMP.tar.gz /home/backup_user/files/elasticseacrhData/es-backup-$TIMESTAMP
rm -R /home/backup_user/files/elasticseacrhData/es-backup-$TIMESTAMP


# The amount of snapshots we want to keep.
LIMIT=30

# Get a list of snapshots we want to delete omitting the most recent index
SNAPSHOTS=`curl -m 30 -s -XGET "$URL_REQ/_all" -H "Content-Type: application/json" \
 | jq ".snapshots[:-${LIMIT}][].snapshot"`

# Loop over the results and delete old snapshots
for SNAPSHOT in $SNAPSHOTS
do
         echo "Deleting snapshot: $SNAPSHOT"
         curl -m 30 -s -XDELETE "$URL_REQ/$SNAPSHOT?pretty"
done
echo "Done!"

Configuration de l’arborescence

sudo chmod +x /home/backup_user/bin/*
sudo chown backup_user: -R /home/backup_user
sudo chmod 754 /home/backup_user/bin/rsync-wrapper.sh

Configuration des droits utilisateurs

Ouvrir le fichier sudoers :

sudo nano /etc/sudoers

Et rajouter les lignes suivantes :

# allows this user to not need a password to sudo the specified command(s)
backup_user    ALL=NOPASSWD:    /usr/bin/rsync

Et si il faut sauvegarder des bases MySQL

backup_user ALL=(mysql) NOPASSWD:/usr/bin/mysql,/usr/bin/mysqldump

Et si il faut sauvegarder des bases PostgreSQL

backup_user ALL=(postgres) NOPASSWD:/usr/bin/psql,/usr/bin/vacuumdb,/usr/bin/pg_dump,/usr/bin/pg_dumpall

Configuration du serveur de sauvegarde

Configuration des droits utilisateurs

sudo adduser backup_user -u 400

Ouvrir le fichier sudoers :

sudo nano /etc/sudoers

Et rajouter les lignes suivantes :

# allows this user to not need a password to sudo the specified command(s)
backup_user ALL=NOPASSWD: /usr/bin/rsync
backup_user ALL=NOPASSWD: /usr/bin/rsnapshot

Ouvrir le fichier de configuration SSH :

sudo nano /etc/ssh/sshd_config

Et rajouter les lignes suivantes :

Host *RPi
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

Configuration des clés SSH

sudo su backup_user
cd ~
ssh-keygen -N "" -f ~/.ssh/id_rsa
ssh-copy-id -i /$HOME/.ssh/id_rsa.pub -p <port_ssh> backup_user@<ip_serveur_donnee>
exit

Puis on test la connexion

ssh backup_user@<ip_serveur_donnee> -p <port_ssh>
exit

Si vous avez plusieurs serveurs à sauvegarder, lancer la commande suivante pour chaque serveur

ssh-copy-id -i /$HOME/.ssh/id_rsa.pub -p <port_ssh> backup_user@<ip_serveur_donnee_n>

Et la synchronisation rsync à distance

rsync -azv -e 'ssh -p <port_ssh>' backup_user@<ip_serveur_donnee>:/home/ /mnt/backup_test/test_2
exit

Configuration de Rsnapshot

mkdir /home/backup_user/bin
nano /home/backup_user/bin/rsnapshot-wrapper.sh

Remplir le fichier ouvert comme ci-dessous :

#!/bin/bash

# This script is a wrapper around rsnapshot, so status information is logged
# and notification are made via Pushover app.  It also makes sure the log file
# doesn't grow too large.

# Capture scripts start time
STARTTIME=`date +%s`

# Location of the Log file
LOG="/home/backup_user/backup.log"

# Number of lines in the log file required to trigger it's truncation
MAXLINES=7000

# Number of lines remaining in the log file after its truncated
MINLINES=2000

# Calculate the size of the Log file
LOGSIZE=$( wc $LOG | awk '{ print $1 }' )

# Place in the log file information concerning the execution of this script
echo -e "\n\n+++++ rsnapshot script started on `date` +++++" >> $LOG
echo "options passed to rsnapshot: " $@ >> $LOG

# Now execute the scriptme
##/usr/bin/sudo /usr/bin/rsnapshot -v "$@" >> $LOG 2>&1
/usr/bin/sudo /usr/bin/rsnapshot -v "$@"
EXITSTATUS=$?

# Capture scripts end time and calculate run time
ENDTIME=`date +%s`
INTERVAL=$((ENDTIME - STARTTIME))
RUNTIME="$(($INTERVAL / 60)) min. $(($INTERVAL % 60)) sec."

# Place time-stamped completion message in the Log
echo "rsnapshot exited with status $EXITSTATUS" >> $LOG
echo "+++++ rsnapshot ran" $RUNTIME "and script completed on `date` +++++" >> $LOG

# Send status notification to Pushover app
# /home/joedoe/bin/apprise -t "Incremental Backup Status" -m "Filesystem backup took $RUNTIME and completed on `date` with exit status $EXITSTATUS.  Log file $LOG has $LOGSIZE lines."

# Truncate the log file if needed
if [ $LOGSIZE -ge $MAXLINES ]
then
    LINECUT=`expr $LOGSIZE - $MINLINES`
    sed -i "1,$LINECUT d" $LOG
    sed -i "1i ////////////////  File truncated here on `date`. //////////////// " $LOG
fi

Puis

chmod +x /home/backup_user/bin/rsnapshot-wrapper.sh

Configuration des exclusions

nano /home/backup_user/rsync-exclude

Remplir le fichier ouvert avec les dossiers qui sont exclus et qui ne seront pas sauvegarder :

- /var/lib/pacman/sync/*
- /lost+found
- /media
- /cdrom
- /proc
- /mnt
- /run
- /tmp
- /sys
- /dev

Remplir le fichier de configuration

sudo su
nano /etc/rsnapshot.conf

Le répertoire principal de sauvegarde

snapshot_root /media/<computer>/<hdd_backup>

Les intervalles de sauvegarde, ici on garde 6 sauvegardes horaires, 7 sauvegardes journalière, 4 sauvegardes hebdomadaires et 3 sauvegardes mensuelles.

#########################################
# BACKUP INTERVALS #
# Must be unique and in ascending order #
# i.e. hourly, daily, weekly, etc. #
#########################################

retain hourly 6
retain daily 7
retain weekly 4
retain monthly 3

Les arguments de rsync

# Default rsync args. All rsync commands have at least these options set.
# NO TABS FOR SPACES
rsync_short_args -aev
rsync_long_args --rsync-path=/home/backup_user/bin/rsync-wrapper.sh --delete --numeric-ids --no-relative --delete-excluded

La configuration du port SSH (si il est identique pour l’ensemble des serveurs à sauvegarder)

# ssh has no args passed by default, but you can specify some here.
#
ssh_args -i /home/backup_user/.ssh/id_rsa -p <port_ssh>

Le lancement des scripts, à placer à la fin du fichier de configuration. Ici, un exemple avec 4 scripts de sauvegardes (ceux que nous avons défini plus haut) c’est à dire les scripts de sauvegarde de MySQL, PostgreSQL, SVN, Elasticsearch.

backup_script /usr/bin/ssh -i /home/backup_user/.ssh/id_rsa -p <port_ssh> backup_user@<ip_serveur_donnee> "/home/backup_user/bin/backup_mysql_ext.sh" unused_1/
backup_script /usr/bin/ssh -i /home/backup_user/.ssh/id_rsa -p <port_ssh> backup_user@<ip_serveur_donnee> "/home/backup_user/bin/backup_postgresql_ext.sh" unused_2/
backup_script /usr/bin/ssh -i /home/backup_user/.ssh/id_rsa -p <port_ssh> backup_user@<ip_serveur_donnee> "/home/backup_user/bin/backup_svn_ext.sh" unused_3/
backup_script /usr/bin/ssh -i /home/backup_user/.ssh/id_rsa -p <port_ssh> backup_user@<ip_serveur_donnee> "/home/backup_user/bin/elasticsearch_snapshot.sh" unused_4/

et le backup des données prends la forme de :

backup backup_user@<ip_serveur_donnee>:/ backup_directory ssh_args=pPORT exclude_file=/home/backup_user/rsync-exclude

Configuration de l’automatisation

sudo crontab -e -u backup_user

Rajouter les lignes suivantes au cron :

# m h  dom mon dow   command
0       */4     *       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      hourly
30      2       *       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      daily
30      10      *       *       6       /home/backup_user/bin/rsnapshot-wrapper.sh      weekly
30      14      1       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      monthly

Divers : attribuer un chemin fixe pour le disque dur

Sur lubuntu il faut installer gnome-disks

sudo apt-get install gnome-disk-utility

Puis on va dans l’application gnome-disks

gnome-disks

Puis éditer le Mount point.

Divers : envoyer un mail après chaque backup

On copie l’outil de rapport  rsnapshot, pour cela on commence par le rechercher

sudo find . -name rsnapreport.pl

J’obtiens

/usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl

Et on le copie dans le dossier local

cp /usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl /usr/local/bin
chmod +x /usr/local/bin/rsnapreport.pl

On installe le paquet sSMTP

sudo apt update
sudo apt install ssmtp

On édite le fichier de configuration

nano /etc/ssmtp/ssmtp.conf

Et on remplit les champs

root=user@domain.com
mailhub=smtp_server:smtp_port (exemple : ssl0.ovh.net:465)
rewriteDomain=domain.com
hostname=domain.com
FromLineOverride=YES
AuthUser=user@domain.com
AuthPass=password
UseTLS=YES

On édite le fichier de configuration des aliases

nano /etc/ssmtp/revaliases

Et on rajoute

root:user@domain.com:smtp_server:smtp_port

Et on teste la configuration en envoyant un mail

echo "Test" | ssmtp adressemail@test.com

Puis on met à jour le crontab

sudo crontab -e -u backup_user

Et

# m h  dom mon dow   command
0       */4     *       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      hourly 2>&1 | /usr/local/bin/rsnapreport.pl | ssmtp "backup hourly" info@mcdavidian.com
30      2       *       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      daily 2>&1 | /usr/local/bin/rsnapreport.pl | ssmtp "backup daily" info@mcdavidian.com
30      10      *       *       6       /home/backup_user/bin/rsnapshot-wrapper.sh      weekly 2>&1 | /usr/local/bin/rsnapreport.pl | ssmtp "backup weekly" info@mcdavidian.com
30      14      1       *       *       /home/backup_user/bin/rsnapshot-wrapper.sh      monthly 2>&1 | /usr/local/bin/rsnapreport.pl | ssmtp "backup monthly " info@mcdavidian.com

Divers : cas d’une protection DynHost

Si vous utilisez une protection DynHost sur votre serveur de donnée, suivez cette partie.
Sur le serveur de donnée, installer ddclient.

sudo apt install ddclient

Editez le fichier /etc/ddclient.conf afin d’y saisir les informations nécessaires à la mise à jour du couple IP/DNS. Ci-dessous, avec notre exemple pour OVH :

Enfin, redémarrez ddclient pour prendre en compte les modifications :

sudo service ddclient restart

Divers : sauvegarde d’Elasticsearch

Je me sers d’Elasticsearch pour Akeneo PIM. Elasticsearch utilise un procédé différent de ce que l’on a vu précédemment pour sauvegarder ses données. Voici donc un petit aparté consacré à ce dernier.

Premièrement, on installe cURL si ce n’est pas déjà fait sur le serveur de sauvegarde et de donnée où se trouve le PIM.

apt install curl

Pour éviter des erreurs, on lance ces trois commandes sur le serveur de donnée où se trouve le PIM.

mkdir -p /tmp/pim/file_storage
mkdir -p /tmp/pim/upload_tmp_dir
chown -R www-data: /tmp/pim/

On se connecte ensuite au serveur de sauvegarde puis on lance les commandes suivantes :

mkdir -p /home/backup_user/files/elasticseacrhData/es-backup
chown -R elasticsearch:elasticsearch /home/backup_user/files/elasticseacrhData
cat >> /etc/elasticsearch/elasticsearch.yml << EOF
path.repo: ["/home/backup_user/files/elasticseacrhData/es-backup"]
EOF
service elasticsearch restart
curl -XGET 'http://localhost:9200/_snapshot/_all?pretty'

On doit recevoir une double accolade : { }

curl -XPUT -H "Content-Type: application/json;charset=UTF-8" 'http://localhost:9200/_snapshot/es-backup' -d '{
"type": "fs",
"settings": {
"location": "/home/backup_user/files/elasticseacrhData/es-backup",
"compress": true
}
}'
curl -XGET 'http://localhost:9200/_snapshot/_all?pretty'

On doit recevoir une réponse non vide.

On réalise la sauvegarde :

curl -XPUT "http://localhost:9200/_snapshot/es-backup/linuxpoint_snapshot?wait_for_completion=true"

On vérifie la sauvegarde :

curl -XGET "http://localhost:9200/_snapshot/es-backup/_all?pretty"

Pour effacer la sauvegarde on utilise la commande :

curl -XDELETE 'http://localhost:9200/_snapshot/es-backup/linuxpoint_snapshot'

Pour restorer une sauvegarde on utilise la commande :

curl -XPOST “localhost:9200/_snapshot/my_backup/es-backup/_restore?wait_for_completion=true”

Si lors de l’installation, Elasticsearch ne démarre plus, lancer la commande :

sudo chown elasticsearch: -R /etc/elasticsearch/

Source :
https://linuxaws.wordpress.com/2018/09/21/how-to-create-snapshots-of-elasticsearch-cluster-data-and-restore/
https://discuss.elastic.co/t/incremental-snapshot-in-elasticsearch/93874/2
https://www.elastic.co/fr/blog/found-elasticsearch-snapshot-and-restore
https://qbox.io/blog/elasticsearch-data-snapshots-restore-tutorial
https://medium.com/@ebaneckatuh/how-to-create-and-restore-an-elasticsearch-index-using-a-bash-script-1ff1e66f0e8f

Divers : mise en veille pour la nuit

Lorsque je ne suis pas au bureau, je préfère que le serveur de sauvegarde reste en veille.
L’ordinateur reste en veille de 00:17 à 10:00.

sudo touch /home/rtc.log
sudo chmod 777 /home/rtc.log
sudo crontab -e -u backup_user

On ajoute la ligne

0 17 * * * sudo rtcwake -m mem -l -t "$(date -d 'tomorrow 10:00:00' '+\%s')" >> /home/rtc.log 2>&1

Puis on redémarre cron

sudo service cron restart

Divers : limiter la bande passante du serveur de sauvegarde

Si le serveur de donnée se trouve ralenti lors des phases de sauvegarde, vous pouvez ajouter l’argument –bwlimit=1MiB à rsync_long_args 

rsync_long_args --rsync-path=/home/backup_user/bin/rsync-wrapper.sh --delete --numeric-ids --no-relative --delete-excluded --bwlimit=1MiB

Je vous conseille aussi, pour garder un œil sur les performances du serveur de sauvegarde, de télécharger un logiciel comme Open Hardware Monitor qui vous permettra de surveiller les températures de votre serveur. En effet, j’ai eu le problème d’un serveur de sauvegarde qui s’est éteint à la suite de forte température interne. Veillez donc à mettre des alarmes au cas échéant.

Problèmes possibles

Erreur « Access denied for user ‘root’@’localhost' »

Ce problème provient de la sauvegarde d’une base de donnée MySQL. Il est dû à un problème de gestion des privilèges.

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON *.* TO 'backup_user'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
mysql --user=backup_user --password=PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"

Source : https://askubuntu.com/questions/763336/cannot-enter-phpmyadmin-as-root-mysql-5-7/763359#763359

Erreur « Replace space by tabs »

Si vous avez ce problème c’est qu’il faut remplacer les espaces par des tabulations dans le fichier /etc/rsnapshot.conf

Catégories : Linux

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *