Debugging¶
Diese Seite beschreibt, wie das Backend und das Frontend in der lokalen Entwicklungsumgebung debuggt werden. Alle Methoden setzen ein laufendes Skaffold-Setup voraus (siehe Lokales Setup).
Backend-Debugging mit debugpy¶
Das Backend-Container-Image enthält debugpy — den Python-Debugger, den VS Code, PyCharm und andere IDEs für Remote-Debugging verwenden.
Debug-Modus starten¶
Das debug-Profil in skaffold.yaml setzt DEBUGPY_ENABLED=true als Docker-Build-Argument. Der Container startet daraufhin debugpy und wartet optional auf eine Verbindung.
Debugpy lauscht auf Port 5678. Skaffold leitet diesen Port nicht automatisch weiter — das muss manuell eingerichtet werden:
VS Code — launch.json¶
{
"version": "0.2.0",
"configurations": [
{
"name": "Kamerplanter Backend (Remote)",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}/src/backend",
"remoteRoot": "/app"
}
],
"justMyCode": true
}
]
}
PyCharm — Remote-Debug-Konfiguration¶
- Menü:
Run→Edit Configurations→+→Python Debug Server - Host:
localhost, Port:5678 - Path Mappings:
src/backend/app→/app/app - Konfiguration starten, dann
skaffold debug --port-forwardausführen
Breakpoints und Log-Ausgabe¶
Der Backend-Server läuft mit uvicorn im --reload-Modus. Strukturierte Logs werden über structlog ausgegeben:
import structlog
log = structlog.get_logger()
async def create_species(data: CreateSpeciesRequest) -> Species:
log.info("creating_species", scientific_name=data.scientific_name)
# Breakpoint hier setzen
result = await self.repo.create(data)
log.info("species_created", key=result.key)
return result
Pod-Logs einsehen¶
Ohne Debugger reichen oft die Logs aus:
# Backend-Logs (letzte 100 Zeilen, dann live folgen)
kubectl logs -l app=kamerplanter-backend --tail=100 -f
# Celery-Worker-Logs
kubectl logs -l app=kamerplanter-worker --tail=100 -f
# Nur Fehler
kubectl logs -l app=kamerplanter-backend --tail=200 | grep '"level":"error"'
Frontend-Debugging¶
Browser DevTools¶
Die meisten Frontend-Probleme lassen sich mit den Browser-Entwicklerwerkzeugen lösen:
- Konsole (
F12→ Console): JavaScript-Fehler, unbehandelte Promise-Rejections, i18n-Warnungen zu fehlenden Schlüsseln - Netzwerk (
F12→ Network): API-Anfragen, HTTP-Status-Codes, Request/Response-Bodies - Redux DevTools: Redux-Zustandsänderungen nachverfolgen (Erweiterung für Chrome/Firefox erforderlich)
React Developer Tools¶
Die React DevTools Browser-Erweiterung ermöglicht: - Komponenten-Baum inspizieren - Props und State einzelner Komponenten einsehen - Re-Render-Profiler für Performance-Analyse
Vite-Quellkarten¶
Im Entwicklungsmodus (Vite Dev Server, Port 5173) sind Quellkarten aktiv. Haltepunkte können direkt in TypeScript-Dateien im Browser-Debugger gesetzt werden.
Häufige Frontend-Probleme¶
API-Anfragen schlagen mit 401 fehl
Der JWT-Token ist abgelaufen oder der kp_active_tenant_slug-Eintrag in localStorage fehlt. Im Browser-DevTools unter Application → Local Storage prüfen: - kp_active_tenant_slug muss auf einen gültigen Tenant-Slug gesetzt sein (z. B. demo) - Den Login-Flow erneut durchlaufen oder den Token manuell löschen und neu anmelden
i18n-Schlüssel werden als Rohtext angezeigt
Fehlende Übersetzungsschlüssel werden in der Konsole als Warnung ausgegeben: i18next: key "pages.myPage.missingKey" for language "de" not found. Den Schlüssel in src/i18n/locales/de/translation.json und en/translation.json ergänzen.
Redux-State wird nicht aktualisiert
Mit Redux DevTools die dispatched Actions und die State-Änderungen prüfen. Häufige Ursachen: falsche Slice-Action exportiert, Immer-Mutation vergessen, createSelector-Memo-Problem (unstabile Referenz aus einem Custom Hook ohne useMemo).
MSW-Mocks greifen im Browser nicht
Der Mock Service Worker ist nur für Tests aktiv. Im Entwicklungsmodus treffen Anfragen den echten Backend-Proxy unter /api. Falls die Backend-API nicht erreichbar ist, den Port-Forward von Skaffold prüfen.
ArangoDB Web-UI¶
Die ArangoDB-Weboberfläche ist unter http://localhost:8529 erreichbar:
| Feld | Wert |
|---|---|
| Benutzer | root |
| Passwort | rootpassword |
| Datenbank | kamerplanter |
Nützliche AQL-Abfragen für die Fehlersuche:
// Alle Pflanzenarten anzeigen
FOR s IN species RETURN s
// Verbindungen eines Mandanten prüfen
FOR v, e IN 1..1 OUTBOUND 'tenants/demo' GRAPH 'kamerplanter_graph'
RETURN { vertex: v._id, edge: e._from }
// Letzte 10 Aufgaben
FOR t IN tasks
SORT t.created_at DESC
LIMIT 10
RETURN t
Celery-Aufgaben debuggen¶
Für Hintergrundaufgaben (Celery Beat + Worker) sind separate Logs vorhanden:
# Celery-Worker
kubectl logs -l app=kamerplanter-worker -f
# Celery-Beat (Scheduler)
kubectl logs -l app=kamerplanter-beat -f
Eine Aufgabe manuell auslösen (direkter Python-Aufruf im Backend-Pod):
kubectl exec -it deployment/kamerplanter-backend -- python -c "
from app.tasks.care_reminders import generate_due_care_reminders
result = generate_due_care_reminders.delay()
print('Task ID:', result.id)
"
Health-Endpunkte¶
Das Backend stellt zwei Health-Endpunkte bereit, die auch für manuelle Diagnosen nützlich sind:
# Liveness (läuft der Prozess?)
curl http://localhost:8000/api/v1/health/live
# Readiness (ist die Datenbank erreichbar?)
curl http://localhost:8000/api/v1/health/ready
Erwartete Antwort (beide): {"status": "ok"} mit HTTP 200.
Häufige Fehlerszenarien¶
Backend-Pod in CrashLoopBackOff
- Logs abrufen:
kubectl logs <pod-name> --previous - Häufige Ursachen: Pydantic-Validierungsfehler beim Start, fehlende Umgebungsvariable, ArangoDB noch nicht bereit
- ArangoDB-Verbindung direkt testen:
kubectl exec -it deployment/kamerplanter-backend -- python -c "from app.data_access.arango.connection import ArangoConnection; from app.config.settings import Settings; c = ArangoConnection(Settings()); c.connect(); print('OK')"
Seed-Daten wurden nicht angelegt
Die Migration läuft als Init-Container. Logs einsehen:
Frontend zeigt leere Seite ohne Fehlermeldung
Browser-Konsole auf JavaScript-Fehler prüfen. Typische Ursache: eine Redux-Aktion wird mit einem undefined-Payload dispatched, was zu einem Reducer-Fehler führt.