1
0
mirror of https://github.com/garraflavatra/docker-volume-s3-backup.git synced 2025-05-17 13:14:38 +00:00

merge restore and util containers

This commit is contained in:
Elliott Shugerman 2019-11-27 20:57:21 -07:00
parent 66a9a2b219
commit 3e05233a2a
19 changed files with 100 additions and 225 deletions

View File

@ -3,7 +3,7 @@
FROM alpine:3.8 FROM alpine:3.8
ADD install.sh install.sh ADD src/install.sh install.sh
RUN sh install.sh && rm install.sh RUN sh install.sh && rm install.sh
ENV POSTGRES_DATABASE **None** ENV POSTGRES_DATABASE **None**
@ -20,8 +20,10 @@ ENV S3_PATH 'backup'
ENV S3_ENDPOINT **None** ENV S3_ENDPOINT **None**
ENV S3_S3V4 no ENV S3_S3V4 no
ENV SCHEDULE **None** ENV SCHEDULE **None**
ENV DROP_PUBLIC no
ADD run.sh run.sh ADD src/run.sh run.sh
ADD backup.sh backup.sh ADD src/backup.sh backup.sh
ADD src/restore.sh restore.sh
CMD ["sh", "run.sh"] CMD ["sh", "run.sh"]

View File

@ -3,7 +3,7 @@
FROM alpine:3.10 FROM alpine:3.10
ADD install.sh install.sh ADD src/install.sh install.sh
RUN sh install.sh && rm install.sh RUN sh install.sh && rm install.sh
ENV POSTGRES_DATABASE **None** ENV POSTGRES_DATABASE **None**
@ -20,8 +20,10 @@ ENV S3_PATH 'backup'
ENV S3_ENDPOINT **None** ENV S3_ENDPOINT **None**
ENV S3_S3V4 no ENV S3_S3V4 no
ENV SCHEDULE **None** ENV SCHEDULE **None**
ENV DROP_PUBLIC no
ADD run.sh run.sh ADD src/run.sh run.sh
ADD backup.sh backup.sh ADD src/backup.sh backup.sh
ADD src/restore.sh restore.sh
CMD ["sh", "run.sh"] CMD ["sh", "run.sh"]

View File

@ -3,7 +3,7 @@
FROM alpine:edge FROM alpine:edge
ADD install.sh install.sh ADD src/install.sh install.sh
RUN sh install.sh && rm install.sh RUN sh install.sh && rm install.sh
ENV POSTGRES_DATABASE **None** ENV POSTGRES_DATABASE **None**
@ -20,8 +20,10 @@ ENV S3_PATH 'backup'
ENV S3_ENDPOINT **None** ENV S3_ENDPOINT **None**
ENV S3_S3V4 no ENV S3_S3V4 no
ENV SCHEDULE **None** ENV SCHEDULE **None**
ENV DROP_PUBLIC no
ADD run.sh run.sh ADD src/run.sh run.sh
ADD backup.sh backup.sh ADD src/backup.sh backup.sh
ADD src/restore.sh restore.sh
CMD ["sh", "run.sh"] CMD ["sh", "run.sh"]

View File

@ -3,7 +3,7 @@
FROM alpine:3.6 FROM alpine:3.6
ADD install.sh install.sh ADD src/install.sh install.sh
RUN sh install.sh && rm install.sh RUN sh install.sh && rm install.sh
ENV POSTGRES_DATABASE **None** ENV POSTGRES_DATABASE **None**
@ -20,8 +20,10 @@ ENV S3_PATH 'backup'
ENV S3_ENDPOINT **None** ENV S3_ENDPOINT **None**
ENV S3_S3V4 no ENV S3_S3V4 no
ENV SCHEDULE **None** ENV SCHEDULE **None**
ENV DROP_PUBLIC no
ADD run.sh run.sh ADD src/run.sh run.sh
ADD backup.sh backup.sh ADD src/backup.sh backup.sh
ADD src/restore.sh restore.sh
CMD ["sh", "run.sh"] CMD ["sh", "run.sh"]

View File

