Une façon de sauvegarder tes serveurs en utilisant un bucket s3

Imagine que tu héberges une application, un blog chez un fournisseur cloud, et que tu ne veuilles pas payer un supplément pour du stockage de sauvegarde.

Tu as déjà une infrastructure locale mais tu n’as pas encore de stockage s3.

Je vais t’expliquer ici comment j’ai déployé une architecture de sauvegarde pour tous mes serveurs, qu’ils soient auto-hébergés ou dans le cloud.

Source : https://github.com/sinnwerkstatt/runrestic

Déployer Minio

Comme d’habitude, j’utilise mon NAS Synology pour héberger le service minio et un docker-compose.

Je commence par créer un nouveau répertoire (ou un partage si tu préfères) pour héberger mes données minio

1$ mkdir -p /volume1/docker/minio

Personnellement j’utilise portainer pour gérer mes conteneurs docker car je n’aime pas trop l’application docker basique et trop simple du DSM….

Mon docker-compose.yml ressemble à ça

 1version: '3'
 2services:
 3  minio:
 4    image: quay.io/minio/minio:RELEASE.2023-05-27T05-56-19Z
 5    volumes:
 6      - /volume1/docker/minio:/data
 7    ports:
 8      - 32769:9000
 9      - 32768:9001
10    environment:
11      MINIO_ROOT_USER: 'root'
12      MINIO_ROOT_PASSWORD: 'password'
13      MINIO_ADDRESS: ':9000'
14      MINIO_CONSOLE_ADDRESS: ':9001'
15      VIRTUAL_HOST: 's3.example.com'
16      VIRTUAL_PORT: ':443'
17    command: minio server /data

Il serait sans doute plus simple de mettre Minio derrière un reverse proxy Nginx ou traefik, mais je ne vais pas couvrir ça ici. Je pars du principe que tu l’as déjà fait et que ton service est joignable par restic via s3.example.com.

Créer le bucket restic

Connecte-toi à la console d’administration minio (disons que mon serveur hébergeant minio s’appelle backup.example.com) via le port 9001 : http://backup.example.com:9001

Utilise les valeurs de MINIO_ROOT_USER et MINIO_ROOT_PASSWORD.

Dans la section Administrator, clique sur Buckets puis Create Bucket Définis un nom pour ton bucket et sélectionne les fonctionnalités que tu veux. Ici je n’ai pas besoin du versionning de fichiers, je laisse restic s’en occuper, ni du Object locking.

Je définis juste un Quota par sécurité à 1Go (seulement pour la démo)

Créer l’utilisateur et la policy

La prochaine étape est de créer un utilisateur capable de lire et écrire sur le bucket.

On va d’abord créer un utilisateur : dans la section Administrator, clique sur Identity - Users puis Create user :

Ne sélectionne aucune policy pour l’instant, on va en créer une nouvelle !

Dans la section Administrator, clique sur Policies puis Create Policy

Comme les policies sont au format json, il faut coller quelque chose comme ça :

 1{
 2    "Version": "2012-10-17",
 3    "Statement": [
 4        {
 5            "Sid": "BucketAccessForUser",
 6            "Effect": "Allow",
 7            "Action": [
 8                "s3:*"
 9            ],
10            "Resource": [
11                "arn:aws:s3:::backup",
12                "arn:aws:s3:::backup/*"
13            ]
14        }
15    ]
16}

Attention

Note qu’on autorise toutes les méthodes sous Action (ce qui veut dire que l’utilisateur est admin du bucket) et qu’on filtre sous Resource où ça s’applique. Dans notre cas c’est lié au bucket backup.

Ensuite tu peux éditer l’utilisateur créé précédemment et lui assigner la policy.

La dernière étape consiste à créer un Service account pour cet utilisateur (utilisé par restic). Dans l’onglet Service Accounts, clique sur Create Access Key puis simplement sur Create Tu devrais être invité à télécharger un fichier json contenant l’access key et la secret key.

Et voilà, la partie Minio est terminée !

Configurer le client restic

Installer les outils nécessaires

1$ yum install -y restic python3-pip
2$ pip3 install --upgrade runrestic

Créer la configuration runrestic

Tu vas devoir adapter ce fichier de configuration selon tes besoins :

  • repositories : il faut changer le fqdn, ou simplement mettre l’adresse ip et le port si c’est sur le même réseau
  • AWS_ACCESS_KEY_ID : à récupérer dans le fichier json
  • AWS_SECRET_ACCESS_KEY : à récupérer dans le fichier json
  • RESTIC_PASSWORD : utilise le générateur de mot de passe de ton choix
 1name = "blog backup" # optional. if not set, the filename will be used without the extension
 2
 3repositories = [
 4    "s3:https://s3.example.com/backup/"
 5    ]
 6
 7[execution]
 8parallel = true
 9retry_count = 10
10retry_backoff = "1:00 exponential"  # 00:00 = min:sec; 00:00:00 = hour:min:sec
11# strategies:
12#  - static (same duration every try)
13#  - linear (duration * retry number)
14#  - exponential
15
16[environment]
17AWS_DEFAULT_REGION="eu-west-1"
18AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxx"
19AWS_SECRET_ACCESS_KEY="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
20RESTIC_PASSWORD="qqqqqqqqqqqqqqqqqqqqqq"
21
22# or RESTIC_PASSWORD_FILE
23# https://restic.readthedocs.io/en/latest/040_backup.html#environment-variables
24
25[backup]
26sources = [
27    "/opt/"
28    ]
29
30exclude_patterns = []
31# exclude_files = []
32# exclude_if_present = []
33
34pre_hooks = ["systemctl stop myapp"]
35post_hooks = ["systemctl start myapp"]
36
37[prune]
38keep-last =  3
39keep-hourly =  5
40keep-weekly = 10
41keep-monthly = 30
42group-by = "host,paths"
43# https://restic.readthedocs.io/en/latest/060_forget.html#removing-snapshots-according-to-a-policy
44
45[check]
46checks = ["check-unused", "read-data"]

Initialiser le dépôt restic

La première fois que tu déploies restic, tu dois initialiser le dépôt sur le bucket s3 (ça ne se fait qu’une seule fois pour tous tes serveurs)

1/usr/local/bin/runrestic init 

Si tout se passe bien tu devrais voir des répertoires et fichiers créés Lance ta première sauvegarde

Il suffit de lancer sans aucun argument

1/usr/local/bin/runrestic

Planifier avec les timers systemd

Crée un fichier systemd dans /etc/systemd/system/runrestic.service

1[Unit]
2Description=runrestic backup
3
4[Service]
5Type=oneshot
6ExecStart=/usr/local/bin/runrestic

Et crée un timer service

1[Unit]
2Description=Run runrestic backup
3
4[Timer]
5OnCalendar=daily
6Persistent=true
7
8[Install]
9WantedBy=timers.target

Activer la configuration systemd

1systemctl enable runrestic.timer
2systemctl start runrestic.timer

Et voilà, c’est terminé !

Pour aller plus loin

Si tu veux obtenir un tableau de bord de tes jobs de sauvegarde, tu peux déployer un exporter prometheus pour restic : https://github.com/ngosang/restic-exporter

Bien sûr il te faudra une instance prometheus et une instance grafana pour afficher le tableau de bord

comments powered by Disqus