Regressionspruefung Weser (Pro-Server) — 2026-04-27
Systematische Pruefung des Pro-Systems
weser.prilog.teamnach den umfangreichen Sessions vom 17.–27. April 2026 (Shared-Hosting, Kaskaden, Aufgaben-System, React Flow, Collab-Editor, GUEST-Permissions, PWA).
1. Zusammenfassung
| Kategorie | Status | Details |
|---|---|---|
| Nginx-Konfiguration | ✅ OK | WebSocket-Proxy, SSE, API, Matrix — alles korrekt |
| Synapse (Matrix) | ✅ OK | v1.12, responsive, Federation aktiv |
| n8n Workflow-Engine | ✅ OK | Erreichbar, SSO-Proxy aktiv |
| PWA / Service Worker | ⚠️ Veraltet | Noch selfDestroying-SW vom 26.04. — wird beim naechsten Deploy gefixt |
| Web-Client Build | ⚠️ Veraltet | Build vom 26.04. — heutige Aenderungen noch nicht deployed |
| Backend-Code | ⚠️ Veraltet | Letzte Commits vom 26.04. — heutige Fixes noch nicht deployed |
| Datenbank-Migrationen | 🔴 KRITISCH | 6 Migrationen nicht angewendet — Backend crasht bei neuen Features |
| Tenant-Isolation | 🔴 KRITISCH | 3 Stellen ohne Tenant-Filter — heute gefixt, noch nicht deployed |
| GUEST-Permissions | ⚠️ Noch nicht deployed | Fix im Code, Seed aktualisiert Backend on Restart |
2. Code-Analyse — Gefundene Probleme
2.1 KRITISCH: Cross-Tenant Datenleck in /me/tasks
Datei: src/modules/project/activity.router.ts Zeile 246
Problem: Die Membership-Query hatte keinen tenantId-Filter. Ein User der in mehreren Tenants Mitglied ist, haette Aufgaben aus allen Tenants sehen koennen.
Fix (heute angewendet):
// VORHER (unsicher):
where: { userId: jwt.sub, status: { in: ['active', 'ACTIVE'] } }
// NACHHER (sicher):
where: { userId: jwt.sub, status: { in: ['active', 'ACTIVE'] }, space: { tenantId: jwt.tenantId } }Status: Lokal gefixt, noch nicht deployed.
2.2 KRITISCH: Morgen-Briefing ohne Tenant-Scope
Datei: src/services/task-notifications.service.ts Zeile 31-34
Problem: Die innere Membership-Query im Morgen-Briefing filterte nicht nach Tenant. Ein User haette Aufgaben-Briefings mit Tasks aus fremden Tenants erhalten koennen.
Fix (heute angewendet):
// VORHER:
where: { userId: user.userId, status: { in: ['active', 'ACTIVE'] } }
// NACHHER:
where: { userId: user.userId, status: { in: ['active', 'ACTIVE'] }, space: { tenantId: tenant.id } }Status: Lokal gefixt, noch nicht deployed.
2.3 MITTEL: sendDmToUser ohne Tenant-Scope
Datei: src/services/task-notifications.service.ts Zeile 169-173
Problem: Die Helper-Funktion suchte die Membership fuer die DM-Zustellung ohne Tenant-Filter. Haette den falschen Raum finden koennen.
Fix (heute angewendet):
// VORHER:
where: { userId, status: { in: ['active', 'ACTIVE'] } }
// NACHHER:
where: { userId, status: { in: ['active', 'ACTIVE'] }, space: { tenantId } }Status: Lokal gefixt, noch nicht deployed.
2.4 MITTEL: checkOverdueTasks global statt per Tenant
Datei: src/services/task-notifications.service.ts Zeile 93-102
Problem: Holt ueberfaellige Aufgaben global (take: 50), nicht per Tenant gefiltert. Sendet DMs zwar an den richtigen Tenant (via task.space.tenantId), aber die Query ist ineffizient und koennte bei vielen Tenants nur Tasks eines Tenants liefern.
Bewertung: Kein Datenleck (DM geht an korrekten Synapse), aber suboptimal.
Status: Nicht gefixt — niedrige Prioritaet.
3. Konfigurationsvergleich Pro vs Shared
3.1 Nginx (weser.prilog.team)
| Block | Status | Bemerkung |
|---|---|---|
| Matrix Client/Federation | ✅ OK | /_matrix → localhost:8008 |
| API Proxy | ✅ OK | /api/ → api.prilog.chat (zentral) |
| Collab WebSocket | ✅ OK | /api/platform/v1/collab/ mit Upgrade-Headers, 24h Timeout |
| SSE Stream | ✅ OK | Eigener Block, no-buffering, 24h Timeout |
| MinIO S3 | ✅ OK | /s3/ und /prilog-files/ → localhost:9000 |
| SPA Fallback | ✅ OK | try_files $uri $uri/ /index.html |
| n8n | ✅ OK | Eigener Server-Block mit SSO-Proxy |
| SSL | ✅ OK | Let's Encrypt Zertifikate fuer alle 3 Domains |
3.2 Web-Client Build
| Aspekt | Wert | Status |
|---|---|---|
| Build-Datum | 26.04.2026, 23:51 | ⚠️ Vor heutigen Aenderungen |
| VITE_PLATFORM_BASE_URL | /api (relativ) | ✅ Korrekt — Nginx proxyt |
| Service Worker | selfDestroying (alt) | ⚠️ Wird beim naechsten Deploy gefixt |
| Manifest | vorhanden (489 Bytes) | ✅ OK |
| Assets | Hash-versioniert | ✅ OK |
3.3 Backend (Zentralserver)
| Aspekt | Wert | Status |
|---|---|---|
| Letzter Commit | 804c158 (Phase 3 Notifications) | ⚠️ Vor heutigen Fixes |
| PM2 Status | Online (7h Uptime, 285 Restarts) | ⚠️ Viele Restarts |
| Migrationen | 6 ausstehend | 🔴 KRITISCH |
4. API-Endpoint-Tests (Live)
| Endpoint | HTTP | Bewertung |
|---|---|---|
GET / (SPA) | 200 | ✅ Web-Client wird ausgeliefert |
GET /manifest.webmanifest | 200 | ✅ PWA-Manifest vorhanden |
GET /sw.js | 200 | ✅ Service Worker vorhanden (noch selfDestroying) |
GET /api/platform/v1/bootstrap | 401 | ✅ Erwartet (braucht JWT) |
GET /_matrix/client/versions | 200 | ✅ Synapse laeuft, v1.12 |
GET /.well-known/matrix/client (prilog.chat) | 200 | ✅ Korrekt: {"m.homeserver":{"base_url":"https://weser.prilog.team"}} |
GET /.well-known/matrix/client (prilog.team) | 200 (HTML) | ⚠️ SPA-Fallback statt JSON — harmlos, Client nutzt .chat Domain |
GET /api/platform/v1/workflow/events/stream | 401 | ✅ Erwartet (braucht JWT) |
GET /api/platform/v1/collab/test/ws | 404 | ✅ Erwartet (ungueltige docId) |
GET https://n8n.weser.prilog.team/ | 200 | ✅ n8n laeuft |
5. Datenbank-Migrationen (BLOCKER)
6 ausstehende Migrationen:
| Migration | Inhalt | Risiko |
|---|---|---|
0002_add_auto_forward_to_cascade_edge | autoForward Boolean auf CascadeEdge | Niedrig — neue Spalte, Default false |
0003_add_collab_documents | CollabDocument Tabelle | Niedrig — neue Tabelle |
0004_collab_doc_optional_space | spaceId optional in CollabDocument | Niedrig — Spalten-Aenderung |
0005_add_node_types_and_conditions | nodeType, nodeConfig, nodeState auf CascadeColumn | Mittel — bestehende Spalten erweitert |
0006_add_cascade_flow_logs | CascadeFlowLog Tabelle | Niedrig — neue Tabelle |
0007_add_board_groups | BoardGroup Tabelle + groupId auf WorkItem | Mittel — FK auf bestehende Tabelle |
Auswirkung: Jeder Request der die neuen Tabellen/Spalten nutzt, verursacht einen Prisma-Fehler → Backend-Crash → PM2 Restart. Das erklaert die 285 Restarts.
Loesung:
ssh lee@91.99.30.243
cd /var/www/backend-api
git pull
npm ci
npx prisma migrate deploy
pm2 restart backend-api6. Deployment-Plan (Reihenfolge)
Schritt 1: Backend deployen (Zentralserver)
# Auf api.prilog.chat
cd /var/www/backend-api
git pull origin main
npm ci
npx prisma migrate deploy # 6 Migrationen anwenden
pm2 restart backend-api
pm2 logs backend-api --lines 20 # Pruefen ob Seed laeuftErwartete Ausgabe im Log:
RoleDefault Seed: System-Rollen synchronisiert(GUEST-Permissions Update)- Keine Prisma-Fehler mehr
- Restarts sollten aufhoeren
Schritt 2: Web-Client deployen (Weser)
Entweder via GitHub Push + Agent-Deploy, oder manuell:
# Lokal
cd prilog-web-client
npm run build
scp -r dist/* root@100.83.170.39:/var/www/prilog-web-client/Das deployed:
- Neuen Service Worker (nicht mehr selfDestroying)
- GUEST/MEMBER Permission-Fallback Fix
- React Flow, Aufgaben-Gruppen, Kaskaden-Elemente, Meine-Aufgaben-Hub
Schritt 3: Verifizierung
- Browser:
https://weser.prilog.team/oeffnen, DevTools → Console pruefen - Login testen (als Mitarbeiter)
- Chat pruefen (Nachrichten senden/empfangen)
- Kaskaden-Hub oeffnen (neues Feature)
- Aufgaben im Space pruefen (Gruppen, Drag & Drop)
- Meine-Aufgaben-Hub pruefen (Sidebar-Icon)
- Collab-Editor testen (+ → Gemeinsamer Text)
7. Offene Punkte nach Deployment
| Punkt | Prioritaet | Aufwand |
|---|---|---|
checkOverdueTasks() per Tenant filtern | Niedrig | 15 Min |
getPersonalCalendar() Tenant-Filter ergaenzen | Niedrig | 10 Min |
| Membership-Status normalisieren (ACTIVE vs active) | Niedrig | Migration |
.well-known auf .team Domain konfigurieren | Niedrig | 5 Min Nginx |
| Web-Client-Build automatisieren (GitHub Actions → Weser) | Mittel | 1h |
8. Fazit
Das Pro-System ist funktional stabil — Synapse, Nginx, n8n und die SPA laufen fehlerfrei. Die kritischen Probleme sind:
- 6 fehlende Migrationen auf dem Zentralserver → verursachen Backend-Crashes bei neuen Features
- 3 fehlende Tenant-Filter → heute im Code gefixt, noch nicht deployed
- Veralteter Web-Client Build → heutige Fixes (GUEST, PWA, Kaskaden) fehlen
Alle drei Punkte werden durch ein Standard-Deployment geloest (git pull + migrate + build). Kein manueller Eingriff in die Datenbank noetig, keine Config-Aenderungen auf dem Weser-Server.