Skip to content
Snippets Groups Projects
user avatar
Elliott Shugerman authored
- --blobs by default
- always drop and recreate schemas, specified by DROP_SCHEMAS
e8ad6ceb
History
Name Last commit Last update
src
LICENSE.txt
README.md
render.py
template.Dockerfile

Introduction

This project provides Docker images to periodically backup a PostgreSQL database to AWS S3, and to restore from the backup as needed.

Credit where due

This repository is a fork and re-structuring of schickling's postgres-backup-s3 and postgres-restore-s3.

Fork goals:

  • dedicated repository
  • automated builds
  • support multiple PostgreSQL versions
  • merge backup and restore images?
  • support encrypted (password-protected) backups
  • option to restore from specific backup by timestamp

Other changes:

  • uses pg_dump's custom format (see docs)
  • backup blobs and all schemas by default
  • recreate all database objects on restore
  • some env vars renamed
  • only scheduled backups supported, not ad-hoc

Usage

Backup

postgres:
  image: postgres:11
  environment:
    POSTGRES_USER: user
    POSTGRES_PASSWORD: password

pgbackups3:
  image: eeshugerman/postgres-backup-s3:11
  environment:
    SCHEDULE: '@daily'
    PASSPHRASE: passphrase
    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

Notes

PostgreSQL version

Images are tagged by the major PostgreSQL version they support: 9, 10, 11, or 12.

Scheduling

The SCHEDULE variable is determines backup frequency. See go-cron schedules documentation here.

Encrypted backups

If PASSPHRASE is provided, the backup will be encrypted using GPG.

Restore

WARNING: DATA LOSS! All database objects will be dropped and recreated.

From latest backup (based on unix sort)

docker exec <container name> sh restore.sh

Notes

  • If your bucket has more than a 1000 files the latest may not be restored, only one S3 ls command is used
  • Your S3 prefix should only contain backups which you wish to restore - 'latest' is determined based on unix sort with no filtering

From specific backup

docker exec <container name> sh restore.sh <timestamp>