diff --git a/pg_backup.sh b/pg_backup.sh index 5c5dca4..175714e 100755 --- a/pg_backup.sh +++ b/pg_backup.sh @@ -1,32 +1,34 @@ #!/bin/bash -# Postgres backup/restore hook for the `postgres` service. Invoked by backupbot-two via: -# backupbot.backup.pre-hook = "/pg_backup.sh backup" -# backupbot.backup.volumes.postgres_data.path = "backup.sql" -# backupbot.restore.post-hook = "/pg_backup.sh restore" -# Backup dumps the DB to backup.sql (gzip) inside the postgres volume; backupbot archives it. -# Restore reimports it. The mattermost app keeps TCP connections open to the DB, so restore must -# terminate them and FORCE-drop before recreating, then reimport the dump deterministically — the -# previous recipe shipped no restore hook (file-level PGDATA restore did not reload into the running -# postgres), so a restored backup silently kept the live (un-restored) state. - set -e BACKUP_FILE='/var/lib/postgresql/data/backup.sql' -export PGPASSWORD=$(cat "${POSTGRES_PASSWORD_FILE:-/run/secrets/postgres_password}") -DB_USER="${POSTGRES_USER:-mattermost}" -DB_NAME="${POSTGRES_DB:-mattermost}" function backup { - pg_dump -U "$DB_USER" "$DB_NAME" | gzip > "$BACKUP_FILE" + export PGPASSWORD=$(cat $POSTGRES_PASSWORD_FILE) + pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} | gzip > $BACKUP_FILE } function restore { - psql -U "$DB_USER" -d postgres -c \ - "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='${DB_NAME}' AND pid<>pg_backend_pid();" - psql -U "$DB_USER" -d postgres -c "DROP DATABASE ${DB_NAME} WITH (FORCE);" - createdb -U "$DB_USER" "$DB_NAME" - gunzip -c "$BACKUP_FILE" | psql -U "$DB_USER" -d "$DB_NAME" -1 -v ON_ERROR_STOP=1 -f - + cd /var/lib/postgresql/data/ + restore_config(){ + # Restore allowed connections + cat pg_hba.conf.bak > pg_hba.conf + su postgres -c 'pg_ctl reload' + } + # Don't allow any other connections than local + cp pg_hba.conf pg_hba.conf.bak + echo "local all all trust" > pg_hba.conf + su postgres -c 'pg_ctl reload' + trap restore_config EXIT INT TERM + + # Recreate Database + psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);" + createdb -U ${POSTGRES_USER} ${POSTGRES_DB} + gunzip -c $BACKUP_FILE | psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f - + + trap - EXIT INT TERM + restore_config } $@