← EP21 Internal Docs EP21 Backup Engine
Solution Design · DS-0001 · v1.3.0

System Overview — EP21 DB Backup Engine

proposed Authors: david.sorf, claude-sonnet-4-6 Created: 2026-04-09 Updated: 2026-04-09
backup postgresql restic docker ep21 system-overview
EP21 DB Backup Engine je self-contained, kontejnerizovaný backup systém pro PostgreSQL databáze na VM prostředí. Poskytuje duální zálohovací vrstvu (lokální SQL dumpy + šifrované restic snapshoty), řízený lifecycle lokálních dumpů a plnou operační observabilitu. Navržen pro EP21 infrastrukturu, běží jako Docker kontejner s Docker-in-Docker source detection, podporuje Brew PostgreSQL (macOS dev) i Docker-hosted PostgreSQL (produkce). Tento dokument je centrální architektonický přehled systému — vstupní bod pro všechny návazné DS a ADR dokumenty.
Related docs:

System Context Diagram

📊 diagrams/system-context.mmd ready

Diagram zachycuje: EP21 DB Backup Engine jako centrální systém, jeho externí závislosti (PostgreSQL zdroje, Contabo S3, Docker daemon), a aktéry (Cron, Admin/DevOps). První draft — Mermaid flowchart.

flowchart TB
    admin(["👤 Admin / DevOps"])
    cron(["⏰ Cron"])

    subgraph sys ["EP21 DB Backup Engine"]
        engine["🐳 Backup Container\n(scheduler, pg_dump, restic)"]
    end

    brew["🍺 Brew PostgreSQL\n(host)"]
    docker_pg["🐳 Docker PostgreSQL\n(kontejnery na hostu)"]
    docker_daemon["🐳 Docker Daemon\n(/var/run/docker.sock)"]
    contabo["☁️ Contabo S3\n(remote object storage)"]
    local_fs["💾 VM Filesystem\nbkup_data/, restic-repo/"]

    cron -->|"spouští daily run"| engine
    admin -->|"wrapper skripty\n(start, status, logs...)"| engine
    engine -->|"pg_dump přes host-gateway"| brew
    engine -->|"docker exec pg_dump"| docker_pg
    docker_daemon -->|"docker ps / inspect"| engine
    engine -->|"restic backup"| contabo
    engine -->|"SQL dumpy + snapshoty"| local_fs
Diag 1 — System Context Diagram, ver 0.1

Architecture Overview Diagram

📊 diagrams/architecture-overview.mmd ready

Diagram zachycuje: čtyřvrstvou interní architekturu systému (Orchestration → Primary → Secondary → Lifecycle), tokový pohled na data (detect → dump → restic → prune), a vazby na fyzická úložiště (bkup_data, restic-repo, meta, logs). První draft — Mermaid flowchart.

flowchart TD
    subgraph orch ["Orchestration Layer"]
        sched["scheduler.sh\n(cron entry point)"]
        lock["Lock Manager\n(daily.lock)"]
        daily["daily.sh"]
    end

    subgraph primary ["Primary Layer"]
        detect["Source Detection\n(Brew PG + Docker PG)"]
        dump["pg_dump\n(per DB)"]
        naming["Artifact Naming\nSHA256 dedup"]
    end

    subgraph secondary ["Secondary Layer"]
        restic["restic backup\n(encrypted snapshot)"]
        posthook["restic post-hook\n(prune remote)"]
    end

    subgraph lifecycle ["Lifecycle Layer"]
        retention["Retention Engine\n(prune local dumps)"]
        meta["Metadata Writer\n(run.json, inventory)"]
    end

    subgraph storage ["Storage"]
        bkup["bkup_data/\n(SQL dumpy)"]
        repo["restic-repo/\n(šifrované snapshoty)"]
        metadir["meta/\n(JSON inventář)"]
        logs["logs/"]
        s3["☁️ Contabo S3"]
    end

    sched --> lock --> daily
    daily --> detect --> dump --> naming --> bkup
    naming --> meta --> metadir
    daily --> restic --> repo
    restic --> posthook --> s3
    daily --> retention --> bkup
    daily --> meta
    daily --> logs
Diag 2 — Architecture Overview Diagram, ver 0.1

System Context

Problém

PostgreSQL databáze na VM prostředí potřebují pravidelné, auditovatelné zálohy s:

Odpověď

EP21 DB Backup Engine nasadí jako Docker kontejner na každý VM. Kontejner:

1. detekuje lokální PostgreSQL zdroje (Brew + Docker containers)

2. provede dump každé databáze s metadaty a checksumem

3. snapshot dumpů uloží do restic repozitáře (lokální nebo remote S3)

