Le 02/04/2025

Backuper DB BareMetal Scaleway sur Object storage

Où l'on voit comment sauvegarder quotidiennement la base de données d'un site hébergé sur un serveur BareMetal chez Scaleway vers 'l'object storage de l'hébergeur.

Pré-requis :

Avoir configuré un Bucket chez Scaleway, y avoir créé un dossier "backups"

Utilisateur IAM chez Scaleway

On créé un utilisateur qui sera dédié aux backups :

Capture d’écran 2025-04-02 à 10.10.52.png

On créé une policy donnant accès à 'lobject storage à l'utilisateur précédemment créé :

Capture d’écran 2025-04-02 à 10.11.03.png Capture d’écran 2025-04-02 à 10.11.18.png

Il n'est pas nécessaire d'attacher une policy spécifique au bucket utilisé, on se contente de celle de l'utilisateur.

Utilisateur Mysql dédié au backup

On va créer un utilisateur Mysql avec que des droits de lecture qui aura accès à toutes les bases pour pouvoir les backuper.

# mysql -uroot -p

Puis dans mysql : MariaDB [(none)]> CREATE USER user4backup IDENTIFIED BY 'unSuperMotDePasse'; MariaDB [(none)]> GRANT SELECT, LOCK TABLES, RELOAD, SHOW VIEW, PROCESS ON *.* TO user4backup; MariaDB [(none)]> FLUSH PRIVILEGES;

Configuration sur serveur BareMetal

On récupère le client console Scaleway : curl -s https://raw.githubusercontent.com/scaleway/scaleway-cli/master/scripts/get.sh | sh

On met en place la configuration issue de scaleway : scw init -p newprofile access-key=xxxxxxxxxxxxxxx secret-key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx organization-id=xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx project-id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx

Si besoin configurer la bonne région : scw config set default-region=nl-ams

Vérifier la configuration : scw config dump

Vérifier la connexion au bucket : scw object bucket list

On installe s3cmd (pour envoi de fichier sur Bucket) : sudo apt install s3cmd

On installe la config s3cmd : scw object config install type=s3cmd

On peut tester un envoi de fichier (mes backups sont dans un dossier "backups"): s3cmd put file monfichiertest.txt s3://bucketname/backups/

Script de backups des bases de données et envoi sur le bucket

On va créer un dossier (ici dans le dossier utilisateur) qui accueillera le script de backups et les fichiers de backups.

 mkdir backups
 cd backups/ 
 mkdir script
 vim script/backuper.sh

Contenu du script adapté de tecadmin.net:

 #!/usr/bin/env bash

#########################################################################
#########################################################################
###
####       Author: Rahul Kumar
#####      Website: https://tecadmin.net
####
#########################################################################
#########################################################################

# Set the folder name formate with date (2022-05-28)
#DATE_FORMAT=$(date +"%Y-%m-%d")
DATE_FORMAT=$(date +"%d") #personnellement je ne garde que le numéro du jour dans le mois pour garder une archive par jour sur les 30 derniers jours.

# MySQL server credentials
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="user4backup"
MYSQL_PASSWORD="unSuperMotDePasse"

# Path to local backup directory
LOCAL_BACKUP_DIR="/home/username/backups"

# Set s3 bucket name and directory path
S3_BUCKET_NAME="bucketname"
S3_BUCKET_PATH="backups"

# Number of days to store local backup files
#en local on ne garde les backups que sur les 2 derniers jours
BACKUP_RETAIN_DAYS=2 

# Use a single database or space separated database's names
DATABASES="db1 db2 db3 db4"

##### Do not change below this line

mkdir -p ${LOCAL_BACKUP_DIR}/${DATE_FORMAT}

LOCAL_DIR=${LOCAL_BACKUP_DIR}/${DATE_FORMAT}
REMOTE_DIR=s3://${S3_BUCKET_NAME}/${S3_BUCKET_PATH}

for db in $DATABASES; do
   mysqldump \
        -h ${MYSQL_HOST} \
        -P ${MYSQL_PORT} \
        -u ${MYSQL_USER} \
        -p${MYSQL_PASSWORD} \
        --single-transaction ${db} | gzip -9 > ${LOCAL_DIR}/${db}-${DATE_FORMAT}.sql.gz

    s3cmd put file ${LOCAL_DIR}/${db}-${DATE_FORMAT}.sql.gz ${REMOTE_DIR}/${DATE_FORMAT}/
done

DBDELDATE=`date +"${DATE_FORMAT}" --date="${BACKUP_RETAIN_DAYS} days ago"`

if [ ! -z ${LOCAL_BACKUP_DIR} ]; then
    cd ${LOCAL_BACKUP_DIR}
    if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
        rm -rf ${DBDELDATE}

    fi
fi

## Script ends here

Puis on rendra le script exécutable : chmod +x backuper.sh

Enfin on l'installe dans la crontab : crontab -e

et on l'exécute une fois par jour, ici à 3h du matin (à adapter selon le serveur) :

# Run daily @ 2am
0 3 * * * /home/username/backups/script/backuper.sh > /dev/null 2>&1