Skip to content

Commit 890ad7e

Browse files
author
Nicholas Villarreal
committed
Initial commit
0 parents  commit 890ad7e

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed

Dockerfile

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
FROM alpine:3.9
2+
3+
ADD install.sh install.sh
4+
RUN sh install.sh && rm install.sh
5+
6+
ENV POSTGRES_DATABASE **None**
7+
ENV POSTGRES_HOST **None**
8+
ENV POSTGRES_PORT 5432
9+
ENV POSTGRES_USER **None**
10+
ENV POSTGRES_PASSWORD **None**
11+
ENV POSTGRES_EXTRA_OPTS ''
12+
ENV S3_ACCESS_KEY_ID **None**
13+
ENV S3_SECRET_ACCESS_KEY **None**
14+
ENV S3_BUCKET **None**
15+
ENV S3_REGION us-west-1
16+
ENV S3_PATH 'backup'
17+
ENV S3_ENDPOINT **None**
18+
ENV S3_S3V4 no
19+
ENV SCHEDULE **None**
20+
21+
ADD run.sh run.sh
22+
ADD backup.sh backup.sh
23+
24+
CMD ["sh", "run.sh"]

README.md

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# postgres-backup-s3
2+
3+
Backup PostgresSQL to S3 (supports periodic backups)
4+
5+
## Usage
6+
7+
Docker:
8+
```sh
9+
$ 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
10+
```
11+
12+
Docker Compose:
13+
```yaml
14+
postgres:
15+
image: postgres
16+
environment:
17+
POSTGRES_USER: user
18+
POSTGRES_PASSWORD: password
19+
20+
pgbackups3:
21+
image: schickling/postgres-backup-s3
22+
links:
23+
- postgres
24+
environment:
25+
SCHEDULE: '@daily'
26+
S3_REGION: region
27+
S3_ACCESS_KEY_ID: key
28+
S3_SECRET_ACCESS_KEY: secret
29+
S3_BUCKET: my-bucket
30+
S3_PREFIX: backup
31+
POSTGRES_DATABASE: dbname
32+
POSTGRES_USER: user
33+
POSTGRES_PASSWORD: password
34+
POSTGRES_EXTRA_OPTS: '--schema=public --blobs'
35+
TZ: America/Denver
36+
```
37+
38+
### Automatic Periodic Backups
39+
40+
You can additionally set the `SCHEDULE` environment variable like `-e SCHEDULE="@daily"` to run the backup automatically.
41+
42+
More information about the scheduling can be found [here](http://godoc.org/github.com/robfig/cron#hdr-Predefined_schedules).
43+

backup.sh

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#! /bin/sh
2+
3+
set -e
4+
set -o pipefail
5+
6+
if [ "${S3_ACCESS_KEY_ID}" = "**None**" ]; then
7+
echo "You need to set the S3_ACCESS_KEY_ID environment variable."
8+
exit 1
9+
fi
10+
11+
if [ "${S3_SECRET_ACCESS_KEY}" = "**None**" ]; then
12+
echo "You need to set the S3_SECRET_ACCESS_KEY environment variable."
13+
exit 1
14+
fi
15+
16+
if [ "${S3_BUCKET}" = "**None**" ]; then
17+
echo "You need to set the S3_BUCKET environment variable."
18+
exit 1
19+
fi
20+
21+
if [ "${POSTGRES_DATABASE}" = "**None**" ]; then
22+
echo "You need to set the POSTGRES_DATABASE environment variable."
23+
exit 1
24+
fi
25+
26+
if [ "${POSTGRES_HOST}" = "**None**" ]; then
27+
if [ -n "${POSTGRES_PORT_5432_TCP_ADDR}" ]; then
28+
POSTGRES_HOST=$POSTGRES_PORT_5432_TCP_ADDR
29+
POSTGRES_PORT=$POSTGRES_PORT_5432_TCP_PORT
30+
else
31+
echo "You need to set the POSTGRES_HOST environment variable."
32+
exit 1
33+
fi
34+
fi
35+
36+
if [ "${POSTGRES_USER}" = "**None**" ]; then
37+
echo "You need to set the POSTGRES_USER environment variable."
38+
exit 1
39+
fi
40+
41+
if [ "${POSTGRES_PASSWORD}" = "**None**" ]; then
42+
echo "You need to set the POSTGRES_PASSWORD environment variable or link to a container named POSTGRES."
43+
exit 1
44+
fi
45+
46+
if [ "${S3_ENDPOINT}" == "**None**" ]; then
47+
AWS_ARGS=""
48+
else
49+
AWS_ARGS="--endpoint-url ${S3_ENDPOINT}"
50+
fi
51+
52+
# env vars needed for aws tools
53+
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
54+
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
55+
export AWS_DEFAULT_REGION=$S3_REGION
56+
57+
export PGPASSWORD=$POSTGRES_PASSWORD
58+
POSTGRES_HOST_OPTS="-h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER $POSTGRES_EXTRA_OPTS"
59+
60+
echo "Creating dump of ${POSTGRES_DATABASE} database from ${POSTGRES_HOST}..."
61+
62+
pg_dump $POSTGRES_HOST_OPTS $POSTGRES_DATABASE | gzip > dump.sql.gz
63+
64+
echo "Uploading dump to $S3_BUCKET"
65+
66+
cat dump.sql.gz | aws $AWS_ARGS s3 cp - s3://$S3_BUCKET/$S3_PREFIX/${POSTGRES_DATABASE}_$(date +"%Y-%m-%dT%H:%M:%SZ").sql.gz || exit 2
67+
68+
echo "SQL backup uploaded successfully"

install.sh

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#! /bin/sh
2+
3+
# exit if a command fails
4+
set -e
5+
6+
7+
apk update
8+
9+
# install tzdata to enable TZ env variable
10+
apk add tzdata
11+
12+
# install pg_dump
13+
apk add postgresql
14+
15+
# install s3 tools
16+
apk add python py2-pip
17+
pip install awscli
18+
apk del py2-pip
19+
20+
# install go-cron
21+
apk add curl
22+
curl -L --insecure https://github.com/odise/go-cron/releases/download/v0.0.6/go-cron-linux.gz | zcat > /usr/local/bin/go-cron
23+
chmod u+x /usr/local/bin/go-cron
24+
apk del curl
25+
26+
27+
# cleanup
28+
rm -rf /var/cache/apk/*

run.sh

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#! /bin/sh
2+
3+
set -e
4+
5+
if [ "${S3_S3V4}" = "yes" ]; then
6+
aws configure set default.s3.signature_version s3v4
7+
fi
8+
9+
if [ "${SCHEDULE}" = "**None**" ]; then
10+
sh backup.sh
11+
else
12+
exec go-cron "$SCHEDULE" /bin/sh backup.sh
13+
fi

0 commit comments

Comments
 (0)