docs: Gate 2 acceptance — fresh DB install verified
Gate 2 (Neuinstallation auf leerer Datenbank) bestanden: - Alembic-Head 0090, 124 Tabellen, 47 RLS-Tabellen - 0 legacy app.tenant_id policies - Alle 4 DB-Rollen korrekt (NOSUPERUSER, crm_migration BYPASSRLS) - RLS fail-closed: 0 rows ohne Kontext - Cross-Tenant INSERT blockiert - crm_api DDL blockiert - seed_admin.py funktioniert - Login erfolgreich (200 OK) - Keine manuellen Schemaänderungen
This commit is contained in:
@@ -191,3 +191,83 @@ Worker verarbeitet Outbox-Jobs und send_password_reset_email. Plugin-Eventhandle
|
|||||||
- Gate 5 (Worker-Eventhandler): ⏳ Offen
|
- Gate 5 (Worker-Eventhandler): ⏳ Offen
|
||||||
|
|
||||||
Phase 0 und Phase 1 können als technisch abgenommen gelten, sobald Gate 2, 3 und 5 abgeschlossen sind.
|
Phase 0 und Phase 1 können als technisch abgenommen gelten, sobald Gate 2, 3 und 5 abgeschlossen sind.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Gate 2 — Neuinstallation auf leerer Datenbank ✅ BESTANDEN
|
||||||
|
|
||||||
|
**Datum:** 2026-07-31
|
||||||
|
**Git-Commit:** 89b775b
|
||||||
|
**Test-Service:** g13zwdav6myvpnop96dj7tpx (crmtest.media-on.de)
|
||||||
|
**Image:** stvabl4vaqru7jclx4ittzr3:89b775b
|
||||||
|
**DB-Image:** pgvector/pgvector:pg16
|
||||||
|
|
||||||
|
### Durchführung
|
||||||
|
|
||||||
|
1. Coolify Test-Service mit eigener PostgreSQL, Redis, API, Worker erstellt
|
||||||
|
2. DB-Volume gelöscht für vollständig leere DB
|
||||||
|
3. Image aus Git-Commit 89b775b auf Server gebaut
|
||||||
|
4. Compose aktualisiert: Image 89b775b + pgvector/pgvector:pg16
|
||||||
|
5. `docker compose up -d` — alle Container gestartet
|
||||||
|
6. prestart.sh führte `alembic upgrade head` als crm_user aus
|
||||||
|
7. Migrationen 0001→0090 automatisch ausgeführt
|
||||||
|
8. Plugin-Migrationen über crm_migration ausgeführt (P0-Fix)
|
||||||
|
9. seed_admin.py ausgeführt — Tenant + Role + User + UserTenant erstellt
|
||||||
|
10. Login über HTTPS getestet
|
||||||
|
|
||||||
|
### Verifikationsergebnisse
|
||||||
|
|
||||||
|
| Kriterium | Ergebnis |
|
||||||
|
|-----------|----------|
|
||||||
|
| Coolify-Deployment erfolgreich | ✅ Alle 4 Container healthy |
|
||||||
|
| API healthy | ✅ Up 2 minutes (healthy) |
|
||||||
|
| Worker healthy | ✅ Up 2 minutes (healthy) |
|
||||||
|
| PostgreSQL healthy | ✅ Up 2 minutes (healthy) |
|
||||||
|
| Redis healthy | ✅ Up 2 minutes |
|
||||||
|
| Alembic-Head | ✅ 0090 |
|
||||||
|
| Tabellen erstellt | ✅ 124 Tabellen |
|
||||||
|
| Keine manuellen Schemaänderungen | ✅ Ausschließlich Migrationen |
|
||||||
|
| Rollen vorhanden | ✅ crm_migration (BYPASSRLS), crm_api/crm_auth/crm_worker (NOBYPASSRLS, NOSUPERUSER) |
|
||||||
|
| RLS aktiviert | ✅ 47 Tabellen mit RLS |
|
||||||
|
| Legacy app.tenant_id Policies | ✅ 0 (Migration 0090 fixt _old Tabellen) |
|
||||||
|
| Admin erfolgreich angelegt | ✅ Tenant + Role + User + UserTenant |
|
||||||
|
| Login erfolgreich | ✅ 200 OK mit user_id, csrf_token, tenant_id |
|
||||||
|
| RLS ohne Kontext fail-closed | ✅ 0 rows |
|
||||||
|
| Cross-Tenant INSERT blockiert | ✅ 'new row violates row-level security policy' |
|
||||||
|
| Valid INSERT funktioniert | ✅ INSERT 0 1 |
|
||||||
|
| crm_api DDL blockiert | ✅ 'permission denied for schema public' |
|
||||||
|
|
||||||
|
### Ausgeführte Befehle
|
||||||
|
|
||||||
|
```
|
||||||
|
# Image bauen
|
||||||
|
git clone https://forgejo.media-on.de/Leopoldadmin/leocrm.git
|
||||||
|
git checkout 89b775b
|
||||||
|
docker build -t stvabl4vaqru7jclx4ittzr3:89b775b .
|
||||||
|
|
||||||
|
# Compose aktualisieren und neu starten
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
# Verifikation
|
||||||
|
psql -U crm_user -d crm_test_db -f gate2_verify.sql
|
||||||
|
psql -U crm_user -d crm_test_db -f gate2_rls.sql
|
||||||
|
psql -U crm_user -d crm_test_db -f gate2_columns.sql
|
||||||
|
|
||||||
|
# Seed
|
||||||
|
docker exec api-g13zwdav6myvpnop96dj7tpx python3 scripts/seed_admin.py
|
||||||
|
|
||||||
|
# Login
|
||||||
|
curl -X POST https://crmtest.media-on.de/api/v1/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Origin: https://crmtest.media-on.de" \
|
||||||
|
-d '{"email":"admin@media-on.de","password":"Admin123!"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bekannte Issues
|
||||||
|
|
||||||
|
1. **Login-Rolle 'viewer' statt 'admin':** seed_admin.py erstellt Role mit name='admin' und permissions={'*:*': True}, aber Login-Response gibt role='viewer'. Vermutlich wird die Rolle aus UserTenant.role_id nicht korrekt aufgelöst. Kein Gate-2-Blocker — RLS und Tenant-Isolation funktionieren korrekt.
|
||||||
|
2. **pgvector-Extension:** Test-DB verwendet pgvector/pgvector:pg16 statt postgres:16-alpine. Produktion verwendet ebenfalls pgvector. Compose-Datei des Test-Services muss in Coolify aktualisiert werden.
|
||||||
|
|
||||||
|
### Gate-2-Abnahme: BESTANDEN
|
||||||
|
|
||||||
|
Alle Abnahmekriterien erfüllt. Die Anwendung startet auf einer vollständig leeren Datenbank ohne manuelle Nacharbeit.
|
||||||
|
|||||||
Reference in New Issue
Block a user