Skip to content
Snippets Groups Projects
backup.sh 2.45 KiB
Newer Older
Elliott Shugerman's avatar
Elliott Shugerman committed
#! /bin/sh

Elliott Shugerman's avatar
Elliott Shugerman committed
set -o pipefail

if [ -z "$S3_ACCESS_KEY_ID" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
  echo "You need to set the S3_ACCESS_KEY_ID environment variable."
  exit 1
fi

if [ -z "$S3_SECRET_ACCESS_KEY" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
  echo "You need to set the S3_SECRET_ACCESS_KEY environment variable."
  exit 1
fi

if [ -z "$S3_BUCKET" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
  echo "You need to set the S3_BUCKET environment variable."
  exit 1
fi

if [ -z "$POSTGRES_DATABASE" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
  echo "You need to set the POSTGRES_DATABASE environment variable."
  exit 1
fi

if [ -z "$POSTGRES_HOST" ]; then
  if [ -n "$POSTGRES_PORT_5432_TCP_ADDR" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
    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 [ -z "$POSTGRES_USER" ]; then
Elliott Shugerman's avatar
Elliott Shugerman committed
  echo "You need to set the POSTGRES_USER environment variable."
  exit 1
fi

if [ -z "$POSTGRES_PASSWORD" ]; then
  echo "You need to set the POSTGRES_PASSWORD environment variable."
Elliott Shugerman's avatar
Elliott Shugerman committed
  exit 1
fi

if [ -z "$S3_ENDPOINT" ]; then
  aws_args=""
Elliott Shugerman's avatar
Elliott Shugerman committed
else
  aws_args="--endpoint-url $S3_ENDPOINT"
Elliott Shugerman's avatar
Elliott Shugerman committed
fi

Elliott Shugerman's avatar
Elliott Shugerman committed
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
export AWS_DEFAULT_REGION=$S3_REGION
export PGPASSWORD=$POSTGRES_PASSWORD

echo "Creating backup of $POSTGRES_DATABASE database..."
pg_dump --format=custom \
        -h $POSTGRES_HOST \
        -p $POSTGRES_PORT \
        -U $POSTGRES_USER \
        -d $POSTGRES_DATABASE \
        $PGDUMP_EXTRA_OPTS \
        > db.dump

timestamp=$(date +"%Y-%m-%dT%H:%M:%S")
s3_uri_base="s3://${S3_BUCKET}/${S3_PREFIX}/${POSTGRES_DATABASE}_${timestamp}.dump"

if [ -n "$PASSPHRASE" ]; then
  echo "Encrypting backup..."
  gpg --symmetric --batch --passphrase "$PASSPHRASE" db.dump
  rm db.dump
  local_file="db.dump.gpg"
  s3_uri="${s3_uri_base}.gpg"
else
  local_file="db.dump"
  s3_uri="$s3_uri_base"
fi
Elliott Shugerman's avatar
Elliott Shugerman committed

echo "Uploading backup to $S3_BUCKET..."
aws "$aws_args" s3 cp "$local_file" "$s3_uri"
rm "$local_file"
Elliott Shugerman's avatar
Elliott Shugerman committed

echo "Backup complete."

if [ "$BACKUP_KEEP_DAYS" -ne 0 ]; then
  date_from_remove=$(date -v -"${BACKUP_KEEP_DAYS}"d +"%Y-%m-%d")
  backups_query="Contents[?LastModified<='${date_from_remove} 00:00:00'].{Key: Key}"
  remove_backups=$(aws s3api list-objects-v2 --bucket "${S3_BUCKET}" --prefix "${S3_PREFIX}" --query "${backups_query}" --output text | xargs -n1 -t -I 'KEY' aws s3 rm s3://"${S3_BUCKET}"/'KEY')
  echo "Removing old backup from $S3_BUCKET..."
  eval "$remove_backups";
  echo "Removing complete."
fi