Home /Article /MAPIO: sécuriser ses données avec un système de sauvegarde (restic)

MAPIO: sécuriser ses données avec un système de sauvegarde (restic)

MAPIO: sécuriser ses données avec un système de sauvegarde (restic)

Présentation

Maintenant que vous utilisez MAPIO au quotidien, il est important de garder en tête qu’il faut toujours sauvegarder les données importantes. Personne n’est à l’abri d’une défaillance matérielle, un incendie, un dégât des eaux, un vol ou tout simplement une mauvaise manipulation. Dans cet article je vais vous expliquer comment configurer un système de sauvegarde automatique et optimisé.

Voici les requis pour le système de sauvegarde à mettre en place :

  • être stocké dans un endroit physiquement distant
  • gérer la sauvegarde par delta
  • être chiffré
  • être entièrement configurable (dossiers à sauvegarder, fréquence, politique de rétention, …)

Solution retenue

La solution retenue pour gérer les backup sur MAPIO est restic Entièrement open source, il répond aux différentes attentes.

Il lui manque simplement de quoi le configurer avec un fichier de configuration et avoir un système de scheduler qui permet de déclencher une mise à jour à la fréquence voulue. Le wrapper open source resticprofile a donc été utilisé.

L’ensemble est pré-installé dans MAPIO OS via le service resticprofile dans le fichier /home/root/mapio/docker-compose.yml. Un exemple de fichier de configuration est pré-installé dans /usr/local/resticprofile/profiles.yaml.

Configuration sur MAPIO

Choix du backend

La première étape est de choisir votre serveur sur lequel vous allez envoyer les sauvegardes. La documentation de restic détaille les différentes solutions prises en charge : restic-backends

Dans cet article j’utilise le backend en sftp. J’ai configuré un serveur distant accessible en SSH, et ait donné les accès à ma MAPIO sur ce serveur.

docker-compose.yml

Voici la section pour le resticprofile

  resticprofile:
    image: creativeprojects/resticprofile:latest
    container_name: resticprofile
    entrypoint: '/bin/sh'
    command:
      - '-c'
      - 'resticprofile schedule --all && crond -f'
    volumes:
      - /usr/local/resticprofile/.ssh:/root/.ssh
      - /usr/local/resticprofile/profiles.yaml:/etc/resticprofile/profiles.yaml:ro
      - /usr/local/resticprofile/key:/etc/resticprofile/key:ro
      - /usr/local/gitea:/gitea
      - /usr/local/nvme/nextcloud:/nextcloud
      - /usr/local/homeassistant:/homeassistant
      - /usr/local/caddy:/caddy
      - /usr/local/mapio:/mapio
      - /usr/local/mattermost-db:/mattermost-db
      - /usr/local/mattermost:/mattermost
      - /usr/local/zigbee2mqtt:/zigbee2mqtt
    environment:
      - TZ=Europe/Paris

Il faut ajouter dans les volumes une ligne pour chaque dossier que l’on souhaite sauvegarder. Le fichier /usr/local/resticprofile/key contient la clé pour chiffrer la sauvegarde. restic a besoin d’une configuration spécifique pour le sftp passée dans le dossier /usr/local/resticprofile/.ssh/ (à voir dans la section suivante).

Configuration de restic

Pour simplifier l’utilisation de restic, je l’installe directement sur mon PC : restic-install

Puis je crée mon serveur de backup

restic -r sftp:mapio@xxx.xxx.xxx.xxx:/data/mapio/upload init

Le mot de passe généré est celui à copier dans le fichier key présent sur MAPIO. Il faut maintenant faire la configuration côté MAPIO. Tel que décrit dans la documentation de restic, je crée un fichier /usr/local/resticprofile/.ssh/config qui contient les champs suivants :

Host xxx.xxx.xxx.xxx
  HostName xxx.xxx.xxx.xxx
  StrictHostKeyChecking no
  User mapio
  IdentityFile ~/.ssh/id_rsa

Cette configuration permet au sftp de se connecter de manière non interactive.

