#!/bin/sh # Backs up a QM deployment made with the Docker target into one private # archive: the deployment folder (settings and secrets), the CLI's state, # a Postgres dump, core's data volume, and every agent computer's home. # Usage: backup.sh [org] [deployment folder] [backup folder] set -eu org="${1:-team}" dir="${2:-$HOME/qm}" dest="${3:-$HOME/backups/qm}" keep="${QM_BACKUP_KEEP:-14}" umask 077 mkdir -p "$dest" stamp="$(date -u +%Y%m%d-%H%M%S)" work="$(mktemp -d "$dest/.qm-$stamp.XXXXXX")" trap 'rm -rf "$work"' EXIT tool_image="$(docker inspect -f '{{.Config.Image}}' "qm-$org-pg")" tar -C "$HOME" -czf "$work/deployment.tgz" --exclude=node_modules \ "$(realpath --relative-to="$HOME" "$dir")" ".config/qm/deployments/$org" docker exec "qm-$org-pg" pg_dump -U postgres -Fc qm > "$work/qm.dump" mkdir "$work/volumes" for vol in "qm-$org-coredata" $(docker volume ls -q --filter name='^qm-home-'); do docker run --rm --network none -v "$vol:/v:ro" --entrypoint tar "$tool_image" \ -C /v -czf - . > "$work/volumes/$vol.tgz" done tar -C "$work" -cf "$dest/qm-$org-$stamp.tar" . ls -1t "$dest"/qm-"$org"-*.tar | tail -n +"$((keep + 1))" | xargs -r rm -f echo "$dest/qm-$org-$stamp.tar"