From b6163ee56af0bd9785280371c1dd2a0d776aa540 Mon Sep 17 00:00:00 2001 From: Pau Rodriguez-Estivill Date: Sat, 26 Feb 2022 16:28:57 +0100 Subject: [PATCH] Limit last backups by minutes --- .github/workflows/ci.yml | 1 + README.md | 1 + alpine.Dockerfile | 1 + backup.sh | 39 +++++++++++++++++++++++---------------- debian.Dockerfile | 1 + 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b4acd2..b67b6b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,7 @@ jobs: BACKUP_KEEP_DAYS: 7 BACKUP_KEEP_WEEKS: 4 BACKUP_KEEP_MONTHS: 6 + BACKUP_KEEP_MINS: 1440 run: | echo "Test backup script..." mkdir -p "$BACKUP_DIR" diff --git a/README.md b/README.md index 318bd9f..d6f7f10 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ Most variables are the same as in the [official postgres image](https://hub.dock | BACKUP_KEEP_DAYS | Number of daily backups to keep before removal. Defaults to `7`. | | BACKUP_KEEP_WEEKS | Number of weekly backups to keep before removal. Defaults to `4`. | | BACKUP_KEEP_MONTHS | Number of monthly backups to keep before removal. Defaults to `6`. | +| BACKUP_KEEP_MINS | Number of minutes for `last` folder backups to keep before removal. Defaults to `1440`. | | HEALTHCHECK_PORT | Port listening for cron-schedule health check. Defaults to `8080`. | | POSTGRES_DB | Comma or space separated list of postgres databases to backup. Required. | | POSTGRES_DB_FILE | Alternative to POSTGRES_DB, but with one database per line, for usage with docker secrets. | diff --git a/alpine.Dockerfile b/alpine.Dockerfile index e1d6b87..51bd847 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -26,6 +26,7 @@ ENV POSTGRES_DB="**None**" \ BACKUP_KEEP_DAYS=7 \ BACKUP_KEEP_WEEKS=4 \ BACKUP_KEEP_MONTHS=6 \ + BACKUP_KEEP_MINS=1440 \ HEALTHCHECK_PORT=8080 COPY backup.sh /backup.sh diff --git a/backup.sh b/backup.sh index ca62868..b33ee33 100755 --- a/backup.sh +++ b/backup.sh @@ -56,47 +56,54 @@ else fi export PGHOST="${POSTGRES_HOST}" export PGPORT="${POSTGRES_PORT}" +KEEP_MINS=${BACKUP_KEEP_MINS} KEEP_DAYS=${BACKUP_KEEP_DAYS} KEEP_WEEKS=`expr $(((${BACKUP_KEEP_WEEKS} * 7) + 1))` KEEP_MONTHS=`expr $(((${BACKUP_KEEP_MONTHS} * 31) + 1))` #Initialize dirs -mkdir -p "${BACKUP_DIR}/daily/" "${BACKUP_DIR}/weekly/" "${BACKUP_DIR}/monthly/" +mkdir -p "${BACKUP_DIR}/last/" "${BACKUP_DIR}/daily/" "${BACKUP_DIR}/weekly/" "${BACKUP_DIR}/monthly/" #Loop all databases for DB in ${POSTGRES_DBS}; do #Initialize filename vers - DFILE="${BACKUP_DIR}/daily/${DB}-`date +%Y%m%d-%H%M%S`${BACKUP_SUFFIX}" + FILE="${BACKUP_DIR}/last/${DB}-`date +%Y%m%d-%H%M%S`${BACKUP_SUFFIX}" + DFILE="${BACKUP_DIR}/daily/${DB}-`date +%Y%m%d`${BACKUP_SUFFIX}" WFILE="${BACKUP_DIR}/weekly/${DB}-`date +%G%V`${BACKUP_SUFFIX}" MFILE="${BACKUP_DIR}/monthly/${DB}-`date +%Y%m`${BACKUP_SUFFIX}" #Create dump if [ "${POSTGRES_CLUSTER}" = "TRUE" ]; then echo "Creating cluster dump of ${DB} database from ${POSTGRES_HOST}..." - pg_dumpall -l "${DB}" ${POSTGRES_EXTRA_OPTS} | gzip > "${DFILE}" + pg_dumpall -l "${DB}" ${POSTGRES_EXTRA_OPTS} | gzip > "${FILE}" else echo "Creating dump of ${DB} database from ${POSTGRES_HOST}..." - pg_dump -d "${DB}" -f "${DFILE}" ${POSTGRES_EXTRA_OPTS} + pg_dump -d "${DB}" -f "${FILE}" ${POSTGRES_EXTRA_OPTS} fi #Copy (hardlink) for each entry - if [ -d "${DFILE}" ]; then + if [ -d "${FILE}" ]; then + DFILENEW="${DFILE}-new" WFILENEW="${WFILE}-new" MFILENEW="${MFILE}-new" - rm -rf "${WFILENEW}" "${MFILENEW}" - mkdir "${WFILENEW}" "${MFILENEW}" - ln -f "${DFILE}/"* "${WFILENEW}/" - ln -f "${DFILE}/"* "${MFILENEW}/" - rm -rf "${WFILE}" "${MFILE}" + rm -rf "${DFILENEW}" "${WFILENEW}" "${MFILENEW}" + mkdir "${DFILENEW}" "${WFILENEW}" "${MFILENEW}" + ln -f "${FILE}/"* "${DFILENEW}/" + ln -f "${FILE}/"* "${WFILENEW}/" + ln -f "${FILE}/"* "${MFILENEW}/" + rm -rf "${DFILE}" "${WFILE}" "${MFILE}" + mv -v "${DFILENEW}" "${DFILE}" mv -v "${WFILENEW}" "${WFILE}" mv -v "${MFILENEW}" "${MFILE}" else - ln -vf "${DFILE}" "${WFILE}" - ln -vf "${DFILE}" "${MFILE}" + ln -vf "${FILE}" "${DFILE}" + ln -vf "${FILE}" "${WFILE}" + ln -vf "${FILE}" "${MFILE}" fi #Clean old files - echo "Cleaning older than ${KEEP_DAYS} days for ${DB} database from ${POSTGRES_HOST}..." - find "${BACKUP_DIR}/daily" -maxdepth 1 -mtime +${KEEP_DAYS} -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' - find "${BACKUP_DIR}/weekly" -maxdepth 1 -mtime +${KEEP_WEEKS} -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' - find "${BACKUP_DIR}/monthly" -maxdepth 1 -mtime +${KEEP_MONTHS} -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' + echo "Cleaning older files for ${DB} database from ${POSTGRES_HOST}..." + find "${BACKUP_DIR}/last" -maxdepth 1 -mmin "${KEEP_MINS}" -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' + find "${BACKUP_DIR}/daily" -maxdepth 1 -mtime "+${KEEP_DAYS}" -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' + find "${BACKUP_DIR}/weekly" -maxdepth 1 -mtime "+${KEEP_WEEKS}" -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' + find "${BACKUP_DIR}/monthly" -maxdepth 1 -mtime "+${KEEP_MONTHS}" -name "${DB}-*${BACKUP_SUFFIX}" -exec rm -rf '{}' ';' done echo "SQL backup created successfully" diff --git a/debian.Dockerfile b/debian.Dockerfile index c52a240..e443193 100644 --- a/debian.Dockerfile +++ b/debian.Dockerfile @@ -41,6 +41,7 @@ ENV POSTGRES_DB="**None**" \ BACKUP_KEEP_DAYS=7 \ BACKUP_KEEP_WEEKS=4 \ BACKUP_KEEP_MONTHS=6 \ + BACKUP_KEEP_MINS=1440 \ HEALTHCHECK_PORT=8080 COPY backup.sh /backup.sh