--- 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 start "$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.