[Update 2023] Faire un Backup Total de son Serveur Dédié avec Rsnapshot
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 :
1 |
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.
1 2 3 |
sudo apt update && sudo apt upgrade && sudo apt install gedit rsync grsync rsnapshot -y |
Exécuter sur le serveur de donnée.
1 |
apt install bzip2 |
Exécuter sur le serveur de sauvegarde.
1 2 3 4 5 6 |
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.
1 2 |
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.
1 2 3 4 5 6 7 8 |
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
1 2 |
ssh user@<ip_serveur_donnee> -p <port_ssh> exit |
Et la synchronisation rsync à distance
1 |
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
1 2 3 4 |
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
1 |
sudo nano /home/backup_user/bin/rsync-wrapper.sh |
Remplir le fichier ouvert avec ce script :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/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 :
1 |
su - backup_user -c "sh /home/backup_user/bin/<script_name>.sh" |
ou
1 |
su - backup_user -c ". /home/backup_user/bin/<script_name>.sh" |
Script MySQL v1
1 |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/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=<strong><mot_de_passe_mysql></strong> -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<strong><mot_de_passe_mysql></strong> ${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é
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/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
1 |
sudo nano /etc/mysql/mysql-backup-script.cnf |
et le remplir ainsi
1 2 3 |
[client] user = root password = votremotdepasse |
Pour récupérer le mot de passe de MySQL avec myVesta
1 |
sudo cat /usr/local/vesta/conf/mysql.conf |
Script PostgreSQL
1 |
sudo nano /home/backup_user/bin/backup_postgresql_ext.sh |
Remplir le fichier ouvert avec ce script :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/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
1 |
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/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
1 |
sudo nano /home/backup_user/bin/elasticsearch_snapshot.sh |
Remplir le fichier ouvert avec ce script :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/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
1 2 3 |
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 :
1 |
sudo nano /etc/sudoers |
Et rajouter les lignes suivantes :
1 2 |
# 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
1 |
backup_user ALL=(mysql) NOPASSWD:/usr/bin/mysql,/usr/bin/mysqldump |
Et si il faut sauvegarder des bases PostgreSQL
1 |
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
1 |
sudo adduser backup_user -u 400 |
Ouvrir le fichier sudoers :
1 |
sudo nano /etc/sudoers |
Et rajouter les lignes suivantes :
1 2 3 |
# 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 :
1 |
sudo nano /etc/ssh/sshd_config |
Et rajouter les lignes suivantes :
1 2 3 |
Host *RPi StrictHostKeyChecking no UserKnownHostsFile=/dev/null |
Configuration des clés SSH
1 2 3 4 5 |
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
1 2 |
ssh backup_user@<ip_serveur_donnee> -p <port_ssh> exit |
Si vous avez plusieurs serveurs à sauvegarder, lancer la commande suivante pour chaque serveur
1 |
ssh-copy-id -i /$HOME/.ssh/id_rsa.pub -p <port_ssh> backup_user@<ip_serveur_donnee_n> |
Et la synchronisation rsync à distance
1 2 |
rsync -azv -e 'ssh -p <port_ssh>' backup_user@<ip_serveur_donnee>:/home/ /mnt/backup_test/test_2 exit |
Configuration de Rsnapshot
1 2 |
mkdir /home/backup_user/bin nano /home/backup_user/bin/rsnapshot-wrapper.sh |
Remplir le fichier ouvert comme ci-dessous :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#!/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
1 |
chmod +x /home/backup_user/bin/rsnapshot-wrapper.sh |
Configuration des exclusions
1 |
nano /home/backup_user/rsync-exclude |
Remplir le fichier ouvert avec les dossiers qui sont exclus et qui ne seront pas sauvegarder :
1 2 3 4 5 6 7 8 9 10 |
- /var/lib/pacman/sync/* - /lost+found - /media - /cdrom - /proc - /mnt - /run - /tmp - /sys - /dev |
Remplir le fichier de configuration
1 2 |
sudo su nano /etc/rsnapshot.conf |
Le répertoire principal de sauvegarde
1 |
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.
1 2 3 4 5 6 7 8 9 10 |
######################################### # 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
1 2 3 4 |
# 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)
1 2 3 |
# 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.
1 2 3 4 |
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 :
1 |
backup backup_user@<ip_serveur_donnee>:/ backup_directory ssh_args=pPORT exclude_file=/home/backup_user/rsync-exclude |
Configuration de l’automatisation
1 |
sudo crontab -e -u backup_user |
Rajouter les lignes suivantes au cron :
1 2 3 4 5 |
# 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
1 |
sudo apt-get install gnome-disk-utility |
Puis on va dans l’application gnome-disks
1 |
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
1 |
sudo find . -name rsnapreport.pl |
J’obtiens
1 |
/usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl |
Et on le copie dans le dossier local
1 2 |
cp /usr/share/doc/rsnapshot/examples/utils/rsnapreport.pl /usr/local/bin chmod +x /usr/local/bin/rsnapreport.pl |
On installe le paquet sSMTP
1 2 |
sudo apt update sudo apt install ssmtp |
On édite le fichier de configuration
1 |
nano /etc/ssmtp/ssmtp.conf |
Et on remplit les champs
1 2 3 4 5 6 7 8 |
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
1 |
nano /etc/ssmtp/revaliases |
Et on rajoute
1 |
root:user@domain.com:smtp_server:smtp_port |
Et on teste la configuration en envoyant un mail
1 |
echo "Test" | ssmtp adressemail@test.com |
Puis on met à jour le crontab
1 |
sudo crontab -e -u backup_user |
Et
1 2 3 4 5 |
# 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.
1 |
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 :
1 |
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.
1 |
apt install curl |
Pour éviter des erreurs, on lance ces trois commandes sur le serveur de donnée où se trouve le PIM.
1 2 3 |
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 :
1 2 |
mkdir -p /home/backup_user/files/elasticseacrhData/es-backup chown -R elasticsearch:elasticsearch /home/backup_user/files/elasticseacrhData |
1 2 3 |
cat >> /etc/elasticsearch/elasticsearch.yml << EOF path.repo: ["/home/backup_user/files/elasticseacrhData/es-backup"] EOF |
1 |
service elasticsearch restart |
1 |
curl -XGET 'http://localhost:9200/_snapshot/_all?pretty' |
On doit recevoir une double accolade : { }
1 2 3 4 5 6 7 |
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 } }' |
1 |
curl -XGET 'http://localhost:9200/_snapshot/_all?pretty' |
On doit recevoir une réponse non vide.
On réalise la sauvegarde :
1 |
curl -XPUT "http://localhost:9200/_snapshot/es-backup/linuxpoint_snapshot?wait_for_completion=true" |
On vérifie la sauvegarde :
1 |
curl -XGET "http://localhost:9200/_snapshot/es-backup/_all?pretty" |
Pour effacer la sauvegarde on utilise la commande :
1 |
curl -XDELETE 'http://localhost:9200/_snapshot/es-backup/linuxpoint_snapshot' |
Pour restorer une sauvegarde on utilise la commande :
1 |
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 :
1 |
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.
1 2 3 |
sudo touch /home/rtc.log sudo chmod 777 /home/rtc.log sudo crontab -e -u backup_user |
On ajoute la ligne
1 |
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
1 |
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
1 |
rsync_long_args --rsync-path=/home/backup_user/bin/rsync-wrapper.sh --delete --numeric-ids --no-relative --delete-excluded <strong>--bwlimit=1MiB</strong> |
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.
1 2 3 |
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'PASSWORD'; GRANT ALL PRIVILEGES ON *.* TO 'backup_user'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; |
1 |
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
0 commentaire