Backup PostgresSQL to the local filesystem with periodic rotating backups, based
on schickling/postgres-backup-s3. Backup multiple databases
from the same host by setting the database names in POSTGRES_DB separated by commas or spaces.
Supports the following Docker architectures: linux/amd64, linux/arm64, linux/arm/v7, linux/s390x
, linux/ppc64le.
Helm:
helm upgrade --install postgres-backup-local .
values:
postgres-backup-local:
auth:
# must match release name
existingPasswordSecret: postgres-backup-local-auth
config:
postgres_host: pg-auth-db-1414-1212-468f-1111-ae0.aivencloud.com
postgres_port: 21699
postgres_db: auth
postgres_extra_opts: "-Z6"
schedule: "@daily"
backup_keep_days: 7
backup_keep_weeks: 4
backup_keep_months: 6
healthcheck_port: 8080
replicas: 1
persistence:
enabled: true
storageClass: "longhorn-crypto-global"
mountPath: /backups
size: 8Gi
For security reasons it is recommended to run it as user postgres:postgres.
In case of running as postgres user, the system administrator must initialize the permission of the destination folder
as follows:
# for default images (debian)
mkdir -p /var/opt/pgbackups && chown -R 999:999 /var/opt/pgbackups
# for alpine images
mkdir -p /var/opt/pgbackups && chown -R 70:70 /var/opt/pgbackups
Most variables are the same as in the official postgres image.
| env variable | description |
|---|---|
| BACKUP_DIR | Directory to save the backup at. Defaults to /backups. |
| BACKUP_SUFFIX | Filename suffix to save the backup. Defaults to .sql.gz. |
| BACKUP_KEEP_DAYS | Number of daily backups to keep before removal. Defaults to 7. |
| BACKUP_KEEP_WEEKS | Number of weekly backups to keep before removal. Defaults to 4. |
| BACKUP_KEEP_MONTHS | Number of monthly backups to keep before removal. Defaults to 6. |
| BACKUP_KEEP_MINS | Number of minutes for last folder backups to keep before removal. Defaults to 1440. |
| HEALTHCHECK_PORT | Port listening for cron-schedule health check. Defaults to 8080. |
| POSTGRES_DB | Comma or space separated list of postgres databases to backup. Required. |
| POSTGRES_DB_FILE | Alternative to POSTGRES_DB, but with one database per line, for usage with docker secrets. |
| POSTGRES_EXTRA_OPTS | Additional options for pg_dump (or pg_dumpall options if POSTGRES_CLUSTER is set). Defaults to -Z6. |
| POSTGRES_CLUSTER | Set to TRUE in order to use pg_dumpall instead. Also set POSTGRES_EXTRA_OPTS to any value or empty since the default value is not compatible with pg_dumpall. |
| POSTGRES_HOST | Postgres connection parameter; postgres host to connect to. Required. |
| POSTGRES_PASSWORD | Postgres connection parameter; postgres password to connect with. Required. |
| POSTGRES_PASSWORD_FILE | Alternative to POSTGRES_PASSWORD, for usage with docker secrets. |
| POSTGRES_PASSFILE_STORE | Alternative to POSTGRES_PASSWORD in passfile format, for usage with postgres clusters. |
| POSTGRES_PORT | Postgres connection parameter; postgres port to connect to. Defaults to 5432. |
| POSTGRES_USER | Postgres connection parameter; postgres user to connect with. Required. |
| POSTGRES_USER_FILE | Alternative to POSTGRES_USER, for usage with docker secrets. |
| SCHEDULE | Cron-schedule specifying the interval between postgres backups. Defaults to @daily. |
| TZ | POSIX TZ variable specifying the timezone used to evaluate SCHEDULE cron (example “Europe/Paris”). |
This variables are not intended to be used for normal deployment operations:
| env variable | description |
|---|---|
| POSTGRES_PORT_5432_TCP_ADDR | Sets the POSTGRES_HOST when the latter is not set. |
| POSTGRES_PORT_5432_TCP_PORT | Sets POSTGRES_PORT when POSTGRES_HOST is not set. |
By default this container makes daily backups, but you can start a manual backup by running /backup.sh.
This script as example creates one backup as the running user and saves it the working folder.
docker run --rm -v "$PWD:/backups" -u "$(id -u):$(id -g)" -e POSTGRES_HOST=postgres -e POSTGRES_DB=dbname -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password prodrigestivill/postgres-backup-local /backup.sh
You can change the SCHEDULE environment variable in -e SCHEDULE="@daily" to alter the default frequency. Default
is daily.
More information about the scheduling can be found here.
Folders daily, weekly and monthly are created and populated using hard links to save disk space.
Some examples to restore/apply the backups.
To restore using the same backup container, replace $BACKUPFILE, $CONTAINER, $USERNAME and $DBNAME from the
following command:
docker exec --tty --interactive $CONTAINER /bin/sh -c "zcat $BACKUPFILE | psql --username=$USERNAME --dbname=$DBNAME -W"
Replace $BACKUPFILE, $VERSION, $HOSTNAME, $PORT, $USERNAME and $DBNAME from the following command:
docker run --rm --tty --interactive -v $BACKUPFILE:/tmp/backupfile.sql.gz postgres:$VERSION /bin/sh -c "zcat /tmp/backupfile.sql.gz | psql --host=$HOSTNAME --port=$PORT --username=$USERNAME --dbname=$DBNAME -W"