Files
projects/Dockers/database-syncer/README.md
T
Bram e60cbc3da3
Build and Push Docker Images / build-and-push (push) Successful in 1m19s
database syncer
2026-10-01 16:42:30 +02:00

73 lines
2.1 KiB
Markdown

# 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
```bash
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
```yaml
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
```bash
docker build -t bramkel/database-syncer:latest .
```