Backrest Dcoker Stop
This commit is contained in:
		
							
								
								
									
										125
									
								
								content/5.nonsense/2.bash/5.backrest-docker-stop.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								content/5.nonsense/2.bash/5.backrest-docker-stop.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
---
 | 
			
		||||
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) is a fantastic backup tool.  
 | 
			
		||||
In the case of [Serveex](https://docu.djeex.fr/serveex/introduction), most of the data that needs to be backed up consists of containers — and those containers often include databases.  
 | 
			
		||||
The problem? You can’t safely back up a database while it’s running.  
 | 
			
		||||
 | 
			
		||||
There are plenty of complex solutions involving database dumps, but often the simplest method is to stop the containers, perform the backup, and then restart them.
 | 
			
		||||
 | 
			
		||||
**Backrest** doesn’t natively provide this functionality, but it does allow the execution of custom scripts triggered by events — for example, at the start and end of a backup plan.  
 | 
			
		||||
 | 
			
		||||
Our goal is to stop the containers whose databases need to be backed up when the backup plan starts, and restart them when the backup plan finishes.
 | 
			
		||||
 | 
			
		||||
To achieve this, we’ll need a small Bash script and a secure connection between Backrest and the Docker socket, to enable the following sequence:
 | 
			
		||||
 | 
			
		||||
- The backup plan starts  
 | 
			
		||||
- The event triggers the execution of a custom script  
 | 
			
		||||
- The script contacts Docker and retrieves a list of containers labeled `backrest.backup.stop=true`  
 | 
			
		||||
- It stops those containers  
 | 
			
		||||
- The backup plan completes  
 | 
			
		||||
- The event triggers another custom script  
 | 
			
		||||
- The script contacts Docker again, retrieves the same list, and restarts those containers  
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Securely Connecting Backrest and Docker
 | 
			
		||||
 | 
			
		||||
To allow **Backrest** to communicate securely with Docker, we’ll use [Docker Socket Proxy](https://github.com/linuxserver/docker-socket-proxy).  
 | 
			
		||||
This avoids exposing the full Docker socket and grants only the necessary permissions.  
 | 
			
		||||
Here’s an example Docker stack:
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
---
 | 
			
		||||
services:
 | 
			
		||||
  backrest:
 | 
			
		||||
    image: garethgeorge/backrest:latest
 | 
			
		||||
    container_name: backrest
 | 
			
		||||
    hostname: backrest
 | 
			
		||||
    security_opt:
 | 
			
		||||
      - no-new-privileges:true
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ...  # your volumes
 | 
			
		||||
    environment:
 | 
			
		||||
      - ...  # your environment variables
 | 
			
		||||
      - DOCKER_HOST=tcp://socket-proxy-backrest:2375
 | 
			
		||||
    restart: unless-stopped
 | 
			
		||||
    ports:
 | 
			
		||||
      - ...  # your 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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
With this setup, Backrest can communicate with Docker safely and securely.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## The Scripts
 | 
			
		||||
 | 
			
		||||
Below are the scripts to use for **Backrest**’s *start* and *end* backup events.
 | 
			
		||||
 | 
			
		||||
::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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## The Label
 | 
			
		||||
 | 
			
		||||
Once the scripts are in place and configured for the proper **Backrest** hooks, you just need to add the label `backrest.backup.stop=true` to the `compose.yaml` files of the containers that should stop and restart during backups:
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
services:
 | 
			
		||||
  your_service:
 | 
			
		||||
    ...
 | 
			
		||||
    labels:
 | 
			
		||||
      - backrest.backup.stop=true
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
And that’s it!  
 | 
			
		||||
At the next backup, all containers with the correct label will automatically stop during the backup and restart once it’s finished.
 | 
			
		||||
		Reference in New Issue
	
	Block a user