diff --git a/.env.sample b/.env.sample index ec3d75f..491379c 100644 --- a/.env.sample +++ b/.env.sample @@ -9,3 +9,4 @@ LETS_ENCRYPT_ENV=production SECRET_DB_PASSWORD_VERSION=v1 SECRET_NC_DB_URL_VERSION=v1 +ENABLE_BACKUPS=true diff --git a/README.md b/README.md index 5d91d88..2fc3d56 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ * **Status**: 0 * **Image**: [`nocodb`](https://hub.docker.com/r/nocodb), 4, upstream * **Healthcheck**: No -* **Backups**: No +* **Backups**: Yes * **Email**: No * **Tests**: No * **SSO**: No diff --git a/abra.sh b/abra.sh new file mode 100644 index 0000000..0975f1e --- /dev/null +++ b/abra.sh @@ -0,0 +1 @@ +export PG_BACKUP_VERSION=v1 diff --git a/compose.yml b/compose.yml index 7c521c7..a1f58b2 100644 --- a/compose.yml +++ b/compose.yml @@ -28,6 +28,7 @@ services: #- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect" #- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true" #- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}" + - "backupbot.backup=${ENABLE_BACKUPS:-true}" - "coop-cloud.${STACK_NAME}.version=1.1.1+0.263.0" db: @@ -47,6 +48,16 @@ services: interval: 10s timeout: 2s retries: 10 + deploy: + labels: + backupbot.backup: "${ENABLE_BACKUPS:-true}" + backupbot.backup.pre-hook: "/pg_backup.sh backup" + backupbot.backup.volumes.db.path: "backup.sql" + backupbot.restore.post-hook: '/pg_backup.sh restore' + configs: + - source: pg_backup + target: /pg_backup.sh + mode: 0555 volumes: data: @@ -65,3 +76,7 @@ secrets: nc_db_url: external: true name: ${STACK_NAME}_nc_db_url_${SECRET_NC_DB_URL_VERSION} +configs: + pg_backup: + name: ${STACK_NAME}_pg_backup_${PG_BACKUP_VERSION} + file: pg_backup.sh diff --git a/pg_backup.sh b/pg_backup.sh new file mode 100644 index 0000000..e83074d --- /dev/null +++ b/pg_backup.sh @@ -0,0 +1,34 @@ +#!/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/ + 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} + psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} -1 -f $BACKUP_FILE + + trap - EXIT INT TERM + restore_config +} + +$@