4. prune staré lokální dumpy po ověření v restic

Hranice systému

Aktéři a systémy

Aktér / SystémTypRole v systému

Cron daemon

Interní (Docker)

Spouští db_bkup_daily.sh podle DAILY_CRON schedulu; jediný pravidelný trigger systému

Admin / DevOps

Člověk

Instaluje, konfiguruje, monitoruje; spouští ad-hoc příkazy přes wrapper skripty v scripts/

PostgreSQL (Brew)

Externí systém

Lokální databázový zdroj na macOS dev prostředí; detekován přes pg_isready a psql

PostgreSQL (Docker)

Externí systém

Kontejnerizovaný databázový zdroj na produkčním VM; detekován přes Docker socket

Docker runtime

Platforma

Hostuje backup kontejner; poskytuje socket pro source detection Docker kontejnerů

Restic

Externí nástroj

Sekundární zálohovací vrstva; deduplikace, šifrování, snapshot management a retention

Contabo S3

Externí systém

Remote object storage pro terciární kopii restic repozitáře (volitelné)

Architektura — čtyři vrstvy

Systém je organizován do čtyř explicitně oddělených vrstev. Každá vrstva má vlastní skript, vlastní exit kód a vlastní metadata výstup.

Vrstva 1 — Primary (db_bkup.sh)

detect → plan → backup → metadata

Vrstva 2 — Secondary (db_bkup_posthook_restic.sh)

restic snapshot → retention enforce → tag

Vrstva 3 — Lifecycle (db_bkup_prune_local_after_restic.sh)

verify restic snapshot → prune local dumps

Vrstva 4 — Orchestration (db_bkup_daily.sh)

lock → layer1 → layer2 → layer3 → unlock

Data Flow

PostgreSQL (Brew/Docker)
        │
        │ pg_dump
        ▼
  bkup_data/<machine>/<source>/<db>/<YYYY-MM>/
    ├── <timestamp>.dump          ← SQL dump
    ├── <timestamp>.sha256        ← SHA256 artefaktu
    ├── <timestamp>.meta.json     ← metadata per dump
    ├── latest.dump               ← symlink na poslední dump
    └── meta.latest.json          ← symlink na poslední meta
        │
        │ restic backup
        ▼
  restic repository (lokální nebo Contabo S3)
    └── snapshot tagged: ep21, db-bkup, <machine_name_uniq>
        │
        │ po úspěšném restic
        ▼
  prune lokálních dumpů
    └── zachovat keep_local=2 (konfigurovatelné)

Metadata tok:

meta/inventory/
  ├── sources.<timestamp>.json    ← detekované zdroje
  ├── plan.<timestamp>.json       ← zálohovací plán
  ├── run.<timestamp>.json        ← výsledek primary vrstvy
  ├── restic_run.<timestamp>.json ← výsledek secondary vrstvy
  └── local_prune.<timestamp>.json← výsledek lifecycle vrstvy

meta/db/<source_id>/<db>/<timestamp>.json ← per-DB metadata

Adresářová struktura (runtime)

conf/
  machine.json                    ← machine_name_uniq (generováno, persistováno)
  retention.db_bkup.json          ← local retention policy (keep_local=2)
  retention.restic.json           ← restic retention policy (30/12/7)

meta/inventory/
  run.*.json                      ← výsledek každého denního běhu
  sources.*.json                  ← detekované zdroje
  plan.*.json                     ← zálohovací plán
  restic_run.*.json               ← výsledek restic vrstvy
  local_prune.*.json              ← výsledek prune vrstvy
  *.latest.json                   ← symlinky na poslední verzi

meta/db/<source_id>/<db>/<timestamp>.json

bkup_data/<machine_name_uniq>/db_data/<source_id>/<db>/<YYYY-MM>/
  <timestamp>.dump
  <timestamp>.sha256
  <timestamp>.meta.json
  latest.dump
  meta.latest.json

logs/
  machine/
  source/
  db/
  scheduler/
  restic/

Deployment model

Systém běží jako jeden Docker kontejner na každém cílovém VM.

Image: registry.gitlab.com/<org>/ep21-db-bkup:<version>

Povinné volume mounty:

Entrypoint příkazy:

daily | backup | report | retention-report | storage-report | restic-posthook | prune-local | cron-daemon | shell

Cron daemon mode: kontejner startuje s cron-daemon, interní cron spouští daily podle DAILY_CRON env (default: 0 2 * * *).

Docker packaging detail: viz ADR-0007 (Docker packaging) a ADR-0008 (container runtime connectivity).

Retention model

VrstvaPolicy souborKlíčové parametryKde se aplikuje

Local dumps

conf/retention.db_bkup.json

