Files
projects/Dockers/database-syncer

database-syncer

PostgreSQL sync van source → destination op een CRON-schema.

De source-database wordt nooit aangepast: alleen pg_dump (reads/SELECT), met default_transaction_read_only=on op de source-connectie.

Environment variables

Required

Variable Description
SOURCE_DB_URL PostgreSQL URL van de bron (alleen gelezen)
DEST_DB_URL PostgreSQL URL van de bestemming (wordt overschreven)
CRON 5-veld cron-expressie (bijv. 0 3 * * *) of macro (@hourly, @daily, ...)

Optional

Variable Default Description
TZ Europe/Brussels Tijdzone
ON_STARTUP true Direct syncen bij opstart (true/false)

URL-formaat: postgresql://user:password@host:5432/dbname

Gedrag

  1. Dump van source via pg_dump (custom format, read-only).
  2. Restore naar destination via pg_restore --clean --if-exists (bestaande objecten op dest worden vervangen).
  3. Herhaalt volgens CRON.

Let op: de destination wordt bij elke sync opgeschoond (DROP + recreate van objecten). Gebruik hiervoor een dedicated shadow/replica-database, niet productie met unieke data.

Source read-only garantie

  • Enkel pg_dump praat met de source (geen psql writes, geen restore).
  • PGOPTIONS=-c default_transaction_read_only=on op de source-connectie.
  • Aanbevolen: geef de source-credentials een read-only PostgreSQL-rol.

Voorbeeld

docker run -d \
  -e SOURCE_DB_URL='postgresql://ro:secret@source:5432/prod' \
  -e DEST_DB_URL='postgresql://rw:secret@dest:5432/shadow' \
  -e 'CRON=0 3 * * *' \
  -e TZ=Europe/Brussels \
  --name database-syncer \
  bramkel/database-syncer:latest

Compose

  database-syncer:
    image: bramkel/database-syncer:latest
    container_name: database-syncer
    restart: unless-stopped
    environment:
      - TZ=Europe/Brussels
      - SOURCE_DB_URL=postgresql://ro:secret@source:5432/prod
      - DEST_DB_URL=postgresql://rw:secret@dest:5432/shadow
      - 'CRON=0 3 * * *'
      - ON_STARTUP=true

Build

docker build -t bramkel/database-syncer:latest .