Troubleshooting¶
Dieser Guide behandelt häufige Probleme bei Entwicklung und Produktionsbetrieb von TCM365 sowie deren Lösungen.
Diagnostics Endpoints¶
TCM365 bietet eingebaute Diagnostics Endpoints für System Health Monitoring:
| Endpoint | Methode | Auth erforderlich | Zweck |
|---|---|---|---|
/health |
GET | Nein | Basis Health Check (DB Konnektivität, Latenz) |
/api/v1/diagnostics |
GET | Ja | Vollständige Systemdiagnose (DB, Redis, Storage, Azure AD) |
/api/v1/diagnostics/repair |
POST | Ja | Automatische Reparatur-Aktionen |
Diagnostics Endpoint verwenden¶
# Basis Health Check (keine Auth erforderlich)
curl http://localhost:8000/health
# Vollständige Diagnostics (erfordert JWT Token)
curl -H "Authorization: Bearer <token>" http://localhost:8000/api/v1/diagnostics
Beispiel-Antwort von /api/v1/diagnostics:
{
"database": { "status": "ok", "latency": 2, "version": "15.4" },
"redis": { "status": "unavailable", "fallback": "in-memory" },
"storage": { "status": "ok", "backend": "local", "path": "./data" },
"azureAd": { "status": "not_configured" }
}
Reparatur-Aktionen¶
# Fehlende Storage-Verzeichnisse erstellen
curl -X POST "http://localhost:8000/api/v1/diagnostics/repair?action=create_storage_dirs" \
-H "Authorization: Bearer <token>"
# Ausstehende Datenbank-Migrationen ausführen
curl -X POST "http://localhost:8000/api/v1/diagnostics/repair?action=run_migrations" \
-H "Authorization: Bearer <token>"
Structured Logging¶
Alle Backend Requests erzeugen strukturierte Log-Einträge:
2026-03-05T14:30:00Z | INFO | SnapshotsController [req=abc123 op=create user=admin] | Snapshot created
Log-Bestandteile¶
| Bestandteil | Beschreibung | Beispiel |
|---|---|---|
| Timestamp | ISO 8601 Format | 2026-03-05T14:30:00Z |
| Level | Log Level | INFO, WARN, ERROR |
| Modul | Quell-Modul | SnapshotsController |
| req | X-Request-ID Korrelations-ID | abc123 |
| op | Operation | create |
| user | Authentifizierter Benutzer | admin |
Request Tracing¶
Jeder Request erhält automatisch eine X-Request-ID:
- Wird automatisch generiert oder kann vom Client via
X-Request-IDHeader übergeben werden - Erscheint in der Response als
X-Request-IDHeader - Wird in allen zugehörigen Log-Einträgen mitgefuehrt
- Der
X-Process-TimeResponse Header zeigt die Request-Dauer
Debugging mit X-Request-ID
Wenn ein API-Aufruf fehlschlägt, notieren Sie die X-Request-ID aus dem Response Header. Suchen Sie dann in den Backend Logs nach dieser ID, um den vollständigen Request-Verlauf nachzuverfolgen.
Datenbank-Probleme¶
PostgreSQL Verbindung fehlgeschlagen¶
Symptome: Backend startet nicht mit Connection Refused oder Timeout Fehlern.
Lösungen:
-
Verifizieren, dass PostgreSQL läuft:
-
Umgebungsvariablen in
backend-js/.envprüfen: -
Datenbank-Existenz verifizieren:
Migrations-Fehler¶
Symptome: npm run migration:run schlägt mit Fehlern fehl.
Lösungen:
-
Datenbankbenutzer hat ausreichende Berechtigungen:
-
Für einen Neustart den Repair-Modus des Setup-Skripts verwenden:
Migrationsdateien niemals löschen
Löschen Sie keine bestehenden Migrationsdateien aus backend-js/src/database/migrations/. Erstellen Sie stattdessen eine neue Migration, um Probleme zu beheben. Das Löschen von Migrationen zerstoert die Migrationshistorie.
Row-Level Security funktioniert nicht¶
Symptome: RLS Policies filtern Daten nicht korrekt.
Lösungen:
-
Beide Datenbankrollen existieren verifizieren:
-
tcm_adminhat BYPASSRLS verifizieren: -
RLS Policies auf tenant-bezogenen Tabellen prüfen:
Authentifizierungsprobleme¶
Login gibt 401 zurück¶
Lösungen:
-
Admin-Benutzer existiert verifizieren:
-
Credentials prüfen (Standard:
admin@tcm.local/Admin123!TCM) -
APP_SECRET_KEYist gesetzt (min. 32 Zeichen):
JWT Token abgelaufen¶
Lösungen:
-
Token Refresh im Client implementieren:
-
Token Lebensdauer erhöhen (nur Entwicklung):
Azure AD SSO funktioniert nicht¶
Lösungen:
- Alle Azure AD Umgebungsvariablen sind gesetzt verifizieren
- Redirect URI stimmt exakt mit der Azure AD App Registration ueberein
- App Registration hat die erforderlichen API Permissions mit Admin Consent
Redis Probleme¶
Redis Verbindung fehlgeschlagen¶
Auswirkung: Minimal. TCM365 fällt automatisch auf In-Memory Alternativen zurück.
Was auf Fallback umschaltet:
| Feature | Mit Redis | Ohne Redis (Fallback) |
|---|---|---|
| Rate Limiting | Redis Sliding Window | In-Memory Rate Limiter |
| Capture Lock | Redis SET NX (verteilt) | In-Memory Lock |
| Token Blacklist | Redis SET mit TTL | In-Memory Map |
Lösungen:
-
Falls Redis benötigt wird, verifizieren dass es läuft:
-
Redis URL prüfen:
-
Für lokale Entwicklung kann
REDIS_URLkomplett weggelassen werden.
Redis ist optional
TCM365 funktioniert vollständig ohne Redis. Die In-Memory Fallbacks sind für Einzelinstanz-Deployments ausreichend. Redis wird erst bei Mehrfachinstanz-Deployments für verteiltes Locking und Rate Limiting empfohlen.
Storage Probleme¶
Dateispeicher-Fehler¶
Symptome: Snapshot-Daten oder Reports können nicht gespeichert werden.
Lösungen:
-
Storage Backend Konfiguration prüfen:
-
Storage-Verzeichnis existiert und ist beschreibbar:
-
Diagnostics Repair Endpoint verwenden:
Microsoft 365 / UTCM Probleme¶
UTCM Snapshot Job bleibt auf "notStarted"¶
Ursache: Der UTCM Service Principal ist nicht im Tenant registriert.
Lösung:
Connect-MgGraph -Scopes "Application.ReadWrite.All"
New-MgServicePrincipal -AppId '03b07b79-c5bc-4b5e-9bfa-13acf4a99998'
Teams/Exchange Snapshot gibt leere Daten zurück¶
Ursache: Dem UTCM Service Principal fehlt die erforderliche Directory Role.
Lösung: Die Global Reader Rolle dem UTCM SP zuweisen.
403 Forbidden bei Graph API Aufrufen¶
Ursache: Der App Registration fehlen die erforderlichen API Permissions.
Lösung:
- Erforderliche Permissions in der M365 App Registration Anleitung prüfen
- Fehlende Permissions in der Azure AD App Registration hinzufügen
- Admin Consent für Application Permissions erteilen
Quota überschritten¶
Ursache: UTCM API Limits überschritten (10 Snapshot Jobs pro 24 Stunden).
Lösung: Auf Quota-Reset warten oder alte Snapshot Jobs löschen. TCM365 zeigt ein Quota-Banner im UI an.
Build und Kompilierungsprobleme¶
TypeScript Kompilierungsfehler¶
Lösungen:
-
Dependencies sind installiert sicherstellen:
-
TypeScript Versionskompatibilitaet prüfen:
-
Path Aliases loesen korrekt in
tsconfig.jsonauf verifizieren
Vite Build schlägt fehl¶
Lösungen:
-
Vite Cache löschen:
-
Dependencies neu installieren:
Performance-Probleme¶
Langsame API Antworten¶
Lösungen:
-
SQL Query Logging aktivieren um langsame Queries zu identifizieren:
-
X-Process-TimeResponse Header für Request-Dauer prüfen -
Datenbank-Indexes auf häufig abgefragten Spalten sicherstellen
-
Bei grossen Datensaetzen Pagination verifizieren
Häufige Fehlermeldungen¶
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
TENANT_ACCESS_DENIED |
Benutzer-Org besitzt die Ressource nicht | Tenant-Zuordnung verifizieren |
CAPTURE_LOCK_HELD |
Anderer Snapshot läuft gerade | Aktuellen Capture abwarten |
UTCM_QUOTA_EXCEEDED |
Zu viele UTCM API Aufrufe | Quota-Reset abwarten (24-Stunden-Fenster) |
INVALID_CREDENTIALS |
Falsche E-Mail/Passwort | Credentials prüfen oder npm run db:seed |
TOKEN_EXPIRED |
JWT Token abgelaufen | Token via /api/v1/auth/refresh erneuern |
VENDOR_ADAPTER_NOT_FOUND |
Nicht registrierter Vendor-Typ | VendorAdapterRegistry Initialisierung prüfen |
SCHEMA_NOT_FOUND |
Tenant Schema existiert nicht | Tenant Schema-Erstellung ausführen |