112 lines
4.1 KiB
Markdown
112 lines
4.1 KiB
Markdown
---
|
|
navigation: true
|
|
title: Backrest Docker Stop
|
|
main:
|
|
fluid: false
|
|
---
|
|
:ellipsis{left=0px width=40rem top=10rem blur=140px}
|
|
|
|
# Backrest Docker Stop
|
|
---
|
|
|
|
[Backrest](https://github.com/garethgeorge/backrest) est un formidable outil de backup. Dans le cas de [Serveex](https://docu.djeex.fr/fr/serveex/introduction), 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](https://github.com/linuxserver/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 :
|
|
|
|
```yaml
|
|
---
|
|
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
|
|
```sh [Stop]
|
|
#!/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
|
|
```
|
|
```sh [Start]
|
|
#!/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 :
|
|
|
|
```yaml
|
|
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.
|