#!/bin/sh STATUS_FILE=/last_backup_status.txt MARIADB_HOST=${MARIADB_HOST:-db} MARIADB_USER=${MARIADB_USER:-root} MARIADB_PORT=${MARIADB_PORT:-3306} MARIADB_PASSWORD=${MARIADB_PASSWORD:-1StrongPassword} MARIADB_DATABASE=${MARIADB_DATABASE:-my-db} COMPRESSION=${COMPRESSION:-gzip} RCLONE_CONFIG_FILE=${RCLONE_CONFIG_FILE:-/config/rclone.conf} RCLONE_REMOTE=${RCLONE_REMOTE:-myremote} RCLONE_PATH=${RCLONE_PATH:-/backups} TMPDIR=$(mktemp -d) DEST_FILENAME=$(date +%Y-%m-%d_%H-%M-%S).sql BACKUP_FILE="${TMPDIR}/${DEST_FILENAME}" RCLONE_PATH="${RCLONE_PATH}/$(date +%Y-%m-%d)" trap cleanup EXIT cleanup() { rm -rf "${TMPDIR}" echo "Removed temporary file" } trap interrupt INT interrupt() { echo "Backup interrupted" echo "interrupted" > "${STATUS_FILE}" exit 1 } if [ ! -f "${RCLONE_CONFIG_FILE}" ]; then echo "Rclone config file not found" exit 1 fi echo "Backup started" dump_failed() { echo "Database dump failed" echo "dump failed" > "${STATUS_FILE}" exit 1 } mkdir_failed() { echo "Backup mkdir failed" echo "mkdir failed" > "${STATUS_FILE}" exit 1 } copy_failed() { echo "Backup copy failed" echo "copy failed" > "${STATUS_FILE}" exit 1 } COMPRESSOR="cat" if [ "${COMPRESSION}" = "gzip" ]; then COMPRESSOR="gzip" BACKUP_FILE="${BACKUP_FILE}.gz" DEST_FILENAME="${DEST_FILENAME}.gz" fi if [ "${COMPRESSION}" = "bzip2" ]; then COMPRESSOR="bzip2" BACKUP_FILE="${BACKUP_FILE}.bz2" DEST_FILENAME="${DEST_FILENAME}.bz2" fi if [ "${COMPRESSION}" = "xz" ]; then COMPRESSOR="xz" BACKUP_FILE="${BACKUP_FILE}.xz" DEST_FILENAME="${DEST_FILENAME}.xz" fi if [ "${COMPRESSION}" = "zstd" ]; then COMPRESSOR="zstd" BACKUP_FILE="${BACKUP_FILE}.zst" DEST_FILENAME="${DEST_FILENAME}.zst" fi echo "Dumping database into: ${BACKUP_FILE}" mariadb-dump \ --add-drop-table \ --add-drop-trigger \ --add-locks \ --disable-keys \ --lock-all-tables \ --quick \ --triggers \ --tz-utc -v \ --host="${MARIADB_HOST}" \ --port="${MARIADB_PORT}" \ --user="${MARIADB_USER}" \ --password="${MARIADB_PASSWORD}" \ --databases "${MARIADB_DATABASE}" | "${COMPRESSOR}" > "${BACKUP_FILE}" || dump_failed echo "Copying backup to remote" rclone \ -v --config "${RCLONE_CONFIG_FILE}" \ mkdir "${RCLONE_REMOTE}:${RCLONE_PATH}" || mkdir_failed rclone \ -v --config "${RCLONE_CONFIG_FILE}" \ copy "${BACKUP_FILE}" "${RCLONE_REMOTE}:${RCLONE_PATH}" || copy_failed echo "success" > "${STATUS_FILE}" echo "Backup completed"