Ceci est une ancienne révision du document !


La sauvegarde sous PBS

CréationNicolas THOREZ 2021/08/23 20:14

Proxmox Backup Server (PBS) permet de centraliser les sauvegardes, gérer les rétentions, sauvegarder et restaurer des machines au niveau fichier, vérifier les sauvegardes, etc…

La sauvegarde de VM est assez simple à mettre en place lorsqu'on a déjà vu cette fonctionnalité sous PVE. Pour PBS, il faut :

  1. Mettre en place un datastore de PBS dans PVE (voir Ajout d'un datastore à partir d'un disque USB)
  2. Mettre en place une sauvegarde de VM sous PVE en choisissant le datastore de PBS (voir La sauvegarde sous PVE)

Les sauvegardes apparaîtront alors dans PBS est pourront être gérées depuis là.

  • Pour lancer une sauvegarde, on commence par s'authentifier auprès du serveur :

PBS_PASSWORD='P@ssW0rd'
PBS_FINGERPRINT='42:40:d4:25:a0:ed:c7:05:bf:c4:62:a7:e5:98:a6:4d:ff:82:aa:3e:37:3f:c2:92:0d:f2:8a:77:49:b5:dd:ef'
PBS_ADDRESS="1.2.3.4"
PBS_STORAGE="backup"
export PBS_FINGERPRINT
export PBS_PASSWORD
proxmox-backup-client login --repository root@pam@${PBS_ADDRESS}:${PBS_STORAGE}

  • Cette authentification permet nous fourni un token nous permettant d'envoyer des requêtes au serveur sans nouvel authentification pendant 2h. Du coup, nous pouvons lancer une sauvegarde à la suite :

PBS_ADDRESS="1.2.3.4"
PBS_STORAGE="backup"
PATH_TO_BACKUP="/"
proxmox-backup-client backup $HOSTNAME.pxar:${PATH_TO_BACKUP} --repository root@pam@${PBS_ADDRESS}:${PBS_STORAGE}

  • Le problème, c'est que les sauvegardes sont du coup manuelles. Pour automatiser cela, j'ai écris le script suivant pbs-backup.sh :

#!/bin/bash

#######################################################
#                                                     #
#  Script de sauvegarde de serveur via agent Proxmox  #
#  Par Nicolas THOREZ                                 #
#                                                     #
#######################################################

#==========================#
# Définition des variables #
#==========================#

# Utilisateur par défaut
DEFAULT_PBS_USER="root@pam"

# Chemin du client
PBSCLIENT="/usr/bin/proxmox-backup-client"

# Chemin à sauvegarder par défaut
DEFAULT_PATH_TO_BACKUP="/"

# Regex pour l'empreinte
REGEX_FINGERPRINT="^([0-9a-f]{2}:){31}[0-9a-f]{2}$"

# Regex pour l'adresse
REGEX_ADDRESS="^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"

#==========================#
# Définition des fonctions #
#==========================#

# Fonction d'affichage de l'aide
display-help()
{
    echo "Script de sauvegarde de serveur via agent Proxmox"
    echo ""
    echo "Usage : pbs-backup.sh [-u|--user] utilisateur [-p|--password] mot de passe"
    echo "                      [-a|--address] adresse du serveur [-r|--repository] dépôt de sauvegarde"
    echo "                      [-b|--backup] dossier à sauvegarder [-f|--fingerprint] empreinte du serveur"
    echo "                      [-h|--help]"
    echo ""
    echo "Paramètres et arguments :"
    echo ""
    echo "-h, --help               Affiche cette aide."
    echo ""
    echo "-u, --user               Utilisateur autorisé sur le serveur PBS."
    echo "                         Par défaut, l'utilisateur 'root@pam' est utilisé."
    echo ""
    echo "-p, --password           Mot de passe pour l'utilisateur donnée."
    echo "                         Si aucun mot de passe n'est fourni, il en sera demander un."
    echo ""
    echo "-a, --address            Adresse du serveur PBS."
    echo ""
    echo "-r, --repository         Dossier de stockage où sera déposé la sauvegarde."
    echo ""
    echo "-b, --backup             Dossier à sauvegarder."
    echo "                         Par défaut, le dossier sera la racine."
    echo ""
    echo "-f, --fingerprint        Empreinte du certificat du serveur PBS."
    echo ""
    exit 2
}

# Fonction de collecte du mot de passe
get-password()
{
    read -p "Veuillez saisir le mot de passe : " -s PASS
    if [ -z "$PASS" ]
    then
        echo "CRIT - Le mot de passe est obligatoire"
        exit 2
    else
        echo $PASS
    fi
}

#=====================#
# Gestion des entrées #
#=====================#