Il reste plus qu’à compléter le fichier /usr/local/resticprofile/profiles.yml. Voici son contenu :

global:
  scheduler: crond

default:
  password-file: key
  repository: sftp:xxx.xxx.xxx.xxx:/data/mapio/upload
  initialize: true
  backup:
    source:
      - /gitea
      - /nextcloud
      - /homeassistant
      - /caddy
      - /mapio
      - /mattermost-db
      - /mattermost
      - /zigbee2mqtt
      - /etc/resticprofile
    exclude-caches: true
    one-file-system: true
    schedule: "03:00,00"
    schedule-permission: system
    check-before: true
  retention:
    before-backup: false
    after-backup: true
    keep-monthly: 1
    keep-yearly: 1
    keep-last: 10
    prune: true

On retrouve une ligne par dossier sauvegardé correspondant aux volumes du docker-compose.yaml. Le scheduler est configuré de la manière suivante :

  • Sauvegarde tous les jours à 3h du matin
  • Conservation des 10 dernières sauvegardes
  • Conservation d’une sauvegarde par mois et une par an
  • Effacement automatique des vieilles sauvegardes

Cette configuration est à adapter en fonction de vos besoins en suivant la documentation de restic.

Démarrage et test de la sauvegarde

Une fois la configuration faite vous n’avez plus qu’à démarrer le service via la commande habituelle de docker-compose :

docker-compose -f /home/root/mapio/docker-compose.yml up -d resticprofile

Les logs de resticprofile permettent de vérifier que la connexion au serveur s’est bien passée et que la prochaine sauvegarde est prévue.

root@mapio:~/mapio# docker-compose logs -f resticprofile
Attaching to resticprofile
resticprofile    | 2024/05/03 11:14:35 using configuration file: /etc/resticprofile/profiles.yaml
resticprofile    |
resticprofile    | Analyzing backup schedule 1/1
resticprofile    | =================================
resticprofile    |   Original form: 03:00,00
resticprofile    | Normalized form: *-*-* 03:00:00
resticprofile    |     Next elapse: Sat May  4 03:00:00 CEST 2024
resticprofile    |        (in UTC): Sat May  4 01:00:00 UTC 2024
resticprofile    |        From now: 15h45m24s left
resticprofile    |
resticprofile    | 2024/05/03 11:14:35 scheduled job default/backup created
resticprofile    | 2024/05/03 11:15:08 using configuration file: /etc/resticprofile/profiles.yaml
resticprofile    |
resticprofile    | Analyzing backup schedule 1/1
resticprofile    | =================================
resticprofile    |   Original form: 03:00,00
resticprofile    | Normalized form: *-*-* 03:00:00
resticprofile    |     Next elapse: Sat May  4 03:00:00 CEST 2024
resticprofile    |        (in UTC): Sat May  4 01:00:00 UTC 2024
resticprofile    |        From now: 15h44m51s left
resticprofile    |
resticprofile    | 2024/05/03 11:15:08 scheduled job default/backup created

Une fois la première sauvegarde effectuée, je peux vérifier son contenu et la restaurer si besoin depuis mon PC avec la commande suivante :

restic -r sftp:mapio@xxx.xxx.xxx.xxx:/data/mapio/upload snapshots                                                                           ✘ INT  11:18:04
enter password for repository:
repository d473d949 opened (version 2, compression level auto)
ID        Time                 Host          Tags        Paths
---------------------------------------------------------------------------

85adf2e5  2024-04-30 20:10:07  797abed52a9e              /caddy
                                                         /etc/resticprofile
                                                         /gitea
                                                         /homeassistant
                                                         /mapio
                                                         /mattermost
                                                         /mattermost-db
                                                         /nextcloud
                                                         /zigbee2mqtt

340d8bf2  2024-05-02 03:00:10  fc4a284f98da              /caddy
                                                         /etc/resticprofile
                                                         /gitea
                                                         /homeassistant
                                                         /mapio
                                                         /mattermost
                                                         /mattermost-db
                                                         /nextcloud
                                                         /zigbee2mqtt
---------------------------------------------------------------------------