diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 4d94e79..993b022 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -36,12 +36,12 @@ ENV POSTGRES_DB="**None**" \ WEBHOOK_EXTRA_ARGS="" COPY hooks /hooks -COPY backup.sh /backup.sh +COPY backup.sh env.sh init.sh / VOLUME /backups ENTRYPOINT ["/bin/sh", "-c"] -CMD ["exec /usr/local/bin/go-cron -s \"$SCHEDULE\" -p \"$HEALTHCHECK_PORT\" -- /backup.sh"] +CMD ["exec /init.sh"] HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f "http://localhost:$HEALTHCHECK_PORT/" || exit 1 diff --git a/backup.sh b/backup.sh index 4a5066a..cbb82dc 100755 --- a/backup.sh +++ b/backup.sh @@ -9,64 +9,7 @@ if [ -d "${HOOKS_DIR}" ]; then trap 'on_error' ERR fi -if [ "${POSTGRES_DB}" = "**None**" -a "${POSTGRES_DB_FILE}" = "**None**" ]; then - echo "You need to set the POSTGRES_DB or POSTGRES_DB_FILE environment variable." - exit 1 -fi - -if [ "${POSTGRES_HOST}" = "**None**" ]; then - if [ -n "${POSTGRES_PORT_5432_TCP_ADDR}" ]; then - POSTGRES_HOST=${POSTGRES_PORT_5432_TCP_ADDR} - POSTGRES_PORT=${POSTGRES_PORT_5432_TCP_PORT} - else - echo "You need to set the POSTGRES_HOST environment variable." - exit 1 - fi -fi - -if [ "${POSTGRES_USER}" = "**None**" -a "${POSTGRES_USER_FILE}" = "**None**" ]; then - echo "You need to set the POSTGRES_USER or POSTGRES_USER_FILE environment variable." - exit 1 -fi - -if [ "${POSTGRES_PASSWORD}" = "**None**" -a "${POSTGRES_PASSWORD_FILE}" = "**None**" -a "${POSTGRES_PASSFILE_STORE}" = "**None**" ]; then - echo "You need to set the POSTGRES_PASSWORD or POSTGRES_PASSWORD_FILE or POSTGRES_PASSFILE_STORE environment variable or link to a container named POSTGRES." - exit 1 -fi - -#Process vars -if [ "${POSTGRES_DB_FILE}" = "**None**" ]; then - POSTGRES_DBS=$(echo "${POSTGRES_DB}" | tr , " ") -elif [ -r "${POSTGRES_DB_FILE}" ]; then - POSTGRES_DBS=$(cat "${POSTGRES_DB_FILE}") -else - echo "Missing POSTGRES_DB_FILE file." - exit 1 -fi -if [ "${POSTGRES_USER_FILE}" = "**None**" ]; then - export PGUSER="${POSTGRES_USER}" -elif [ -r "${POSTGRES_USER_FILE}" ]; then - export PGUSER=$(cat "${POSTGRES_USER_FILE}") -else - echo "Missing POSTGRES_USER_FILE file." - exit 1 -fi -if [ "${POSTGRES_PASSWORD_FILE}" = "**None**" -a "${POSTGRES_PASSFILE_STORE}" = "**None**" ]; then - export PGPASSWORD="${POSTGRES_PASSWORD}" -elif [ -r "${POSTGRES_PASSWORD_FILE}" ]; then - export PGPASSWORD=$(cat "${POSTGRES_PASSWORD_FILE}") -elif [ -r "${POSTGRES_PASSFILE_STORE}" ]; then - export PGPASSFILE="${POSTGRES_PASSFILE_STORE}" -else - echo "Missing POSTGRES_PASSWORD_FILE or POSTGRES_PASSFILE_STORE file." - exit 1 -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))` +source "$(dirname "$0")/env.sh" # Pre-backup hook if [ -d "${HOOKS_DIR}" ]; then diff --git a/debian.Dockerfile b/debian.Dockerfile index 5b77f8c..2af98ed 100644 --- a/debian.Dockerfile +++ b/debian.Dockerfile @@ -50,12 +50,12 @@ ENV POSTGRES_DB="**None**" \ WEBHOOK_EXTRA_ARGS="" COPY hooks /hooks -COPY backup.sh /backup.sh +COPY backup.sh env.sh init.sh / VOLUME /backups ENTRYPOINT ["/bin/sh", "-c"] -CMD ["exec /usr/local/bin/go-cron -s \"$SCHEDULE\" -p \"$HEALTHCHECK_PORT\" -- /backup.sh"] +CMD ["exec /init.sh"] HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f "http://localhost:$HEALTHCHECK_PORT/" || exit 1 diff --git a/env.sh b/env.sh new file mode 100755 index 0000000..ccbe801 --- /dev/null +++ b/env.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# Pre-validate the environment +if [ "${POSTGRES_DB}" = "**None**" -a "${POSTGRES_DB_FILE}" = "**None**" ]; then + echo "You need to set the POSTGRES_DB or POSTGRES_DB_FILE environment variable." + exit 1 +fi + +if [ "${POSTGRES_HOST}" = "**None**" ]; then + if [ -n "${POSTGRES_PORT_5432_TCP_ADDR}" ]; then + POSTGRES_HOST=${POSTGRES_PORT_5432_TCP_ADDR} + POSTGRES_PORT=${POSTGRES_PORT_5432_TCP_PORT} + else + echo "You need to set the POSTGRES_HOST environment variable." + exit 1 + fi +fi + +if [ "${POSTGRES_USER}" = "**None**" -a "${POSTGRES_USER_FILE}" = "**None**" ]; then + echo "You need to set the POSTGRES_USER or POSTGRES_USER_FILE environment variable." + exit 1 +fi + +if [ "${POSTGRES_PASSWORD}" = "**None**" -a "${POSTGRES_PASSWORD_FILE}" = "**None**" -a "${POSTGRES_PASSFILE_STORE}" = "**None**" ]; then + echo "You need to set the POSTGRES_PASSWORD or POSTGRES_PASSWORD_FILE or POSTGRES_PASSFILE_STORE environment variable or link to a container named POSTGRES." + exit 1 +fi + +#Process vars +if [ "${POSTGRES_DB_FILE}" = "**None**" ]; then + POSTGRES_DBS=$(echo "${POSTGRES_DB}" | tr , " ") +elif [ -r "${POSTGRES_DB_FILE}" ]; then + POSTGRES_DBS=$(cat "${POSTGRES_DB_FILE}") +else + echo "Missing POSTGRES_DB_FILE file." + exit 1 +fi +if [ "${POSTGRES_USER_FILE}" = "**None**" ]; then + export PGUSER="${POSTGRES_USER}" +elif [ -r "${POSTGRES_USER_FILE}" ]; then + export PGUSER=$(cat "${POSTGRES_USER_FILE}") +else + echo "Missing POSTGRES_USER_FILE file." + exit 1 +fi +if [ "${POSTGRES_PASSWORD_FILE}" = "**None**" -a "${POSTGRES_PASSFILE_STORE}" = "**None**" ]; then + export PGPASSWORD="${POSTGRES_PASSWORD}" +elif [ -r "${POSTGRES_PASSWORD_FILE}" ]; then + export PGPASSWORD=$(cat "${POSTGRES_PASSWORD_FILE}") +elif [ -r "${POSTGRES_PASSFILE_STORE}" ]; then + export PGPASSFILE="${POSTGRES_PASSFILE_STORE}" +else + echo "Missing POSTGRES_PASSWORD_FILE or POSTGRES_PASSFILE_STORE file." + exit 1 +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))` + +# Validate backup dir +if [ -d "${BACKUP_DIR}" -a -w "${BACKUP_DIR}" -a -x "${BACKUP_DIR}" ]; then + echo "Backups will be stored at ${BACKUP_DIR}." +else + echo "BACKUP_DIR points to a file or folder with insufficient permissions." + exit 1 +fi diff --git a/init.sh b/init.sh new file mode 100755 index 0000000..8674bff --- /dev/null +++ b/init.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -Eeo pipefail + +# Prevalidate configuration (don't source) +/env.sh + +exec /usr/local/bin/go-cron -s "$SCHEDULE" -p "$HEALTHCHECK_PORT" -- /backup.sh