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 }}")
@ -88,7 +90,6 @@ if [[ \ $*\ != *\ --skip-backup\ * ]]; then
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
@ -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