#!/bin/bash #set -o xtrace set -u set -o pipefail if [[ $(id -u) -ne "0" ]]; then printf "Elevated privileges required\n" exit 1 fi usage () { printf "Usage: vvv.sh \n" printf " project = Compose project folder.\n" printf " Option r: restore operation\n" printf " Option d: keep containers down - don't bring back up\n" } RESTORE="false" DOWN="false" OUTPUT=" Option: BACKUP OPERATION" while getopts ':rd' OPT; do case $OPT in r) RESTORE="true"; OUTPUT=" Option: RESTORE OPERATION";; d) DOWN="true"; OUTPUT="${OUTPUT} Option: KEEP DOWN";; \?) usage; exit;; esac done shift $((OPTIND -1)) if [[ $RESTORE == "true" ]] && [[ ! -f docker-restore.sh ]]; then echo "Problem: docker-restore.sh missing!" exit 1 fi ccheck () { printf "${OUTPUT}\n" REPLY=$'\n' timeout 10 bash -c 'read -r -s -N 1 -p "Starting delay of 10 seconds. Press 'Escape' or 'q' to cancel..."' if [[ $REPLY != $'\n' ]]; then printf "${OUTPUT} cancelled.\n" return 1 else printf "${OUTPUT} starting.\n" fi } scripts () { for MODE in backup restore; do FILE="docker-${MODE}.sh" SCRIPT="#!/bin/bash"$'\n' SCRIPT="${SCRIPT}docker run --rm \\"$'\n' SCRIPT="${SCRIPT} --name volumerize \\"$'\n' SCRIPT="${SCRIPT} -e TZ=Australia/Perth \\"$'\n' SCRIPT="${SCRIPT} -e VOLUMERIZE_SOURCE=/source \\"$'\n' SCRIPT="${SCRIPT} -e VOLUMERIZE_TARGET=file:///backup \\"$'\n' SCRIPT="${SCRIPT} -v backup_${PROJECT}-cache:/volumerize-cache \\"$'\n' if [[ $MODE == "restore" ]]; then SCRIPT="${SCRIPT} -v backup_${PROJECT}-volume:/backup:ro \\"$'\n' for VOL in $VOLUMES; do SCRIPT="${SCRIPT} -v ${VOL}:/source/${VOL} \\"$'\n' done SCRIPT="${SCRIPT} blacklabelops/volumerize:1.7.1 restore"$'\n'$'\n' elif [[ $MODE == "backup" ]]; then SCRIPT="${SCRIPT} -v backup_${PROJECT}-volume:/backup \\"$'\n' for VOL in $VOLUMES; do SCRIPT="${SCRIPT} -v ${VOL}:/source/${VOL}:ro \\"$'\n' done SCRIPT="${SCRIPT} blacklabelops/volumerize:1.7.1 backup"$'\n'$'\n' else printf "Fatal error 1.\n" exit 1 fi printf "${SCRIPT}" |sudo -u "#${USER?err}" tee "${FILE}" done } if [[ ! $# -eq 1 ]]; then usage exit 1 fi PROJECT="$1" if [[ ! -d "../${PROJECT}" ]]; then printf "Folder ${1} does not exist!\n" exit 1 fi VOLUMES="$(ls /var/lib/docker/volumes |grep "${PROJECT}_")" if [[ -z "$VOLUMES" ]]; then printf "There are no volumes found to backup/restore!\n" exit 1 fi printf "${OUTPUT}\n" if timeout --preserve-status --foreground 10 bash -c 'read -r -s -N 1 -p "Starting delay of 10 seconds. Press a key to cancel... "'; then printf "cancelled\n" exit 1 else printf "starting\n" fi USER=$(stat -c '%u' $BASH_SOURCE) pushd "../${PROJECT}" > /dev/null || exit 1 if [[ ! $RESTORE == "true" ]]; then scripts fi for COMP in docker-compose*.yml; do if command -v docker-compose; then COMMAND="docker-compose -f $COMP stop" else COMMAND="docker compose -f $COMP stop" fi printf "${COMMAND}\n" if ! bash -c "${COMMAND}"; then printf "Services 'docker compose stop' error." exit 1 fi done for COMP in docker-compose*.yml; do if command -v docker-compose; then COMMAND="docker-compose -f $COMP rm -f" else COMMAND="docker compose -f $COMP rm -f" fi printf "${COMMAND}\n" if ! bash -c "${COMMAND}"; then printf "Services 'docker compose rm' error." exit 1 fi done if [[ $RESTORE == "true" ]]; then bash "./docker-restore.sh" else bash "./docker-backup.sh" if [[ $DOWN = "false" ]]; then for COMP in docker-compose*.yml; do if command -v docker-compose; then COMMAND="docker-compose -f $COMP up -d" else COMMAND="docker compose -f $COMP up -d" fi printf "${COMMAND}\n" if ! bash -c "${COMMAND}"; then printf "Services 'up' error." exit 1 fi done fi fi popd > /dev/null || exit 1