@ -7,4 +7,61 @@ Fork goals:
- [x] automated builds - [x] automated builds
- [x] support multiple PostgreSQL versions - [x] support multiple PostgreSQL versions
- [ ] support encrypted (password-protected) backups - [ ] support encrypted (password-protected) backups
- [ ] merge backup and restore images? - [x] merge backup and restore images?
-------
# Usage
## Backup
### Docker
```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 \
eeshugerman/postgres-backup-s3
```
### Docker Compose
```yaml
postgres:
image: postgres
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
pgbackups3:
image: eeshugerman/postgres-backup-s3
container_name: pg-backup
links:
- postgres
environment:
SCHEDULE: '@daily'
S3_REGION: region
S3_ACCESS_KEY_ID: key
S3_SECRET_ACCESS_KEY: secret
S3_BUCKET: my-bucket
S3_PREFIX: backup
POSTGRES_DATABASE: dbname
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_EXTRA_OPTS: '--schema=public --blobs'
```
### 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).
## Restore
With the container running,
```sh
docker exec <container name> sh restore.sh
```

View File

@ -1,42 +0,0 @@
# postgres-backup-s3
Backup PostgresSQL to S3 (supports periodic backups)
## Usage
Docker:
```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
```
Docker Compose:
```yaml
postgres:
image: postgres
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
pgbackups3:
image: schickling/postgres-backup-s3
links:
- postgres
environment:
SCHEDULE: '@daily'
S3_REGION: region
S3_ACCESS_KEY_ID: key
S3_SECRET_ACCESS_KEY: secret
S3_BUCKET: my-bucket
S3_PREFIX: backup
POSTGRES_DATABASE: dbname
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_EXTRA_OPTS: '--schema=public --blobs'
```
### 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).

View File

@ -8,13 +8,13 @@ VERSIONS = (
) )
def render(dir_, postgres_version, alpine_version): def render(postgres_version, alpine_version):
with open(f'{dir_}/template.Dockerfile') as f: with open(f'template.Dockerfile') as f:
template = f.read() template = f.read()
rendered = template.format(alpine_version=alpine_version) rendered = template.format(alpine_version=alpine_version)
with open(f'{dir_}/{postgres_version}.Dockerfile', 'w') as f: with open(f'{postgres_version}.Dockerfile', 'w') as f:
f.write('# This file is generated from template.Dockerfile. Do not edit it directly.\n') f.write('# This file is generated from template.Dockerfile. Do not edit it directly.\n')
f.write('###########################################################################\n\n') f.write('###########################################################################\n\n')
f.write(rendered) f.write(rendered)
@ -22,5 +22,4 @@ def render(dir_, postgres_version, alpine_version):
if __name__ == '__main__': if __name__ == '__main__':
for versions in VERSIONS: for versions in VERSIONS:
render('backup', *versions) render(*versions)
render('restore', *versions)

View File

@ -1,23 +0,0 @@
# This file is generated from template.Dockerfile. Do not edit it directly.
###########################################################################
FROM alpine:3.8
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 DROP_PUBLIC 'no'
ADD restore.sh restore.sh
CMD ["sh", "restore.sh"]

View File

@ -1,23 +0,0 @@
# This file is generated from template.Dockerfile. Do not edit it directly.
###########################################################################
FROM alpine:3.10
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 DROP_PUBLIC 'no'
ADD restore.sh restore.sh
CMD ["sh", "restore.sh"]

View File

@ -1,23 +0,0 @@
# This file is generated from template.Dockerfile. Do not edit it directly.
###########################################################################
FROM alpine:edge
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 DROP_PUBLIC 'no'
ADD restore.sh restore.sh
CMD ["sh", "restore.sh"]

View File

@ -1,23 +0,0 @@
# This file is generated from template.Dockerfile. Do not edit it directly.
###########################################################################
FROM alpine:3.6
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 DROP_PUBLIC 'no'
ADD restore.sh restore.sh
CMD ["sh", "restore.sh"]

View File

