backup multiple paths #5
|
@ -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)
|
||||
|
||||
|
|
23
backup.sh
23
backup.sh
|
@ -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}"
|
||||
|
||||
|
||||
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?
|
||||
3wordchant
commented
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
philippr
commented
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
3wordchant
commented
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Wondering if we can add a config option for this, but fine for the moment.
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.