Ceci est une ancienne révision du document !


La sauvegarde sous PBS

CréationNicolas THOREZ 2021/08/24 12:25

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

# Sauvegarde
$PBSCLIENT backup ${HOSTNAME}${PATH_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.

Client et chiffrement

Il est possible de chiffrer les sauvegardes réalisées via le client. Cependant, en faisant cela, il ne sera plus possible d'explorer les sauvegardes ni de les restaurer via le serveur vu que ce dernier ne connaît pas la clé de chiffrement. Ces fonctionnalités ne seront disponibles qu'en ligne de commande à partir du client lui-même. Si cette fonctionnalité vous intéresse et que les désagréments ne vous rebutent pas, il est facile de mettre le chiffrement en place. Pour cela :
  • On crée la clé de chiffrement. Par défaut, la clé est enregistrée dans le fichier ~/.config/proxmox-backup/encryption-key.json et cette dernier est protégée par un mot de passe. Il est possible de spécifier un autre chemin en indiquant ce dernier après la commande create. Il est aussi possible d'ignorer la protection par mot de passe en ajoutant –kdf none à la commande :

#proxmox-backup-client key create

  • Lors de la sauvegarde, la clé par défaut est utilisée automatiquement. Pour spécifier une clé, on peux indiquer son chemin avec le paramètre –keyfile et pour éviter d'avoir a entrer le mot de passe de la clé si cette dernière est protégée, on peut définir et exporter la variable PBS_ENCRYPTION_PASSWORD avant de lancer la sauvegarde.

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.1629959705.txt.gz
  • Dernière modification : 2021/08/26 08:35
  • de nekan