@ -1,27 +0,0 @@
# postgres-restore-s3
Restore a SQL backup from S3 to PostgresSQL
## Warning
This will potentially put your database in a very bad state or complete destroy your data, be very careful.
## Limitations
This is made to restore a backup made from postgres-backup-s3, if you backup came from somewhere else please check your format.
* Your s3 bucket *must* only contain backups which you wish to restore - it will always grabs the 'latest' based on unix sort with no filtering
* They must be gzip encoded text sql files
* If your bucket has more than a 1000 files the latest may not be restore, only one s3 ls command is made
## Usage
Docker:
```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-restore-s3
```
## Dropping public
If you wish to drop the public schema (drop schema public cascade; create schema public) then set the environment variable DROP_PUBLIC=yes. This is useful for situations where you wish to restore a database which currently has data / schemas in it.

View File

@ -1,17 +0,0 @@
#! /bin/sh
# exit if a command fails
set -e
apk update
# install pg_dump
apk add postgresql
# install s3 tools
apk add python py-pip
pip install awscli
apk del py-pip
# cleanup
rm -rf /var/cache/apk/*

View File

@ -1,20 +0,0 @@
FROM alpine:{alpine_version}
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 DROP_PUBLIC 'no'
ADD restore.sh restore.sh
CMD ["sh", "restore.sh"]

View File

@ -3,16 +3,15 @@
# exit if a command fails # exit if a command fails
set -e set -e
apk update apk update
# install pg_dump # install pg_dump
apk add postgresql apk add postgresql-client
# install s3 tools # install s3 tools
apk add python py2-pip apk add python py-pip
pip install awscli pip install awscli
apk del py2-pip apk del py-pip
# install go-cron # install go-cron
apk add curl apk add curl

View File

@ -43,6 +43,12 @@ if [ "${POSTGRES_PASSWORD}" = "**None**" ]; then
exit 1 exit 1
fi fi
if [ "${S3_ENDPOINT}" == "**None**" ]; then
AWS_ARGS=""
else
AWS_ARGS="--endpoint-url ${S3_ENDPOINT}"
fi
# env vars needed for aws tools # env vars needed for aws tools
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
@ -53,11 +59,11 @@ POSTGRES_HOST_OPTS="-h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER"
echo "Finding latest backup" echo "Finding latest backup"
LATEST_BACKUP=$(aws s3 ls s3://$S3_BUCKET/$S3_PREFIX/ | sort | tail -n 1 | awk '{ print $4 }') LATEST_BACKUP=$(aws $AWS_ARGS s3 ls s3://$S3_BUCKET/$S3_PREFIX/ | sort | tail -n 1 | awk '{ print $4 }')
echo "Fetching ${LATEST_BACKUP} from S3" echo "Fetching ${LATEST_BACKUP} from S3"
aws s3 cp s3://$S3_BUCKET/$S3_PREFIX/${LATEST_BACKUP} dump.sql.gz aws $AWS_ARGS s3 cp s3://$S3_BUCKET/$S3_PREFIX/${LATEST_BACKUP} dump.sql.gz
gzip -d dump.sql.gz gzip -d dump.sql.gz
if [ "${DROP_PUBLIC}" == "yes" ]; then if [ "${DROP_PUBLIC}" == "yes" ]; then
@ -69,5 +75,7 @@ echo "Restoring ${LATEST_BACKUP}"
psql $POSTGRES_HOST_OPTS -d $POSTGRES_DATABASE < dump.sql psql $POSTGRES_HOST_OPTS -d $POSTGRES_DATABASE < dump.sql
rm dump.sql
echo "Restore complete" echo "Restore complete"

View File

@ -1,6 +1,6 @@
FROM alpine:{alpine_version} FROM alpine:{alpine_version}
ADD install.sh install.sh ADD src/install.sh install.sh
RUN sh install.sh && rm install.sh RUN sh install.sh && rm install.sh
ENV POSTGRES_DATABASE **None** ENV POSTGRES_DATABASE **None**
@ -17,8 +17,10 @@ ENV S3_PATH 'backup'
ENV S3_ENDPOINT **None** ENV S3_ENDPOINT **None**
ENV S3_S3V4 no ENV S3_S3V4 no
ENV SCHEDULE **None** ENV SCHEDULE **None**
ENV DROP_PUBLIC no
ADD run.sh run.sh ADD src/run.sh run.sh
ADD backup.sh backup.sh ADD src/backup.sh backup.sh
ADD src/restore.sh restore.sh
CMD ["sh", "run.sh"] CMD ["sh", "run.sh"]