diff --git a/.env.sample b/.env.sample index 0fd8b31..0fe97a1 100644 --- a/.env.sample +++ b/.env.sample @@ -28,4 +28,5 @@ LETS_ENCRYPT_ENV=production SECRET_SECRET_KEY_VERSION=v1 SECRET_JWT_KEY_VERSION=v1 +SECRET_DB_PASSWORD_VERSION=v1 diff --git a/abra.sh b/abra.sh new file mode 100644 index 0000000..edfd512 --- /dev/null +++ b/abra.sh @@ -0,0 +1 @@ +export PG_BACKUP_VERSION=v1 \ No newline at end of file diff --git a/compose.yml b/compose.yml index 0fb9937..641329b 100644 --- a/compose.yml +++ b/compose.yml @@ -4,17 +4,25 @@ version: "3.8" services: app: image: baserow/baserow:1.35.3 + depends_on: + - db networks: - proxy + - internal environment: - BASEROW_PUBLIC_URL=https://${DOMAIN} - SECRET_KEY_FILE=/run/secrets/secret_key - BASEROW_JWT_SIGNING_KEY_FILE=/run/secrets/jwt_key - BASEROW_CADDY_ADDRESSES=:80 - BASEROW_BUILDER_DOMAINS=${WILDCARD_DOMAIN} + - DATABASE_HOST=db + - DATABASE_NAME=postgres + - DATABASE_USER=postgres + - DATABASE_PASSWORD_FILE=/run/secrets/db_password secrets: - secret_key - jwt_key + - db_password deploy: restart_policy: condition: on-failure @@ -37,16 +45,45 @@ services: timeout: 10s retries: 10 start_period: 1m - volumes: - baserow_data:/baserow/data + db: + image: postgres:15 + volumes: + - postgres_data:/var/lib/postgresql/data + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD_FILE=/run/secrets/db_password + - POSTGRES_DB=postgres + networks: + internal: + deploy: + restart_policy: + condition: on-failure + labels: + backupbot.backup.pre-hook: "/pg_backup.sh backup" + backupbot.backup.volumes.postgres.path: "backup.sql" + backupbot.restore.post-hook: '/pg_backup.sh restore' + configs: + - source: pg_backup + target: /pg_backup.sh + mode: 0555 + secrets: + - db_password + healthcheck: + test: ["CMD-SHELL", "pg_isready", "-U", "postgres"] + interval: 30s + timeout: 10s + retries: 10 volumes: baserow_data: + postgres_data: networks: proxy: external: true + internal: secrets: secret_key: @@ -55,3 +92,11 @@ secrets: jwt_key: external: true name: ${STACK_NAME}_jwt_key_${SECRET_JWT_KEY_VERSION} + db_password: + external: true + name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_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 +} + +$@