Backrest Docker Stop
This commit is contained in:
		
							
								
								
									
										109
									
								
								content/5.betises/2.bash/5.backrest-docker-stop.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								content/5.betises/2.bash/5.backrest-docker-stop.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,109 @@
 | 
			
		||||
---
 | 
			
		||||
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.
 | 
			
		||||
		Reference in New Issue
	
	Block a user