backup multiple paths #5

Merged
3wordchant merged 4 commits from multi_path into main 2021-12-14 14:44:06 +00:00
2 changed files with 17 additions and 10 deletions

View File

@ -52,11 +52,11 @@ services:
backupbot.backup: "true"
backupbot.backup.pre-hook: 'mysqldump -u root -p"$(cat /run/secrets/db_root_password)" -f /tmp/dump/dump.db'
backupbot.backup.post-hook: "rm -rf /tmp/dump/dump.db"
backupbot.backup.path: "/tmp/dump/"
backupbot.backup.path: "/tmp/dump/,/etc/foo/"
```
- `backupbot.backup` -- set to `true` to back up this service (REQUIRED)
- `backupbot.backup.path` -- file path within the service to copy (REQUIRED)
- `backupbot.backup.path` -- comma separated list of file paths within the service to copy (REQUIRED)
- `backupbot.backup.pre-hook` -- command to run before copying files (optional)
- `backupbot.backup.post-hook` -- command to run after copying files (optional)

View File

@ -21,7 +21,7 @@ if [ -n "$ssh_key_file" ] && [ -f "$ssh_key_file" ]; then
# Only check server against provided SSH_HOST_KEY, if set
if [ -n "$SSH_HOST_KEY" ]; then
tmpfile=$(mktemp)
echo "$SSH_HOST_KEY" >> "$tmpfile"
echo "$SSH_HOST_KEY" >>"$tmpfile"
echo "using host key $SSH_HOST_KEY"
ssh_options="-o 'UserKnownHostsFile $tmpfile'"
elif [ "$SSH_HOST_KEY_DISABLE" = "1" ]; then
@ -72,6 +72,8 @@ else
fi
if [[ \ $*\ != *\ --skip-backup\ * ]]; then
rm -rf "${backup_path}"
Review

Wondering if we can add a config option for this, but fine for the moment.

Wondering if we can add a config option for this, but fine for the moment.
Review

agree! I added this because I realized that the backupbots volume could potentially grow for ever in my usecase, as the copy doesn't delete any files that don't exist anymore. But for other usecases it might be good to disable it.

agree! I added this because I realized that the backupbots volume could potentially grow for ever in my usecase, as the copy doesn't delete any files that don't exist anymore. But for other usecases it might be good to disable it.
for service in "${services[@]}"; do
echo "service: $service"
details=$(docker service inspect "$service" --format "{{ json .Spec.Labels }}")
@ -79,17 +81,16 @@ if [[ \ $*\ != *\ --skip-backup\ * ]]; then
pre=$(echo "$details" | jq -r '.["backupbot.backup.pre-hook"]')
post=$(echo "$details" | jq -r '.["backupbot.backup.post-hook"]')
path=$(echo "$details" | jq -r '.["backupbot.backup.path"]')
if [ "$path" = "null" ]; then
echo "ERROR: missing 'path' for $service"
continue # or maybe exit?
continue # or maybe exit?
Review

This was deliberate, but I guess there isn't much of a bash coding standard. Closest I could find is some random person on stackoverflow who agrees with me 🙃 https://stackoverflow.com/a/1496301/14269772

This was deliberate, but I guess there isn't much of a bash coding standard. Closest I could find is some random person on stackoverflow who agrees with me 🙃 https://stackoverflow.com/a/1496301/14269772
Review

oh, I didn't intend to start a argument on coding style. I'll blame my opionated autoformatter for this one :D I'm totally fine having two spaces

oh, I didn't intend to start a argument on coding style. I'll blame my opionated autoformatter for this one :D I'm totally fine having two spaces
Review

i'll happily defer to comrade auto-formatter, great way to finish any arguments 😁

i'll happily defer to comrade auto-formatter, great way to finish any arguments 😁
fi
container=$(docker container ls -f "name=$service" --format '{{ .ID }}')
echo "backing up $service"
test -d "$backup_path/$service" || mkdir "$backup_path/$service"
if [ "$pre" != "null" ]; then
# run the precommand
# shellcheck disable=SC2086
@ -97,7 +98,12 @@ if [[ \ $*\ != *\ --skip-backup\ * ]]; then
fi
# run the backup
docker cp "$container:$path" "$backup_path/$service"
for p in ${path//,/ }; do
# creates the parent folder, so `docker cp` has reliable behaviour no matter if $p ends with `/` or `/.`
dir=$backup_path/$service/$(dirname "$p")
test -d "$dir" || mkdir -p "$dir"
docker cp -a "$container:$p" "$dir/$(basename "$p")"
done
if [ "$post" != "null" ]; then
# run the postcommand
@ -115,5 +121,6 @@ if [[ \ $*\ != *\ --skip-backup\ * ]]; then
fi
if [[ \ $*\ != *\ --skip-upload\ * ]]; then
_restic backup --tag coop-cloud "$backup_path"
_restic backup --host "$server_name" --tag coop-cloud "$backup_path"
fi