diff --git a/abra.sh b/abra.sh index 01a5ee9..112d7c4 100644 --- a/abra.sh +++ b/abra.sh @@ -1,5 +1,6 @@ export ENTRYPOINT_VERSION=v2 export AUTO_WIZARD_VERSION=v2 +export PG_BACKUP_VERSION=v1 get_setting_changes() { /custom-entrypoint.sh "rails r 'puts JSON.pretty_generate(JSON.parse(Setting.all.select{ |setting| setting.state_current != setting.state_initial }.map { |setting| {name: setting.name, value: setting.state_current[\""value\""]} } .to_json))'" diff --git a/compose.yml b/compose.yml index c8d0058..352eecf 100644 --- a/compose.yml +++ b/compose.yml @@ -150,13 +150,17 @@ services: condition: on-failure labels: backupbot.backup: "true" - backupbot.backup.pre-hook: "PGPASSWORD=$$(cat /run/secrets/db_password) pg_dump -U $${POSTGRES_USER} $${POSTGRES_DB} > /var/lib/postgresql/data/backup.sql" + backupbot.backup.pre-hook: "/pg_backup.sh backup" backupbot.backup.volumes.postgresql-data.path: "backup.sql" - backupbot.restore.post-hook: 'psql -U $${POSTGRES_USER} -d postgres -c "DROP DATABASE $${POSTGRES_DB} WITH (FORCE);" && createdb -U $${POSTGRES_USER} $${POSTGRES_DB} && psql -U $${POSTGRES_USER} -d $${POSTGRES_DB} -f /var/lib/postgresql/data/backup.sql' + backupbot.restore.post-hook: '/pg_backup.sh restore' backupbot.backup.volumes.elasticsearch-data: "false" backupbot.backup.volumes.redis-data: "false" volumes: - postgresql-data:/var/lib/postgresql/data + configs: + - source: pg_backup + target: /pg_backup.sh + mode: 0555 secrets: - db_password healthcheck: @@ -230,6 +234,9 @@ configs: name: ${STACK_NAME}_auto_wizard_${AUTO_WIZARD_VERSION} file: auto_wizard.json.tmpl template_driver: golang + pg_backup: + name: ${STACK_NAME}_pg_backup_${PG_BACKUP_VERSION} + file: pg_backup.sh secrets: db_password: diff --git a/pg_backup.sh b/pg_backup.sh new file mode 100644 index 0000000..f58d8ec --- /dev/null +++ b/pg_backup.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +BACKUP_FILE='/var/lib/postgresql/data/backup.sql' + +function backup { + export PGPASSWORD=$(cat /run/secrets/db_password) + pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > $BACKUP_FILE +} + +function restore { + cd /var/lib/postgresql/data/ + # 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' + # Recreate Database + psql -U ${POSTGRES_USER} -d postgres -c "DROP DATABASE ${POSTGRES_DB} WITH (FORCE);" + createdb -U ${POSTGRES_USER} ${POSTGRES_DB} + psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f $BACKUP_FILE + # Restore allowed connections + cat pg_hba.conf.bak > pg_hba.conf + su postgres -c 'pg_ctl reload' +} + +$@