All checks were successful
Container Publish / on-success-skip (push) Has been skipped
Container Publish / build-image (arm64) (push) Successful in 35s
Container Publish / build-image (amd64) (push) Successful in 50s
Container Publish / update docker manifest (push) Successful in 10s
Vulnerability Scan / Daily Vulnerability Scan (arm64) (push) Successful in 9s
Vulnerability Scan / Daily Vulnerability Scan (amd64) (push) Successful in 49s
133 lines
3.0 KiB
Bash
Executable File
133 lines
3.0 KiB
Bash
Executable File
#!/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}
|
|
KEEP_SUCCESFUL_DAYS=${KEEP_SUCCESFUL_DAYS:-30}
|
|
|
|
TMPDIR=$(mktemp -d)
|
|
DEST_FILENAME=$(date +%Y-%m-%d_%H-%M-%S).sql
|
|
BACKUP_FILE="${TMPDIR}/${DEST_FILENAME}"
|
|
RCLONE_DEST_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
|
|
}
|
|
|
|
delete_failed() {
|
|
echo "Cleanup delete failed"
|
|
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_DEST_PATH}" || mkdir_failed
|
|
|
|
rclone \
|
|
-v --config "${RCLONE_CONFIG_FILE}" \
|
|
copy "${BACKUP_FILE}" "${RCLONE_REMOTE}:${RCLONE_DEST_PATH}" || copy_failed
|
|
|
|
echo "success" > "${STATUS_FILE}"
|
|
|
|
echo "Backup completed"
|
|
|
|
echo "Cleaning up old backups"
|
|
|
|
rclone \
|
|
-v --config "${RCLONE_CONFIG_FILE}" \
|
|
lsd "${RCLONE_REMOTE}:${RCLONE_PATH}" | \
|
|
awk '{print $5}' | sort -r | tail -n +$((KEEP_SUCCESFUL_DAYS + 1)) \
|
|
| while read -r line; do
|
|
echo "Deleting backup: ${line}"
|
|
rclone \
|
|
-v --config "${RCLONE_CONFIG_FILE}" \
|
|
purge "${RCLONE_REMOTE}:${RCLONE_PATH}/${line}" || delete_failed
|
|
done
|
|
|
|
echo "Cleanup completed"
|