Compare commits

...

9 Commits

Author SHA1 Message Date
293814277d retention
All checks were successful
Container Publish / on-success-skip (push) Has been skipped
Container Publish / build-image (arm64) (push) Successful in 44s
Container Publish / build-image (amd64) (push) Successful in 1m25s
Container Publish / update docker manifest (push) Successful in 14s
Vulnerability Scan / Daily Vulnerability Scan (arm64) (push) Successful in 6s
Vulnerability Scan / Daily Vulnerability Scan (amd64) (push) Successful in 16s
2025-12-16 13:51:50 +01:00
f03097f83b daily subdir 2025-12-16 10:57:49 +01:00
458ce5534b interruption handling
All checks were successful
Container Publish / on-success-skip (push) Has been skipped
Container Publish / build-image (amd64) (push) Successful in 41s
Container Publish / build-image (arm64) (push) Successful in 47s
Container Publish / update docker manifest (push) Successful in 11s
Vulnerability Scan / Daily Vulnerability Scan (arm64) (push) Successful in 8s
Vulnerability Scan / Daily Vulnerability Scan (amd64) (push) Successful in 28s
2025-12-14 22:01:29 +01:00
1ebd6512d8 better healthcheck 2025-12-14 22:00:57 +01:00
5b23ca2243 healthcheck startup 2025-12-14 21:48:08 +01:00
e551d60679 temp file cleanup 2025-12-14 21:45:07 +01:00
18cef1c84e cron log level 2025-12-14 21:44:49 +01:00
9b56614763 shellcheck 2025-12-14 21:34:06 +01:00
6caf3686d4 added gitignore 2025-12-14 21:32:55 +01:00
5 changed files with 42 additions and 13 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
docker-compose.yaml
config/

View File

@@ -6,7 +6,7 @@ RUN \
COPY rootfs /
HEALTHCHECK --interval=2m --timeout=3s \
HEALTHCHECK --interval=1m --timeout=3s --start-period=20s --retries=1 \
CMD /app/healthcheck.sh || exit 1
ENTRYPOINT [ "/sbin/tini", "/app/entrypoint.sh" ]

View File

@@ -35,6 +35,7 @@ services:
MARIADB_DATABASE: my-db
CRONTAB: "15 */4 * * *"
COMPRESSION: gzip # gzip | bzip2 | xz | zstd
KEEP_SUCCESFUL_DAYS: 15 # default is 30
RCLONE_REMOTE: myremote
RCLONE_PATH: /backups
RCLONE_CONFIG_FILE: /config/rclone.conf

View File

@@ -1,10 +1,7 @@
#!/bin/sh
set -o pipefail
STATUS_FILE=/last_backup_status.txt
MARIADB_HOST=${MARIADB_HOST:-db}
MARIADB_USER=${MARIADB_USER:-root}
MARIADB_PORT=${MARIADB_PORT:-3306}
@@ -14,18 +11,26 @@ 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}"
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
@@ -51,7 +56,12 @@ copy_failed() {
exit 1
}
COMPRESSOR=cat
delete_failed() {
echo "Cleanup delete failed"
exit 1
}
COMPRESSOR="cat"
if [ "${COMPRESSION}" = "gzip" ]; then
COMPRESSOR="gzip"
BACKUP_FILE="${BACKUP_FILE}.gz"
@@ -85,9 +95,9 @@ mariadb-dump \
--quick \
--triggers \
--tz-utc -v \
--host=${MARIADB_HOST} \
--port=${MARIADB_PORT} \
--user=${MARIADB_USER} \
--host="${MARIADB_HOST}" \
--port="${MARIADB_PORT}" \
--user="${MARIADB_USER}" \
--password="${MARIADB_PASSWORD}" \
--databases "${MARIADB_DATABASE}" | "${COMPRESSOR}" > "${BACKUP_FILE}" || dump_failed
@@ -96,12 +106,27 @@ echo "Copying backup to remote"
rclone \
-v --config "${RCLONE_CONFIG_FILE}" \
mkdir "${RCLONE_REMOTE}:${RCLONE_PATH}" || mkdir_failed
mkdir "${RCLONE_REMOTE}:${RCLONE_DEST_PATH}" || mkdir_failed
rclone \
-v --config "${RCLONE_CONFIG_FILE}" \
copy "${BACKUP_FILE}" "${RCLONE_REMOTE}:${RCLONE_PATH}" || copy_failed
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"

View File

@@ -4,4 +4,5 @@ CRONTAB=${CRONTAB:-"0 12 * * *"}
echo "${CRONTAB} /app/backup.sh" > /etc/crontabs/root
crond -f
echo "Starting cron"
crond -f -d 7