add: backup scripts and docker image
This commit is contained in:
11
Dockerfile
Normal file
11
Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
FROM mcuadros/ofelia:latest
|
||||||
|
|
||||||
|
COPY --chmod=775 ./scripts /usr/local/bin
|
||||||
|
|
||||||
|
RUN mkdir -p ${BACKUP_PATH:-/var/data/backup}
|
||||||
|
|
||||||
|
ARG OFELIA_CONFIG_PATH=/etc/ofelia/config.ini
|
||||||
|
ARG DEBUG
|
||||||
|
ARG BACKUP_DATABASES
|
||||||
|
|
||||||
|
RUN ofelia-config.sh --save
|
||||||
BIN
scripts/.DS_Store
vendored
Executable file
BIN
scripts/.DS_Store
vendored
Executable file
Binary file not shown.
69
scripts/backup-mysql.sh
Normal file
69
scripts/backup-mysql.sh
Normal 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
40
scripts/dburl-parser.sh
Executable 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
|
||||||
|
|
||||||
8
scripts/install-mysql-tools.sh
Normal file
8
scripts/install-mysql-tools.sh
Normal 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
69
scripts/ofelia-config.sh
Executable 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
3
scripts/ofelia-run.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
ofelia-config.sh && ofelia daemon;
|
||||||
Reference in New Issue
Block a user