diff --git a/Dockerfile-alpine b/Dockerfile-alpine index 5054dd7..b921ef3 100644 --- a/Dockerfile-alpine +++ b/Dockerfile-alpine @@ -21,6 +21,7 @@ ENV POSTGRES_DB="**None**" \ POSTGRES_EXTRA_OPTS="-Z9" \ SCHEDULE="@daily" \ BACKUP_DIR="/backups" \ + BACKUP_SUFFIX=".sql.gz" \ BACKUP_KEEP_DAYS=7 \ BACKUP_KEEP_WEEKS=4 \ BACKUP_KEEP_MONTHS=6 \ diff --git a/Dockerfile-debian b/Dockerfile-debian index b018b50..4e3b701 100644 --- a/Dockerfile-debian +++ b/Dockerfile-debian @@ -21,6 +21,7 @@ ENV POSTGRES_DB="**None**" \ POSTGRES_EXTRA_OPTS="-Z9" \ SCHEDULE="@daily" \ BACKUP_DIR="/backups" \ + BACKUP_SUFFIX=".sql.gz" \ BACKUP_KEEP_DAYS=7 \ BACKUP_KEEP_WEEKS=4 \ BACKUP_KEEP_MONTHS=6 \ diff --git a/README.md b/README.md index b130b89..7f55e0c 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Most variables are the same as in the [official postgres image](https://hub.dock | env variable | description | |--|--| | BACKUP_DIR | Directory to save the backup at. Defaults to `/backups`. | +| BACKUP_SUFFIX | Filename suffix to save the backup. Defaults to `.sql.gz`. | | 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`. | diff --git a/backup.sh b/backup.sh index c4e1f87..115fa5f 100755 --- a/backup.sh +++ b/backup.sh @@ -63,20 +63,32 @@ mkdir -p "${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`.sql.gz" - WFILE="${BACKUP_DIR}/weekly/${DB}-`date +%G%V`.sql.gz" - MFILE="${BACKUP_DIR}/monthly/${DB}-`date +%Y%m`.sql.gz" + DFILE="${BACKUP_DIR}/daily/${DB}-`date +%Y%m%d-%H%M%S`${BACKUP_SUFFIX}" + WFILE="${BACKUP_DIR}/weekly/${DB}-`date +%G%V`${BACKUP_SUFFIX}" + MFILE="${BACKUP_DIR}/monthly/${DB}-`date +%Y%m`${BACKUP_SUFFIX}" #Create dump echo "Creating dump of ${DB} database from ${POSTGRES_HOST}..." pg_dump -f "${DFILE}" ${POSTGRES_HOST_OPTS} ${DB} #Copy (hardlink) for each entry - ln -vf "${DFILE}" "${WFILE}" - ln -vf "${DFILE}" "${MFILE}" + if [ -d "${DFILE}" ]; then + 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}" + mv -v "${WFILENEW}" "${WFILE}" + mv -v "${MFILENEW}" "${MFILE}" + else + ln -vf "${DFILE}" "${WFILE}" + ln -vf "${DFILE}" "${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}-*.sql*" -exec rm -rf '{}' ';' - find "${BACKUP_DIR}/weekly" -maxdepth 1 -mtime +${KEEP_WEEKS} -name "${DB}-*.sql*" -exec rm -rf '{}' ';' - find "${BACKUP_DIR}/monthly" -maxdepth 1 -mtime +${KEEP_MONTHS} -name "${DB}-*.sql*" -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"