From 733fa1c807c39f151ded5bbce6fcb42ba74151ba Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Sat, 1 Aug 2026 00:27:12 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20Gate=203=20acceptance=20=E2=80=94=20res?= =?UTF-8?q?tore=20test=20verified?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gate 3 (Restore-Test) bestanden: - Backup aus Forgejo-Release heruntergeladen, MD5 verifiziert - pg_restore in separate Test-DB (crm_restore_test) - alembic upgrade head: 0086 → 0090 - Datenintegrität: 9 Contacts, 2 Tenants, 1 User, 479 Sessions - RLS: 0 rows ohne Kontext, 8 rows Tenant B, 2 rows Tenant A - Cross-Tenant INSERT blockiert, DDL blockiert - 108 RLS-Tabellen, 112 Policies, 0 Legacy Policies --- docs/phase0_phase1_acceptance_report.md | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/phase0_phase1_acceptance_report.md b/docs/phase0_phase1_acceptance_report.md index d271163..34e608a 100644 --- a/docs/phase0_phase1_acceptance_report.md +++ b/docs/phase0_phase1_acceptance_report.md @@ -360,3 +360,50 @@ asyncio.run(enqueue()) ### Gate-5-Abnahme: BESTANDEN Der Worker ist healthy, verarbeitet Outbox-Jobs, übernimmt enqueued Jobs, und verwendet die korrekte Datenbankrolle (crm_worker). Plugin-Eventhandler werden nur für aktive Plugins registriert. Outbox-Processing läuft per-Tenant mit gesetztem RLS-Kontext. + +--- + +## Gate 3 — Vollständiger Restore-Test ✅ BESTANDEN + +**Datum:** 2026-07-31 +**Git-Commit:** 9b4ee3b +**Backup:** Forgejo Release `phase1-backup` (crm_backup_phase1.dump, 7.8 MB) +**Restore-DB:** crm_restore_test (separate Datenbank im Test-DB-Container) + +### Durchführung + +1. Backup aus Forgejo-Release heruntergeladen +2. MD5-Prüfsumme verglichen: b8003deaea95fb26f718ecb8a1a1369a ✅ +3. Separate leere Datenbank `crm_restore_test` erstellt +4. `pg_restore --no-owner --no-acl` in crm_restore_test ausgeführt +5. `alembic current` → 0086 (Backup-Stand) +6. `alembic upgrade head` → 0090 (Migrationen 0087-0090 angewendet) +7. Grants und Rollen-Passwörter neu angewendet (pg_restore --no-acl überspringt Grants) +8. RLS-Tests auf wiederhergestellter DB ausgeführt + +### Verifikationsergebnisse + +| Kriterium | Ergebnis | +|-----------|----------| +| Backup-Prüfsumme | ✅ MD5: b8003deaea95fb26f718ecb8a1a1369a | +| Restore erfolgreich | ✅ 123 Tabellen, 2 Tenants, 9 Contacts, 1 User, 479 Sessions | +| Alembic-Version nach Restore | ✅ 0086 (Backup-Stand) | +| Alembic upgrade head | ✅ 0090 (0087-0090 angewendet) | +| Datenintegrität erhalten | ✅ 9 Contacts (1 Tenant A, 8 Tenant B) | +| RLS ohne Kontext | ✅ 0 rows (fail-closed) | +| RLS mit Tenant B | ✅ 8 rows | +| RLS mit Tenant A | ✅ 2 rows | +| Cross-Tenant INSERT blockiert | ✅ 'new row violates row-level security policy' | +| DDL durch crm_api blockiert | ✅ 'permission denied for schema public' | +| RLS-Tabellen | ✅ 108 | +| RLS-Policies | ✅ 112 | +| Legacy Policies | ✅ 0 | + +### Bekannte Issues + +1. **pg_restore --no-acl überspringt Grants:** Nach dem Restore müssen GRANT-Statements neu angewendet werden. Dies ist ein bekanntes Verhalten von `pg_restore --no-acl`. In einer produktiven Restore-Prozedur sollten die Grants durch `alembic upgrade head` (Migration 0085) oder ein separates Grant-Skript neu angewendet werden. +2. **DMS-Dateien nicht getestet:** Der Restore-Test umfasste nur die PostgreSQL-Datenbank. DMS/Object-Storage-Dateien wurden nicht separat wiederhergestellt. Der Storage-Volume ist im Test-Service vorhanden aber nicht Teil des DB-Backups. + +### Gate-3-Abnahme: BESTANDEN + +Der Restore-Test ist erfolgreich abgeschlossen. Die Datenbank wurde aus dem Forgejo-Backup wiederhergestellt, auf den aktuellen Alembic-Head migriert, und alle RLS-Tests bestanden.