diff --git a/README.md b/README.md index 0a6262c..6e87d33 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Collection of lightweight and ready-to-use docker images * **[NodeJS](https://github.com/schickling/dockerfiles/tree/master/nodejs)** - Minimal NodeJS + NPM image * **[Octave](https://github.com/schickling/dockerfiles/tree/master/octave)** - Lightweight ocatve development environment * **[OpenCV](https://github.com/schickling/dockerfiles/tree/master/opencv)** - Lightweight ready-to use OpenCV image +* **[postgres-backup-s3](https://github.com/schickling/dockerfiles/tree/master/postgres-backup-s3)** - Backup PostgresSQL to S3 (supports periodic backups) * **[Redis-Commander](https://github.com/schickling/dockerfiles/tree/master/redis-commander)** - Redis management tool * **[Rust](https://github.com/schickling/dockerfiles/tree/master/rust)** - Lightweight nightly Rust build including Cargo and GDB * **[swagger-ui](https://github.com/schickling/dockerfiles/tree/master/swagger-ui)** - Swagger UI 2.1.2 with API_URL and API_KEY injection (45 MB) diff --git a/postgres-backup-s3/Dockerfile b/postgres-backup-s3/Dockerfile new file mode 100644 index 0000000..846093c --- /dev/null +++ b/postgres-backup-s3/Dockerfile @@ -0,0 +1,22 @@ +FROM alpine:3.2 +MAINTAINER Johannes Schickling "schickling.j@gmail.com" + +ADD install.sh install.sh +RUN sh install.sh && rm install.sh + +ENV POSTGRES_DATABASE **None** +ENV POSTGRES_HOST **None** +ENV POSTGRES_PORT 5432 +ENV POSTGRES_USER **None** +ENV POSTGRES_PASSWORD **None** +ENV S3_ACCESS_KEY_ID **None** +ENV S3_SECRET_ACCESS_KEY **None** +ENV S3_BUCKET **None** +ENV S3_REGION us-west-1 +ENV S3_PATH 'backup' +ENV SCHEDULE **None** + +ADD run.sh run.sh +ADD backup.sh backup.sh + +CMD ["sh", "run.sh"] diff --git a/postgres-backup-s3/README.md b/postgres-backup-s3/README.md new file mode 100644 index 0000000..b1cb7b8 --- /dev/null +++ b/postgres-backup-s3/README.md @@ -0,0 +1,15 @@ +# postgres-backup-s3 + +Backup PostgresSQL to S3 (supports periodic backups) + +## Usage + +```sh +$ docker run -e S3_ACCESS_KEY_ID=key -e S3_SECRET_ACCESS_KEY=secret -e S3_BUCKET=my-bucket -e S3_PREFIX=backup -e POSTGRES_DATABASE=dbname -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -e POSTGRES_HOST=localhost schickling/postgres-backup-s3 +``` + +### Automatic Periodic Backups + +You can additionally set the `SCHEDULE` environment variable like `-e SCHEDULE="@daily"` to run the backup automatically. + +More information about the scheduling can be found [here](http://godoc.org/github.com/robfig/cron#hdr-Predefined_schedules). diff --git a/postgres-backup-s3/backup.sh b/postgres-backup-s3/backup.sh new file mode 100644 index 0000000..4cce6ee --- /dev/null +++ b/postgres-backup-s3/backup.sh @@ -0,0 +1,56 @@ +#! /bin/sh + +set -e + +if [ "${S3_ACCESS_KEY_ID}" = "**None**" ]; then + echo "You need to set the S3_ACCESS_KEY_ID environment variable." + exit 1 +fi + +if [ "${S3_SECRET_ACCESS_KEY}" = "**None**" ]; then + echo "You need to set the S3_SECRET_ACCESS_KEY environment variable." + exit 1 +fi + +if [ "${S3_BUCKET}" = "**None**" ]; then + echo "You need to set the S3_BUCKET environment variable." + exit 1 +fi + +if [ "${POSTGRES_DATABASE}" = "**None**" ]; then + echo "You need to set the POSTGRES_DATABASE environment variable." + exit 1 +fi + +if [ "${POSTGRES_HOST}" = "**None**" ]; then + echo "You need to set the POSTGRES_HOST environment variable." + exit 1 +fi + +if [ "${POSTGRES_USER}" = "**None**" ]; then + echo "You need to set the POSTGRES_USER environment variable." + exit 1 +fi + +if [ "${POSTGRES_PASSWORD}" = "**None**" ]; then + echo "You need to set the POSTGRES_PASSWORD environment variable or link to a container named POSTGRES." + exit 1 +fi + +# env vars needed for aws tools +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 +POSTGRES_HOST_OPTS="-h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER" + +echo "Creating dump of ${POSTGRES_DATABASE} database) from ${POSTGRES_HOST}..." + +pg_dump $POSTGRES_HOST_OPTS $POSTGRES_DATABASE | gzip > dump.sql.gz + +echo "Uploading dump to $S3_BUCKET" + +cat dump.sql.gz | aws s3 cp - s3://$S3_BUCKET/$S3_PREFIX/$(date +"%Y-%m-%dT%H:%M:%SZ").sql.gz || exit 2 + +echo "SQL backup uploaded successfully" diff --git a/postgres-backup-s3/install.sh b/postgres-backup-s3/install.sh new file mode 100644 index 0000000..6297ed6 --- /dev/null +++ b/postgres-backup-s3/install.sh @@ -0,0 +1,25 @@ +#! /bin/sh + +# exit if a command fails +set -e + + +apk update + +# install pg_dump +apk add postgres + +# install s3 tools +apk add python py-pip +pip install awscli +apk del py-pip + +# install go-cron +apk add curl +curl -L --insecure https://github.com/odise/go-cron/releases/download/v0.0.6/go-cron-linux.gz | zcat > /usr/local/bin/go-cron +chmod u+x /usr/local/bin/go-cron +apk del curl + + +# cleanup +rm -rf /var/cache/apk/* diff --git a/postgres-backup-s3/run.sh b/postgres-backup-s3/run.sh new file mode 100644 index 0000000..05dfcaa --- /dev/null +++ b/postgres-backup-s3/run.sh @@ -0,0 +1,9 @@ +#! /bin/sh + +set -e + +if [ "${SCHEDULE}" = "**None**" ]; then + sh backup.sh +else + exec go-cron "$SCHEDULE" /bin/sh backup.sh +fi