147 lines
3.6 KiB
Bash
Executable File
147 lines
3.6 KiB
Bash
Executable File
#!/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 <options> <project>\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))
|
|
|
|
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" ]] && [[ ! -f docker-restore.sh ]]; then
|
|
echo "Problem: docker-restore.sh missing!"
|
|
exit 1
|
|
fi
|
|
|
|
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
|
|
|