add: backup scripts and docker image

This commit is contained in:
2024-10-17 19:38:31 -03:00
parent 3a2d6f32f0
commit 604a514632
7 changed files with 200 additions and 0 deletions

BIN
scripts/.DS_Store vendored Executable file

Binary file not shown.

69
scripts/backup-mysql.sh Normal file
View File

@@ -0,0 +1,69 @@
#! /bin/sh
#
# MySQL Backup
# Do backup of one or all databases of a given MySQL server
#
#
# List Databases
#
# only argument is a database url
DB_URL="$1";
# load database values as environment variables while checking URL validity
dburl-parser.sh ${DB_URL} > /tmp/ofelia.dotenv;
source /tmp/ofelia.dotenv;
rm /tmp/ofelia.dotenv;
# set backup destination
## directory path
BACKUP_DATABASES_PATH=${BACKUP_DATABASES_PATH:-/var/data/backup-databases};
mkdir -p ${BACKUP_DATABASES_PATH};
## file name
BACKUP_DATABASES_PREFIX="backup-";
BACKUP_DATABASES_SUFFIX="SQL";
if test "${DB_NAME}" = '*'; then
databases=$(mysql\
--user=${DB_USERNAME}\
--password=${DB_PASSWORD}\
--host="${DB_HOST}"\
--execute="SHOW DATABASES;"\
--vertical\
--column-names=false\
| grep -ve ^\*\
| xargs
);
else
databases="${DB_NAME:-:ALL_DATABASES:}";
fi
for database_item in ${databases}; do
if test -z "${database_item}"; then
continue;
elif test "${database_item}" = ":ALL_DATABASES:"; then
database="--all-databases";
filename_database="all-databases";
else
database="--databases ${database_item}";
filename_database="${database_item}";
fi
cat | xargs mysqldump << HEREDOC
$(test -n ${DB_USERNAME} && echo "--user=${DB_USERNAME}")
$(test -n ${DB_PASSWORD} && echo "--password=${DB_PASSWORD}")
$(test -n ${DB_HOST} && echo "--host=${DB_HOST}")
$(test -n ${DB_PORT} && echo "--port=${DB_PORT}")
--result-file=$(
printf '%s/%s%s-%s_%s.%s'\
${BACKUP_DATABASES_PATH}\
${BACKUP_DATABASES_PREFIX}\
${DB_HOST}\
${filename_database}\
$(date +%s)\
${BACKUP_DATABASES_SUFFIX}
)
${database}
HEREDOC
done

40
scripts/dburl-parser.sh Executable file
View File

@@ -0,0 +1,40 @@
#! /bin/sh
#
# Parses a database URL in the format schema://user:
#
DB_URL="$1";
SCHEMA="${DB_URL%//*}";
SCHEMALESS_URL=${DB_URL#*//};
LEFT_HAND=${SCHEMALESS_URL%@*};
if test ! ${LEFT_HAND} = ${SCHEMALESS_URL}; then
USERNAME=$(echo ${LEFT_HAND} | cut -d ':' -f 1);
if test ! ${USERNAME} = ${LEFT_HAND}; then
PASSWORD=$(echo ${LEFT_HAND} | cut -d ':' -f 2);
fi
fi
RIGHT_HAND=${SCHEMALESS_URL#*@};
HOST=$(echo ${RIGHT_HAND} | cut -d ':' -f 1 | cut -d '/' -f 1);
if test -n "$(echo ${RIGHT_HAND} | grep -o ':')"; then
PORT=$(echo ${RIGHT_HAND} | cut -d ':' -f 2 | cut -d '/' -f 1);
fi
if test -n "$(echo ${RIGHT_HAND} | grep -o '/')"; then
DATABASE=$(echo ${RIGHT_HAND} | cut -d ':' -f 2 | cut -d '/' -f 2);
fi
# throw an error if DB_URL does not contains at least a HOST
if test -z "${HOST}"; then
echo "database URL providen was invalid" && exit 1;
fi
cat << HEREDOC
DB_SCHEMA=${SCHEMA%:}
DB_USERNAME=${USERNAME}
DB_PASSWORD=${PASSWORD}
DB_HOST=${HOST}
DB_PORT=${PORT}
DB_NAME=${DATABASE}
HEREDOC

View File

@@ -0,0 +1,8 @@
#! /bin/sh
#
# MySQL install tools
# Install mysql and mysqldump to container
#
apk update && apk add mysql-client;

69
scripts/ofelia-config.sh Executable file
View File

@@ -0,0 +1,69 @@
#! /bin/sh
#
# Do nothing if there is no URLs to proccess
#
if test -z "${BACKUP_DATABASES}"; then
echo >&2 "missing a list of db urls on \$BACKUP_DATABASES env var"\
&& exit 1;
fi
#
# Create output file if --saved option was set
#
while test $# -gt 0; do
arg_value="$1";
shift;
if test "${arg_value}" = "--save"; then
output_path=${OFELIA_CONFIG_PATH:-/etc/ofelia/config.ini};
mkdir $(dirname $output_path);
touch ${output_path};
fi
done
if test -z "${output_path}"; then
output_path=/dev/stdout;
fi
for entry in "${BACKUP_DATABASES}"; do
# normalize spaces
backup_data=$(echo ${entry} | xargs);
# skip if it is a empty line
if test -z "${backup_data}"; then
continue;
fi
# remove everything after first space to filter URL
DB_URL=${backup_data%% *};
# remove everything before the first space to get cron label
BACKUP_SCHEDULE=${backup_data#* };
# load url data as variables
dburl-parser.sh ${DB_URL} > /tmp/ofelia.dotenv;
source /tmp/ofelia.dotenv;
rm /tmp/ofelia.dotenv;
# fail if $DB_URL has no schema
if test -z "${DB_SCHEMA}"; then
1>&2 echo "invalid entry in \$BACKUP_DATABASES: ${entry}";
exit 7;
fi
# strip final : and convert schema to lowercase
schema="$(echo ${DB_SCHEMA%:} | tr '[:upper:]' '[:lower:]')";
# install schema related tools in advance
install-${schema}-tools.sh
# save backup command : should there be one script per database type
bkp_command="backup-${schema}.sh --url=${DB_URL}";
# BACKUP_SCHEDULE defaults to @daily
bkp_schedule="${BACKUP_SCHEDULE:-@daily}";
# set a title to ofelia job
bkp_title="backup-${DB_HOST}";
if test -n "${DB_NAME}"; then
bkp_title="${bkp_title}-${DB_NAME}";
fi
# add a entry to this backup in ofelia config file
cat >> ${output_path} << HEREDOC
# sending data to ${output_path}
[job-local "${bkp_title}"]
$(if test "${DEBUG}" = "on"; then echo "save-only-on-error = false"; fi)
no-overlap = true
command = ${bkp_command}
schedule = ${bkp_schedule}
HEREDOC
done;

3
scripts/ofelia-run.sh Executable file
View File

@@ -0,0 +1,3 @@
#! /bin/sh
ofelia-config.sh && ofelia daemon;