Lain

Sauvegardes

Le script de sauvegarde prend en paramètre la configuration à charger, ainsi qu’une commande à exécuter.

/home/backup/backup.sh ${configuration} ${commande}
#!/bin/sh

# Example :
#
# backup an existing configuration :
# backup.sh configuration incremental

set -u
set -e

HOME=/home/backup/

# Source the configuration file, the file is expected to have thoses property
# defined
#
# BACKUP_NAME :     the name to the backup on the distant server
# PATH_TO_BACKUP :  an existing path to backup on the disk
# TIME_BEFORE_FULL :how many time we need before starting a new full backup
# ENC_KEYS :        the gpg keys (coma separated) to encrypt the data with
#
CONFIGURATION=$1
. "${CONFIGURATION}"
shift

# This line will raise an error if the variable is not set.
echo "Backuping to ${BACKUP_NAME}"

# Create a file for the duplicity configuration
# This file will be deleted once the script is executed
#
# The configuration file is generated on the fly in order to declare the name
# to the backup path on the remote server.
BACKUP_CONF=$(mktemp)
trap 'rm -f "${BACKUP_CONF}"' EXIT
BACKUP_NAME="${BACKUP_NAME}" envsubst  < ${HOME}/config.json > "${BACKUP_CONF}"

BACKUP="multi://${BACKUP_CONF}?mode=mirror&onfail=abort"

# Transform the keys into the format expected by duplicity
ENC_KEY=$(echo ${ENC_KEYS}| sed -e "s/,/ --encrypt-key /g")


# The backup function with all the common settings
# Arguments
#       - The duplicity target
#       - Other arguments to give to duplicity
backup() {
        duplicity \
       --name ${BACKUP_NAME} \
       --archive-dir=${HOME}/cache \
           --encrypt-key ${ENC_KEY} \
           --file-prefix-manifest 'hot_' \
           --file-prefix-signature 'hot_' \
           --file-prefix-archive 'cold_' \
           --full-if-older-than ${TIME_BEFORE_FULL} \
           "$@" \
           ${BACKUP}
}

# Restore a backup. We change the order here to set the backup before the other
# arguments.
restore() {
        shift 1
        duplicity \
       --name ${BACKUP_NAME} \
       --archive-dir=${HOME}/cache \
           --encrypt-key ${ENC_KEY} \
           --file-prefix-manifest 'hot_' \
           --file-prefix-signature 'hot_' \
           --file-prefix-archive 'cold_' \
           restore \
           ${BACKUP} \
           "$@"
}


case $1 in
        incremental|full)
                backup $* "${PATH_TO_BACKUP}"
                ;;
        restore)
                restore $*
                ;;
        *)
                backup $*
                ;;
esac

Les sauvegardes configurées sont lues dans les fichiers .conf présents dans le répertoire /home/backup/

Attention

Les fichiers de configuration sont automatiquement installés lors de l’installation du système à partir du blog, les modifications seront écrasées lors du prochain déploiement.

Commandes

Commande Description
collection-status Affiche la liste des sauvegardes réalisées
collection-status | grep Full Affiche uniquement la date de la première sauvegarde de la chaîne
incremental Réalise une sauvegarde incrémentale (sauf si la durée définie dans le fichier de configuration est atteinte)
--full Crée une nouvelle sauvegarde complète.
--force remove-all-but-n-full 4 Supprime les anciennes sauvegardes pour ne conserver que 4 chaines completes.

Lancer la commande manuellement

La commande est prévue pour être exécutée via la tâche planifiée. Si celle-ci doit être lancée manuellement, il est nécessaire de préparer les variables d’environnement GNUPGHOME et HOME :

GNUPGHOME=/root/.gnupg HOME=/home/backup/ sudo --preserve-env=GNUPGHOME,HOME /home/backup/backup.sh ${configuration} ${action}

Configuration

Exemple de configuration de sauvegarde :

BACKUP_NAME=${nom de la sauvegarde}
PATH_TO_BACKUP=${répertoire à sauvegarder}
ENC_KEYS=${clef GPG}
TIME_BEFORE_FULL=3M

La sauvegarde se base également sur le fichier /home/backup/config.json qui contient les clefs d’accès à OVH et défini les serveurs distants.

Planification

Tous les fichiers de configuration présents dans /home/backup/ sont pris en compte :

/etc/systemd/system/backup.service
[Unit]
Description=Backup with duplicity
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStartPre=sh -c 'while ! ping -c 1 example.com; do sleep 1; done'
ExecStart=systemd-inhibit \
        --who 'backup' \
        --why 'Sauvegarde en cours' \
        --mode block \
        sh -c 'find /home/backup/ -name '*.conf' -print0 | xargs -0 -I @ /home/backup/backup.sh @ incremental'

Journal des actions

Les journaux des dernières sauvegardes peuvent être consultés à cette adresse ou avec la commande suivante :

sudo journalctl -u backup

Timer

La sauvegarde se déclenche une fois par semaine

/etc/systemd/system/backup.timer
[Unit]
Description=Weekly backup

[Timer]
OnCalendar=weekly
AccuracySec=12h
Persistent=true
OnBootSec=5mn

[Install]
WantedBy=timers.target

GPG

Les sauvegardes sont chiffrées à l’aide de gpg. Les sauvegardes étant lancées avec le compte root, il est nécessaire que l’utilisateur dispose de la clef publique associée pour pouvoir chiffrer les fichiers.

Voir l’article Mettre à jour les clefs GPG