Backup and restore PostgreSQL databases to S3-compatible storages.
  • Shell 87.4%
  • Dockerfile 12.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-05 16:35:37 +02:00
.github/workflows Only push v18 for now 2026-08-05 16:35:37 +02:00
src Add support for PostgreSQL 16, drop 11 (#39) 2023-12-21 16:47:10 -05:00
.dir-locals.el add .dir-locals.el 2022-09-25 13:46:26 -04:00
.dockerignore add docker-compose.yaml for development/testing 2022-07-03 13:43:54 -04:00
.env.example Fork, add compatibility for PostgreSQL v18 2026-07-31 11:58:41 +02:00
.gitignore Fork, add compatibility for PostgreSQL v18 2026-07-31 11:58:41 +02:00
docker-compose.yaml Fork, add compatibility for PostgreSQL v18 2026-07-31 11:58:41 +02:00
Dockerfile share common env var code 2022-09-25 13:55:47 -04:00
LICENSE.txt Fork, add compatibility for PostgreSQL v18 2026-07-31 11:58:41 +02:00
README.md Fork, add compatibility for PostgreSQL v18 2026-07-31 11:58:41 +02:00

docker-postgres-s3-backup

This project provides Docker images to periodically back up a PostgreSQL database to AWS S3, and to restore from the backup as needed. It is forked from docker-postgres-backup-s3 and updated to support the latest PostgreSQL versions.

Usage

Backup

services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password

  backup:
    image: eeshugerman/postgres-backup-s3:16
    environment:
      SCHEDULE: '@weekly'     # optional
      BACKUP_KEEP_DAYS: 7     # optional
      PASSPHRASE: passphrase  # optional
      S3_REGION: region
      S3_ACCESS_KEY_ID: key
      S3_SECRET_ACCESS_KEY: secret
      S3_BUCKET: my-bucket
      S3_PREFIX: backup
      POSTGRES_HOST: postgres
      POSTGRES_DATABASE: dbname
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
  • Images are tagged by the major PostgreSQL version supported: 12, 13, 14, 15 or 16.
  • The SCHEDULE variable determines backup frequency. See go-cron schedules documentation here. Omit to run the backup immediately and then exit.
  • If PASSPHRASE is provided, the backup will be encrypted using GPG.
  • Run docker exec <container_name> sh backup.sh to trigger a backup ad-hoc.
  • If BACKUP_KEEP_DAYS is set, backups older than this many days will be deleted from S3.
  • Set S3_ENDPOINT if you're using a non-AWS S3-compatible storage provider.

Restore

Caution

DATA LOSS! All database objects will be dropped and re-created.

... from latest backup

docker exec <container_name> sh restore.sh

Note

If your bucket has more than a 1000 files, the latest may not be restored -- only one S3 ls command is used

... from specific backup

docker exec <container_name> sh restore.sh <timestamp>

Development

Build the image locally

ALPINE_VERSION determines Postgres version compatibility. See build-and-push-images.yml for the latest mapping.

DOCKER_BUILDKIT=1 docker build --build-arg ALPINE_VERSION=3.24 .

Run a simple test environment with Docker Compose

cp .env.example .env
# fill out your secrets/params in .env
docker compose up -d

Acknowledgements

This project is an update of the excellent eeshugerman/postgres-backup-s3, which in turn is a fork and re-structuring of schickling/postgres-backup-s3 and schickling/postgres-restore-s3.

Copyright (c) 2017 Johannes Schickling

Copyright (c) 2022 Elliott Shugerman

Copyright (c) 2026 Romein van Buren

Licensed under the MIT license.