# Introduction This project provides Docker images to periodically back up a database to AWS S3, and to restore from the backup as needed. # Usage ## Backup ```yaml services: postgres: image: postgres:13 environment: DATABASE_USER: user DATABASE_PASSWORD: password backup: image: reg.dev.krd/db-backup-s3/db-backup-s3:alpine-3.21 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 DATABASE_HOST: postgres DATABASE_NAME: dbname DATABASE_USER: user DATABASE_PASSWORD: password DATABASE_SERVER: postgres ``` - Images are tagged by the major PostgreSQL version supported: `11`, `12`, `13`, `14`, or `15`. - The `SCHEDULE` variable determines backup frequency. See go-cron schedules documentation [here](http://godoc.org/github.com/robfig/cron#hdr-Predefined_schedules). Omit to run the backup immediately and then exit. - If `PASSPHRASE` is provided, the backup will be encrypted using GPG. - Run `docker exec 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 > **WARNING:** DATA LOSS! All database objects will be dropped and re-created. ### ... from latest backup ```sh docker exec 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 ```sh docker exec sh restore.sh ``` # Development ## Build the image locally `ALPINE_VERSION` determines Postgres version compatibility. See [`build-and-push-images.yml`](.github/workflows/build-and-push-images.yml) for the latest mapping. ```sh DOCKER_BUILDKIT=1 docker build --build-arg ALPINE_VERSION=3.14 . ``` ## Run a simple test environment with Docker Compose ```sh cp template.env .env # fill out your secrets/params in .env docker compose up -d ``` # Acknowledgements This project is a fork and re-structuring @eeshugerman's fork of @schickling's [postgres-backup-s3](https://github.com/schickling/dockerfiles/tree/master/postgres-backup-s3) and [postgres-restore-s3](https://github.com/schickling/dockerfiles/tree/master/postgres-restore-s3). ## Fork goals The fork by @eeshugerman works very well for postgres databases, the repo is intended to add support for different databases.