keep_local=2 (zachovat 2 poslední dumpy per DB)

db_bkup_prune_local_after_restic.sh

Restic snapshots

conf/retention.restic.json

keep_daily=30, keep_monthly=12, keep_yearly=7

db_bkup_posthook_restic.shrestic forget --prune

Remote (Contabo S3)

shodné s restic policy

Kopie restic repozitáře přes restic copy

scripts/restic-contabo.sh

Integrita a detekce změn

Každý dump má dvě úrovně integrity:

SHA256 artefaktu (artifact.sha256)

SQL Logical Fingerprint (fingerprint.sql_v1)

Change tracking:

Failure semantics

Orchestrace (db_bkup_daily.sh) vede separátní exit kódy pro každou vrstvu:

overall_exit je bitový OR všech tří — fail v kterékoli vrstvě je viditelný cronu a neblokuje ostatní vrstvy.

Princip: partial success je lepší než žádný backup. Pokud restic selže, local dumpy zůstanou. Pokud prune selže, data nejsou ztracena — jen se nezrušily staré dumpy.

Security model

Operační observability

Machine identity

Každý VM má jedinečný identifikátor machine_name_uniq uložený v conf/machine.json. Identifikátor je:

Roadmap: centrální API pro ověření uniqueness machine ID při bootstrapu VM; při detekci duplicity alert pro SOC.

Roadmap a známá omezení

ADR Index

IDTitulekAccepted ver.Aktuální ver.Stav

ADR-0001

Metadata-First Backup Inventory

1.0.0

1.1.0

✓ Migrováno — draft amendment: cron orchestrace TODO, git metadata backup idea

ADR-0002

Source Detection Model — EP21 Backup Agent, Port-Based Discovery, Extensible DB Support

1.0.0

1.1.0

✓ Migrováno — draft amendment v1.1.0: port-based detekce, agent model, extensible DB (neschváleno)

ADR-0003

Artifact Naming, SHA256 and Symlink Strategy

1.0.0

1.1.0

✓ Migrováno — draft amendment: SHA jako Level 1 restore validace, JSON history lifecycle TODO

ADR-0004

Partial Run Status — Always-Written Run Metadata

1.0.0

1.0.0

✓ Migrováno

ADR-0005

Skip Storing Duplicate Dump by SHA (SKIP_IF_SAME_SHA)

1.0.0

1.0.0

✓ Migrováno

ADR-0006

SQL-Based Logical Fingerprint (fingerprint.sql_v1)

1.0.0

1.0.0

✓ Migrováno

ADR-0007

Docker Packaging — EP21 VM Backup Engine

1.0.0

1.0.0

✓ Migrováno

ADR-0008

Container Runtime Connectivity and Ops Wrappers

1.0.0

1.0.2

✓ Migrováno — follow-up links na ADR-0011, ADR-0012

ADR-0009

Daily Locking and Stale Lock Recovery

1.0.0

1.0.0

✓ Migrováno

ADR-0010

Multi-Root Merge, Remote Object Storage, and Sharding Placeholder

1.0.0

1.0.0

✓ Migrováno

ADR-0011

Docker Discovery Privilege Isolation — Sidecar Model

None

0.1.0

Draft — follow-up z ADR-0008, rozhodnutí TBD

ADR-0012

VM Hardening Guidelines for Backup Agent

None

0.1.0

Draft — follow-up z ADR-0008, rozhodnutí TBD

Changelog

VersionDateAuthorNote
1.3.02026-04-10claude-sonnet-4-6

Přidány Mermaid diagramy: system-context.mmd a architecture-overview.mmd (první draft). Diagram sekce aktualizovány ze status=planned na status=ready.

1.2.02026-04-09claude-sonnet-4-6

Přidány ADR-0011 a ADR-0012 (oba draft) do related_docs a ADR index tabulky. Aktualizována verze ADR-0008 na 1.0.2.

1.1.02026-04-09david.sorf + claude-sonnet-4-6

Aktualizován ADR index: všech 10 ADR migrováno do design/adr/ JSON formátu. ADR-0001/0002/0003 mají draft amendments (v1.1.0). Přidány related_docs linky na všechny ADR. ADR index tabulka rozšířena o accepted_version, aktuální verzi a stav migrace.

1.0.02026-04-09david.sorf + claude-sonnet-4-6

Initial version. Migrace obsahu ze SolutionDesign.md do DAK struktury. Rozšířeno o: actors tabulku, data flow diagram, system context, deployment model, machine identity sekci. Diagram placeholdery pro System Context a Architecture Overview (TBD). ADR index ukazuje na existující Markdown ADR v doc/ADR/ — nutno migrovat do design/adr/ JSON formátu.