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