4.1 KiB
navigation, title, main
| navigation | title | main | ||
|---|---|---|---|---|
| true | Backrest Docker Stop |
|
:ellipsis{left=0px width=40rem top=10rem blur=140px}
Backrest Docker Stop
Backrest est un formidable outil de backup. Dans le cas de Serveex, la majeure partie des données à sauvegarder sont des conteneurs, et souvent ces conteneurs possèdent des bases de données. Le problème ? On ne peut pas sauvegarder proprement une BDD qui est en route. Alors, il existe plein de solutions complexe à base de dump des bases de données, mais souvent le plus simple cela reste de stopper les conteneurs, de sauvegarder, et de redémarrer les conteneurs.
Backrest ne propose pas de solutions native, mais il propose d'executer des scripts customisés à déclencher sur des évenements, comme le démarrage et la fin de la sauvegarde par exemple. Notre besoin est donc de stopper les conteneurs dont on veut sauvegarder la BDD, à chaque démarrage du plan de sauvegarde, et de les redémarrer à la fin de l'execution du plan de sauvegarde.
Pour cela nous allons avoir besoin d'un script bash et de connecter Backrest au socker de Docker, afin d'avoir la cinématique suivante :
- Le plan de sauvegarde se met en route
- L'evenement déclenche l'execution d'un script custom
- Le script contacte docker et demande la liste des conteneurs qui comportent le label
backrest.backup.stop=true - Il récupère cette liste et leur envoie une commande d'extinction
- Le plan de sauvegarde s'arrête
- L'evenement déclenche l'execution d'un script custom
- Le script contacte docker et demande la liste des conteneurs qui comportent le label
backrest.backup.stop=true - Il récupère cette liste et leur envoie une commande de démarrage
Faire communiquer Backrest et Docker en toute sécurité
Pour faire communiquer Backrest et Docker en toute sécurité, nous utiliserons Docker Socket Proxy, afin de n'accorder que les droits nécessaires plutot que d'exposer l'intégralité du socket à Docker. Voici donc la stack :
---
services:
backrest:
image: garethgeorge/backrest:latest
container_name: backrest
hostname: backrest
security_opt:
- no-new-privileges:true
volumes:
- ... # vos volumes
environment:
- ... # vos variables
- DOCKER_HOST=tcp://socket-proxy-backrest:2375
restart: unless-stopped
ports:
- ... # vos ports
depends_on:
- socket-proxy
socket-proxy:
image: lscr.io/linuxserver/socket-proxy:latest
container_name: socket-proxy-backrest
security_opt:
- no-new-privileges:true
environment:
- CONTAINERS=1
- ALLOW_START=1
- ALLOW_STOP=1
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
read_only: true
tmpfs:
- /run
Et voilà, Backrest pourra ainsi communiquer avec Docker en toute sécurité.
Les scripts
Vous trouverez ci-dessous les scripts à renseigner en action pour les évèvenements de démarrage et d'arrêt de la sauvegarde dans Backrest.
::code-group
#!/usr/bin/env bash
BACKUP_LABEL="backrest.backup.stop=true"
BACKUP_CONTAINERS=$(docker ps -aqf "label=$BACKUP_LABEL")
for BC in $BACKUP_CONTAINERS
do
docker stop "$BC"
done
sleep 10
#!/usr/bin/env bash
BACKUP_LABEL="backrest.backup.stop=true"
BACKUP_CONTAINERS=$(docker ps -aqf "label=$BACKUP_LABEL")
for BC in $BACKUP_CONTAINERS
do
docker stop "$BC"
done
sleep 10
::
Le label
Une fois les scripts renseignés et paramétrés pour les bons hooks dans Backrest, vous n'avez plus qu'à ajouter le libellé backrest.backup.stop=true dans les fichiers compose.yaml des conteneurs à éteindre et rallumer durant les sauvegardes :
services:
votre_service:
...
labels:
- com.centurylinklabs.watchtower.enable=true
Et voilà, à la prochaine sauvegarde, les conteneurs correctement labelisés s'arreteront pendant la sauvegarde et redémarreront tout seuls à la fin.