wisski-cloud-distillery/distillery/backup_instance.sh
2022-03-30 15:19:46 +02:00

108 lines
No EOL
3.4 KiB
Bash

#!/bin/bash
set -e
# read the lib/shared.sh and read the slug argument.
DISABLE_LOG=1
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd "$DIR"
source "$DIR/lib/lib.sh"
unset DISABLE_LOG
require_slug_argument
# if the site doesn't exist, I can't open a shell.
if ! sql_bookkeep_exists "$SLUG"; then
log_error "=> Site '$SLUG' does not exist in bookeeping table. "
echo "I can't open a shell there. "
exit 1
fi;
# Read everything from the database
read -r INSTANCE_BASE_DIR MYSQL_DATABASE MYSQL_USER GRAPHDB_REPO GRAPHDB_USER <<< "$(sql_bookkeep_load "${SLUG}" "filesystem_base,sql_database,sql_user,graphdb_repository,graphdb_user" | tail -n +2)"
# prepare the backup
log_info " => Preparing Backup Configuration"
BACKUP_SLUG="$SLUG-$(date +%Y%m%dT%H%M%S)-$(randompw)"
BACKUP_INSTANCE_DIR="$DEPLOY_BACKUP_INPROGRESS_DIR/$BACKUP_SLUG"
BACKUP_LOG_FILE="$BACKUP_INSTANCE_DIR/backup.log"
BACKUP_INFO_FILE="$BACKUP_INSTANCE_DIR/info.txt"
BACKUP_SQL_FILE="$BACKUP_INSTANCE_DIR/$MYSQL_DATABASE.sql"
BACKUP_NQ_FILE="$BACKUP_INSTANCE_DIR/$GRAPHDB_REPO.nq"
BACKUP_FS_DIR="$BACKUP_INSTANCE_DIR/$SLUG"
mkdir -p "$BACKUP_FS_DIR"
BACKUP_FINAL_FILE="$2"
if [ -z "$BACKUP_FINAL_FILE" ]; then
BACKUP_FINAL_FILE="$DEPLOY_BACKUP_FINAL_DIR/$BACKUP_SLUG.tar.gz"
fi
echo "Destination: $BACKUP_FINAL_FILE"
if [ -z "$KEEPALIVE" ]; then
echo "Keepalive: false (set KEEPALIVE variable for a consistent state)"
else
echo "Keepalive: true (unset the KEEPALIVE variable for a consistent state)"
fi
BACKUP_START="$(date +%s)"
function do_the_backup() {
# cd into the right directory
cd "$INSTANCE_BASE_DIR"
# stop
if [ -z "$KEEPALIVE" ]; then
log_info " => Shutting down running system"
docker-compose down
fi
# system info
log_info " => Backup up system information"
/bin/bash "$DIR/info.sh" "$SLUG" > "$BACKUP_INFO_FILE"
# database
log_info " => Backing up MySQL database '$MYSQL_DATABASE'"
dockerized_mysqldump --databases "$MYSQL_DATABASE" > "$BACKUP_SQL_FILE" || echo "Failed, continuing anyways ..."
# triplestore
log_info " => Backing up GraphDB repository '$GRAPHDB_REPO'"
curl -X GET -H "Accept:application/n-quads" $GRAPHDB_AUTH_FLAGS "http://127.0.0.1:7200/repositories/${GRAPHDB_REPO}/statements?infer=false" > "$BACKUP_NQ_FILE" || echo "Failed, contiuing anyways ..."
# filesystem
log_info " => Backing up filesystem from '$INSTANCE_BASE_DIR'"
cp -rpT "$INSTANCE_BASE_DIR" "$BACKUP_FS_DIR" || echo "Failed, continuing anyways ..."
# restart
if [ -z "$KEEPALIVE" ]; then
log_info " => Starting up sytem"
docker-compose up -d
fi
}
# do the actual backup, writing it to a file
do_the_backup 2>&1 | tee "$BACKUP_LOG_FILE"
# list before packaging
log_info " => All backup files have been collected"
ls -alh "$BACKUP_INSTANCE_DIR"
du -hs "$BACKUP_INSTANCE_DIR"
# package up the backup
log_info " => Packaging \"$BACKUP_FINAL_FILE\" "
pushd "$BACKUP_INSTANCE_DIR" > /dev/null
tar --totals --checkpoint=10000 -zcf "$BACKUP_FINAL_FILE" .
popd > /dev/null
# delete the temporary directory
log_info " => Deleting temporary directories"
rm -r "$BACKUP_INSTANCE_DIR"
# and finish!
log_info " => Finished making backup"
DURATION=$[ $(date +%s) - ${BACKUP_START} ]
SIZE=$(wc -c < "$BACKUP_FINAL_FILE")
echo "Output file: '$BACKUP_FINAL_FILE'"
echo "Size: $SIZE bytes"
echo "Duration: $DURATION seconds"