while [[ $# -gt 0 ]]
do
    PARAM="$1"
    case $PARAM in
        # aide
        "-h"|"--help")
        display-help
        shift
        ;;
        # Utilisateur
        "-u"|"--user")
        PBS_USER="$2"
        shift
        shift
        ;;
        # Mot de passe
        "-p"|"--password")
        case $2 in
            "-h"|"--help"|"-u"|"--user"|"-p"|"--password"|"-a"|"--address"|"-r"|"--repository"|"-b"|"--backup"|"-f"|"--fingerprint")
            PBS_PASSWORD=$(get-password)
            echo ""
            shift
            ;;
            *)
            PBS_PASSWORD="$2"
            shift
            shift
            ;;
        esac
        ;;
        # Adresse
        "-a"|"--address")
        PBS_ADDRESS="$2"
        shift
        shift
        ;;
        # Dépôt de sauvegarde
        "-r"|"--repository")
        PBS_REPOSITORY="$2"
        shift
        shift
        ;;
        # Chemin à sauvegarder
        "-b"|"--backup")
        PATH_TO_BACKUP="$2"
        shift
        shift
        ;;
        # Empreinte
        "-f"|"--fingerprint")
        PBS_FINGERPRINT="$2"
        shift
        shift
        ;;
        # Autre
        *)
        display-help
        shift
        ;;
    esac
done

#==========================#
# Vérification des entrées #
#==========================#

# Utilisateur
if [ -z "$PBS_USER" ]
then
    PBS_USER="$DEFAULT_PBS_USER"
fi

# Mot de passe
if [ -z "$PBS_PASSWORD" ]
then
    PBS_PASSWORD=$(get-password)
    echo ""
fi

# Adresse
if [[ ! $PBS_ADDRESS =~ $REGEX_ADDRESS ]]
then
    echo "CRIT - L'adresse donnée est invalide."
    exit 2
fi

# Dépôt de sauvegarde
if [ -z "$PBS_REPOSITORY" ]
then
    echo "CRIT - Le dépôt de sauvegarde est invalide."
    exit 2
fi

# Chemin à sauvegarder
if [ -z "$PATH_TO_BACKUP" ]
then
    PATH_TO_BACKUP="$DEFAULT_PATH_TO_BACKUP"
else
    if [ ! -d "$PATH_TO_BACKUP" ]
    then
        echo "CRIT - Le chemin donnée n'est par un dossier valide"
        exit 2
    fi
fi

# Empreinte
if [[ ! $PBS_FINGERPRINT =~ $REGEX_FINGERPRINT ]]
then
    echo "CRIT - L'empreinte donnée n'est pas valide"
fi

#============#
# Traitement #
#============#

# Demande de token
export PBS_FINGERPRINT
export PBS_PASSWORD
$PBSCLIENT login --repository ${PBS_USER}@${PBS_ADDRESS}:${PBS_REPOSITORY}

# Mise en forme du nom de la sauvegarde
PATH_NAME="$(echo $PATH_TO_BACKUP | sed 's;/;-;g')"
if [ "${PATH_NAME: -1}" == "-" ]
then
    PATH_NAME="${PATH_NAME:: -1}"
fi
if [ -z "$PATH_NAME" ]
then
    BACKUP_NAME="${HOSTNAME}"
else
    BACKUP_NAME="${HOSTNAME}${PATH_NAME}"
fi

# Sauvegarde
$PBSCLIENT backup ${BACKUP_NAME}.pxar:${PATH_TO_BACKUP} --repository ${PBS_USER}@${PBS_ADDRESS}:${PBS_REPOSITORY}

  • Ce script, nous permet alors de mettre en place un cron :

# Tâche de sauvegarde
0 1 * * *    root    /usr/local/batch/pbs-backup.sh -u nekan@pve -p P@ssW0rd -a 1.2.3.4 -r backup -b / -f "42:40:d4:25:a0:ed:c7:05:bf:c4:62:a7:e5:98:a6:4d:ff:82:aa:3e:37:3f:c2:92:0d:f2:8a:77:49:b5:dd:ef"

Sauvegarde

Et voilà, votre serveur sera sauvegardé tous les jours à 1h.

Au travers de l'interface de PBS, nous pouvons gérer la manière dont les sauvegardes sont conservées. Ainsi dans le menu correspondant à notre datastore (ici backup), onglet Délestage et GC; il est possible de définir :

  • Garbage Collection Schedule : Fréquence à laquelle le serveur va supprimer les anciennes sauvegardes.
  • Planification du Délestage : Fréquence à laquelle le serveur va délester les anciennes sauvegardes. Cette action supprime uniquement les index et non les données de sauvegardes.
  • Garder Dernier : Permet de conserver les x dernières sauvegardes.
  • Garder Horaires : Permet de conserver les sauvegardes pendant x heures.
  • Garder Journaliers : Permet de conserver les sauvegardes pendant x jours.
  • Garder Hebdomadaires : Permet de conserver les sauvegardes pendant x semaines.
  • Garder Mensuels : Permet de conserver les sauvegardes pendant x mois.
  • Garder Annuels : Permet de conserver les sauvegardes pendant x années.

La vérification des sauvegardes permet de valider leurs intégrités. Pour ce faire, toujours au niveau de l'interface de PBS, dans le menu correspondant à notre datastore (ici backup), onglet Verify Jobs, on cliquer sur Ajouter pour créer un tâche planifiée qui vérifiera l'intégrité des sauvegardes présentes dans le datastore :

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • pbs_backup.1629800670.txt.gz
  • Dernière modification : 2021/08/24 12:24
  • de nekan