This commit is contained in:
Andrew Hurley 2022-11-23 20:57:04 +11:00
parent 46ec2d2a95
commit cdfb0697c1
3 changed files with 36 additions and 25 deletions

View File

@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
pushd /srv/backup && ./vvv.sh docker && nice ./v2b.sh -u backup_docker && popd pushd /srv/backup && ./vvv.sh docker && ./vvv.sh mailus && nice ./v2b.sh -u backup && popd

26
v2b.sh
View File

@ -4,6 +4,11 @@
set -u set -u
set -o pipefail set -o pipefail
if [[ $(id -u) -ne "0" ]]; then
printf "Elevated privileges required\n"
exit 1
fi
UMASK="$(umask)" UMASK="$(umask)"
cprompt () { cprompt () {
@ -21,7 +26,7 @@ cprompt () {
usage () { usage () {
printf "v2b.sh <option> [ <prefix> ]\n" printf "v2b.sh <option> [ <prefix> ]\n"
printf " <prefix> only backup volumes with this prefix\n" printf " <prefix> only backup volumes with this prefix (underscore not required)\n"
printf " option: k (keep existing backups)\n" printf " option: k (keep existing backups)\n"
printf " option: p (remove prefix from tar archive file name\n" printf " option: p (remove prefix from tar archive file name\n"
printf " option: u (unattended backup)\n" printf " option: u (unattended backup)\n"
@ -49,9 +54,9 @@ shift $((OPTIND -1))
FOLDER="_vols_" FOLDER="_vols_"
if [[ $# > 0 ]]; then if [[ $# > 0 ]]; then
VOLUMES="$(sudo docker volume ls -q |grep "${1}_")" VOLUMES="$(docker volume ls -q |grep "${1}_")"
else else
VOLUMES="$(sudo docker volume ls -q)" VOLUMES="$(docker volume ls -q)"
fi fi
if [[ -z $VOLUMES ]]; then if [[ -z $VOLUMES ]]; then
@ -65,9 +70,10 @@ else
LASTF="${FOLDER}" LASTF="${FOLDER}"
fi fi
USER=$(stat -c '%u' $BASH_SOURCE)
INDEX="$((( ${LASTF#${FOLDER}} + 0 )))" INDEX="$((( ${LASTF#${FOLDER}} + 0 )))"
NEWFL="${FOLDER}$(printf "%05d" $((( ${INDEX} + 1 ))))" NEWFL="${FOLDER}$(printf "%05d" $((( ${INDEX} + 1 ))))"
TEMPF="$(mktemp -dt -p $PWD _XXXXXXXXXXXXXXX_)" TEMPF="$(sudo -u #${USER?err} mktemp -dt -p $PWD _XXXXXXXXXXXXXXX_)"
for VOL in ${VOLUMES}; do for VOL in ${VOLUMES}; do
if [[ $REMOVE == "true" ]]; then if [[ $REMOVE == "true" ]]; then
@ -81,12 +87,12 @@ for VOL in ${VOLUMES}; do
fi fi
printf "\n${VOL} --> ${TEMPF}/${TAR}\n" printf "\n${VOL} --> ${TEMPF}/${TAR}\n"
cprompt || continue cprompt || continue
sudo docker run --rm --log-driver none \ docker run --rm --log-driver none \
-v "${VOL}:/volume" \ -v "${VOL}:/volume" \
-v "${TEMPF}:/backup" \ -v "${TEMPF}:/backup" \
loomchild/volume-backup backup -v "${TAR}" loomchild/volume-backup backup -v "${TAR}"
if [[ -f "${TEMPF}/${TAR}" ]]; then if [[ -f "${TEMPF}/${TAR}" ]]; then
sudo chmod 600 "${TEMPF}/${TAR}" chmod 600 "${TEMPF}/${TAR}"
fi fi
done done
@ -101,12 +107,12 @@ else
if mv "${TEMPF}" "${FOLDER}"; then if mv "${TEMPF}" "${FOLDER}"; then
if [[ $SEND == "true" ]]; then if [[ $SEND == "true" ]]; then
if [[ $ADDR =~ ":" ]]; then if [[ $ADDR =~ ":" ]]; then
if sudo ssh "${ADDR%:*}" "mkdir -p ${ADDR#*:}"; then if ssh "${ADDR%:*}" "mkdir -p ${ADDR#*:}"; then
sudo scp "${FOLDER}"/* "${ADDR}" scp "${FOLDER}"/* "${ADDR}"
fi fi
else else
if sudo ssh "${ADDR}" "mkdir -p ${PWD}/_$(hostname -f)_"; then if ssh "${ADDR}" "mkdir -p ${PWD}/_$(hostname -f)_"; then
sudo scp "${FOLDER}"/* "${ADDR}:${PWD}/_$(hostname -f)_" scp "${FOLDER}"/* "${ADDR}:${PWD}/_$(hostname -f)_"
fi fi
fi fi
fi fi

33
vvv.sh
View File

@ -4,6 +4,11 @@
set -u set -u
set -o pipefail set -o pipefail
if [[ $(id -u) -ne "0" ]]; then
printf "Elevated privileges required\n"
exit 1
fi
usage () { usage () {
printf "Usage: vvv.sh <project>\n" printf "Usage: vvv.sh <project>\n"
printf " project = Compose project folder.\n" printf " project = Compose project folder.\n"
@ -32,7 +37,7 @@ scripts () {
for MODE in backup restore; do for MODE in backup restore; do
FILE="docker-${MODE}.sh" FILE="docker-${MODE}.sh"
SCRIPT="#!/bin/bash"$'\n' SCRIPT="#!/bin/bash"$'\n'
SCRIPT="${SCRIPT}sudo docker run --rm \\"$'\n' SCRIPT="${SCRIPT}docker run --rm \\"$'\n'
SCRIPT="${SCRIPT} --name volumerize \\"$'\n' SCRIPT="${SCRIPT} --name volumerize \\"$'\n'
SCRIPT="${SCRIPT} -e TZ=Australia/Perth \\"$'\n' SCRIPT="${SCRIPT} -e TZ=Australia/Perth \\"$'\n'
SCRIPT="${SCRIPT} -e VOLUMERIZE_SOURCE=/source \\"$'\n' SCRIPT="${SCRIPT} -e VOLUMERIZE_SOURCE=/source \\"$'\n'
@ -54,8 +59,7 @@ scripts () {
printf "Fatal error 1.\n" printf "Fatal error 1.\n"
exit 1 exit 1
fi fi
printf "${SCRIPT}" > "${FILE}" printf "${SCRIPT}" |sudo -u "#${USER?err}" tee "${FILE}"
chmod +x "${FILE}"
done done
} }
@ -70,46 +74,47 @@ if [[ ! -d "../${PROJECT}" ]]; then
exit 1 exit 1
fi fi
VOLUMES="$(sudo ls /var/lib/docker/volumes |grep "${PROJECT}_")" VOLUMES="$(ls /var/lib/docker/volumes |grep "${PROJECT}_")"
if [[ -z "$VOLUMES" ]]; then if [[ -z "$VOLUMES" ]]; then
printf "There are no volumes found to backup/restore!\n" printf "There are no volumes found to backup/restore!\n"
exit 1 exit 1
fi fi
USER=$(stat -c '%u' $BASH_SOURCE)
pushd "../${PROJECT}" > /dev/null || exit 1 pushd "../${PROJECT}" > /dev/null || exit 1
if [[ ! $RESTORE == "true" ]]; then if [[ ! $RESTORE == "true" ]]; then
scripts scripts
fi fi
for COMP in docker-compose*.yml; do for COMP in docker-compose*.yml; do
COMMAND="sudo docker compose -f $COMP stop" COMMAND="docker compose -f $COMP stop"
printf "${COMMAND}\n" printf "${COMMAND}\n"
${COMMAND} if ! bash -c "${COMMAND}"; then
if ! ${COMMAND}; then
printf "Services 'docker compose stop' error." printf "Services 'docker compose stop' error."
exit 1 exit 1
fi fi
done done
for COMP in docker-compose*.yml; do for COMP in docker-compose*.yml; do
COMMAND="sudo docker compose -f $COMP rm -f" COMMAND="docker compose -f $COMP rm -f"
printf "${COMMAND}\n" printf "${COMMAND}\n"
${COMMAND} if ! bash -c "${COMMAND}"; then
if ! ${COMMAND}; then
printf "Services 'docker compose rm' error." printf "Services 'docker compose rm' error."
exit 1 exit 1
fi fi
done done
if [[ $RESTORE == "true" ]]; then if [[ $RESTORE == "true" ]]; then
"./docker-restore.sh" bash "./docker-restore.sh"
else else
"./docker-backup.sh" bash "./docker-backup.sh"
if [[ $DOWN = "false" ]]; then if [[ $DOWN = "false" ]]; then
for COMP in docker-compose*.yml; do for COMP in docker-compose*.yml; do
COMMAND="sudo docker compose -f $COMP up -d" COMMAND="docker compose -f $COMP up -d"
printf "${COMMAND}\n" printf "${COMMAND}\n"
if ! ${COMMAND}; then if ! bash -c "${COMMAND}"; then
printf "Services 'up' error." printf "Services 'up' error."
exit 1 exit 1
fi fi