Plattform-Admin-Bereich¶
Der Plattform-Admin-Bereich ist ausschließlich für Nutzer mit der Plattform-Rolle admin zugänglich. Er ermöglicht die plattformweite Verwaltung aller Mandanten und Nutzer — unabhängig von der mandantengebundenen Tenant-Admin-Rolle.
Voraussetzungen¶
- Plattform-Rolle admin (unterscheidet sich von der Tenant-Admin-Rolle)
- Zugang über
/admin/platform(im Full-Modus)
Nicht mit Tenant-Admin verwechseln
Die Plattform-Admin-Rolle ist eine plattformweite Sonderrolle, die zum Zugriff auf Daten aller Mandanten berechtigt. Die Tenant-Admin-Rolle dagegen ist auf einen einzelnen Mandanten beschränkt und wird über Einstellungen > Mandanten > Mitglieder vergeben.
Abgrenzung: Plattform-Admin vs. Tenant-Admin¶
| Funktion | Plattform-Admin | Tenant-Admin |
|---|---|---|
| Alle Mandanten verwalten | Ja | Nein |
| Nutzerverwaltung plattformweit | Ja | Nein |
| Mandantenstatistiken einsehen | Ja | Nein |
| OIDC-Provider konfigurieren | Ja | Nein |
| Mitglieder des eigenen Mandanten verwalten | Ja | Ja |
| Standorte und Pflanzdaten des Mandanten | Ja | Ja |
Mandantenverwaltung¶
Im Bereich Admin > Mandanten kannst du:
- Alle Mandanten der Plattform einsehen (Name, Slug, Mitgliederzahl, Erstellungsdatum)
- Einzelne Mandanten deaktivieren oder löschen
- Mandanten-Kontingente und Limits einsehen
- Mitglieder eines Mandanten stellvertretend verwalten
Mandanten löschen ist irreversibel
Das Löschen eines Mandanten entfernt alle zugehörigen Daten (Pflanzen, Durchläufe, Protokolle). Diese Aktion kann nicht rückgängig gemacht werden. Erstelle vorher einen Daten-Export für den betroffenen Mandanten.
Nutzerverwaltung¶
Im Bereich Admin > Nutzer kannst du:
- Alle Nutzerkonten der Plattform einsehen
- Nutzerkonten sperren oder deaktivieren
- Plattform-Rollen zuweisen (
admin,viewer) - Passwort-Reset für Nutzer auslösen
- DSGVO-Anfragen (Datenlöschung, Datenauskunft) bearbeiten
DSGVO-Anfragen
Betroffenenrechte nach Art. 15–21 DSGVO stehen Nutzern über die Self-Service-API unter /api/v1/privacy/ zur Verfügung. Als Platform-Admin kannst du Anfragen im Admin-Bereich einsehen und bearbeiten. Weitere Informationen: Datenschutz (DSGVO).
Statistiken¶
Der Bereich Admin > Statistiken bietet eine Übersicht über:
- Anzahl aktiver Mandanten und Nutzer
- Aktive Pflanzdurchläufe plattformweit
- Celery-Task-Queue-Status
- Speicherverbrauch (ArangoDB, TimescaleDB, Redis)
OIDC-Provider¶
Unter Admin > OIDC-Provider konfigurierst du föderierte Authentifizierungs-Provider (z.B. Google, GitHub, firmeneigene OIDC-Instanzen). Diese Einstellungen gelten plattformweit für alle Mandanten.
Mehr dazu: Authentifizierung.
Pflanzenerkennung per Foto aktivieren¶
Die Foto-Identifikation ist ein optionales Feature, das API-Zugangsdaten eines Drittanbieters erfordert. Solange kein Key konfiguriert ist, meldet das Backend available: false und die gesamte Kamera-/Upload-UI bleibt für alle Nutzer ausgeblendet.
Der Pl@ntNet-API-Key ist eine instanzweite Einstellung — ein einziger Key gilt für alle Nutzer der Instanz. Der Free-Tier erlaubt 500 Identifikationen pro Tag für die gesamte Instanz.
Plattform-Admin erforderlich
Nur Nutzer mit der Plattform-Rolle admin können den API-Key verwalten. Die Einstellung gilt plattformweit.
Schritt 1: Kostenlosen Pl@ntNet-Key besorgen¶
- Öffne my.plantnet.org in einem Browser
- Erstelle ein Konto oder melde dich an
- Navigiere zu Account > API key
- Kopiere den angezeigten API-Key
Nur für nicht-kommerzielle Nutzung
Der Pl@ntNet Free-Tier ist ausdrücklich für nicht-kommerzielle Nutzung lizenziert. Für kommerzielle Instanzen die Nutzungsbedingungen auf my.plantnet.org prüfen.
Schritt 2: Key über die Admin-UI eintragen (empfohlen)¶
Dies ist der bevorzugte Weg — kein Pod-Neustart, keine Datei-Änderung, wirkt sofort.
- Melde dich als Plattform-Admin an
- Öffne Konto-Einstellungen (oben rechts auf dein Profilbild klicken)
- Wähle den Tab Integrationen
- Scrolle zum Abschnitt Pflanzenerkennung
- Gib den kopierten API-Key in das Feld Pl@ntNet API-Key ein
- Klicke auf Speichern
Der Key wird maskiert gespeichert (nie im Klartext in Antworten oder Logs sichtbar). Das Feld zeigt an, ob der Key aus der Datenbank (UI-Eintrag), aus einer Umgebungsvariable oder gar nicht gesetzt ist.
Optional: Key sofort prüfen
Nach dem Speichern kannst du auf Verbindung prüfen klicken. Das Backend sendet eine Testanfrage an Pl@ntNet und meldet, ob der Key gültig ist und wie viele Anfragen heute noch verfügbar sind.
Optional: Key entfernen
Klicke auf Entfernen, um den in der Datenbank gespeicherten Key zu löschen. Ist keine Umgebungsvariable gesetzt, wird die Foto-Identifikation damit deaktiviert.
Alternative: Key als Umgebungsvariable setzen¶
Die Umgebungsvariable PLANTNET_API_KEY bleibt weiterhin gültig — sie eignet sich für automatisierte Deployments, GitOps-Workflows oder wenn kein UI-Zugang genutzt werden soll.
Priorität: UI-Wert hat Vorrang
Ist in der Datenbank ein Key über die Admin-UI gespeichert, überschreibt dieser den Wert der Umgebungsvariable PLANTNET_API_KEY. Ein per UI gesetzter Key wirkt sofort ohne Pod-Neustart. Die Umgebungsvariable greift nur, wenn kein DB-Eintrag vorhanden ist.
Lege einen Kubernetes-Secret an und lade ihn per envFrom ins Backend. Niemals den Key im Klartext in values.yaml committen.
kubectl create secret generic kamerplanter-secrets \
--from-literal=PLANTNET_API_KEY="dein-api-key" \
--namespace kamerplanter
Im Helm-Values referenzieren:
Nach dem nächsten Rollout liest das Backend den Key automatisch aus der Secret-Umgebungsvariable.
Für schnelle Tests ohne Kubernetes-Secret: die Variable direkt in den env:-Block des Backend-Containers in helm/kamerplanter/values.yaml eintragen. Nicht committen.
# helm/kamerplanter/values.yaml (lokal, nicht committen)
backend:
env:
PLANTNET_API_KEY: "dein-api-key"
Skaffold deployt die Änderung automatisch neu.
Schritt 3: Aktivierung per API prüfen¶
Rufe den Status-Endpunkt auf:
Erwartete Antwort, wenn der Key korrekt gesetzt ist:
Nach erfolgreicher Konfiguration erscheinen in der UI automatisch die Kamera-/Upload-Funktion und die Schaltfläche Per Foto hinzufügen in der Artenübersicht. Nutzer sehen beim ersten Aufruf den Einwilligungs-Dialog — die Funktion ist ab diesem Moment vollständig nutzbar.
Optionale Feineinstellung¶
Die folgenden Variablen müssen in der Regel nicht geändert werden. Sie sind mit sinnvollen Standardwerten vorbelegt. Eine vollständige Beschreibung findet sich in der Umgebungsvariablen-Referenz:
| Variable | Standard | Zweck |
|---|---|---|
IDENTIFICATION_PRIMARY_ADAPTER | plantnet | Bevorzugter Adapter (erweiterbar) |
IDENTIFICATION_CONFIDENCE_AUTO_ACCEPT | 0.85 | Schwelle für „sehr sicher"-Hervorhebung |
IDENTIFICATION_CONFIDENCE_MIN_SHOW | 0.10 | Mindest-Übereinstimmung für Anzeige |
IDENTIFICATION_MAX_IMAGE_SIZE_MB | 10 | Maximale Bildgröße in Megabyte |
IDENTIFICATION_RATE_LIMIT_PER_USER_DAY | 0 | Max. Anfragen pro Nutzer/Tag (0 = Adapter-Limit) |
Datenschutz-Hinweis¶
Fotos werden nicht auf dem Kamerplanter-Server gespeichert — sie werden ausschließlich zur Analyse an Pl@ntNet (CIRAD/INRIA, Frankreich/EU) übertragen und danach verworfen. EXIF-Metadaten (GPS, Kameramodell) werden vor der Übertragung entfernt. Jeder Nutzer muss einmalig der Bildübertragung zustimmen. Weitere Details: Datenschutz (DSGVO) — Foto-Identifikation.
Schädlingserkennung aktivieren¶
Die Schädlingserkennung ist standardmäßig deaktiviert (PEST_DETECTION_ENABLED=false). Solange kein Adapter konfiguriert ist, meldet das Backend adapter: null und der Button „Auf Schädlinge prüfen" bleibt für alle Nutzer ausgeblendet.
Plattform-Admin erforderlich
Nur Nutzer mit der Plattform-Rolle admin können die Schädlingserkennung konfigurieren. Die Einstellungen gelten plattformweit.
Phase 1 — Self-Hosted-First
In der aktuellen Phase (Phase 1) stehen zwei Adapter zur Verfügung: der lokale Schadbild-Adapter (local_pest_symptom, erfordert keine externen Dienste oder Einwilligung) und der optionale Cloud-Adapter (Kindwise, einwilligungspflichtig). Ein Self-Hosted-Direkt-Detektor mit ONNX ist für Phase 2 in Vorbereitung.
Adapter 1: Lokaler Schadbild-Adapter (Self-Hosted, empfohlen)¶
Der lokale Adapter erkennt Schadbilder und Symptome (Gespinste, Honigtau, Saugschäden) direkt auf der Instanz — kein Drittanbieter, kein Datenschutz-Consent für Nutzer erforderlich.
Aktivieren via Umgebungsvariable:
PEST_DETECTION_ENABLED=true
PEST_DETECTION_SYMPTOM_ENABLED=true
PEST_DETECTION_PRIMARY_ADAPTER=local_pest_symptom
kubectl create secret generic kamerplanter-secrets \
--from-literal=PEST_DETECTION_ENABLED="true" \
--from-literal=PEST_DETECTION_SYMPTOM_ENABLED="true" \
--from-literal=PEST_DETECTION_PRIMARY_ADAPTER="local_pest_symptom" \
--namespace kamerplanter
Im Helm-Values referenzieren:
Voraussetzung: Inferenz-Service + Few-Shot-Index
Der lokale Schadbild-Adapter erkennt über Few-Shot-Klassifikation mit einem frozen DINOv2-Modell (kein separates, lizenzkritisches Modell). Damit der Button erscheint und echte Befunde liefert, sind zwei Schritte nötig:
- Inferenz-Service bereitstellen (derselbe Dienst wie für die Pflanzenerkennung, REQ-029-A). Sobald er erreichbar ist, beantwortet er
GET /pest/ready. -
Few-Shot-Index aufbauen — einmalig pro Klasse ~30 CC0/CC-BY-Bilder von GBIF beschaffen und als Prototypen indizieren. Keine GBIF-Zugangsdaten nötig (öffentliche Occurrence-Suche):
# im Backend-Container/-Umfeld, Inferenz-Service muss erreichbar sein python -m app.migrations.acquire_pest_dataset --manifest pest_reference_manifest.jsonDas Skript beschafft Bilder, filtert pro Bild auf CC0/CC-BY, indiziert die DINOv2-Prototypen im Inferenz-Service und schreibt ein Attributions-Manifest (CC-BY-Pflicht). Es werden keine Bilder dauerhaft gespeichert. Alternativ als Celery-Task
acquire_pest_dataset_task.
Solange der Index leer ist, meldet /pest/detect „keine Befunde" (kein Fehler). Der Direkt-Detektor mit Bounding-Boxes (Modus 1) bleibt für Phase 2 in Vorbereitung (extern blockiert: Modell-Lizenzfreigabe + Benchmark).
Nur Vorschau ohne Inferenz-Service
Zum reinen Ausprobieren der Oberfläche ohne Inferenz-Service den Demo-Adapter aktivieren: PEST_DETECTION_ENABLED=true + PEST_DETECTION_DEMO_ENABLED=true. Er liefert klar gekennzeichnete Platzhalter-Befunde — niemals für echte Entscheidungen.
Adapter 2: Cloud-Erkennung (Kindwise — optional, einwilligungspflichtig)¶
Der Kindwise-Cloud-Adapter sendet Fotos zur Analyse an den Kindwise-Dienst (Brno, Tschechien — EU). Er ist standardmäßig deaktiviert und erfordert eine explizite Nutzereinwilligung (Consent-Zweck pest_detection_cloud).
Vertragsvoraussetzungen vor der Aktivierung prüfen
Vor der Aktivierung des Cloud-Adapters sind folgende Punkte zu klären: - Auftragsverarbeitungsvertrag (AVV nach Art. 28 DSGVO) mit Kindwise abschließen - EU-Hosting-Garantie und Datenaufbewahrungsdauer vertraglich bestätigen - Indoor-Eignung des plant.health-Produkts für die eigenen Schädlingsziel-Klassen empirisch testen Detaillierte Prüfpunkte: spec/analysis/pest-detection-implementation-prep.md §5.
Aktivieren via Umgebungsvariablen:
PEST_DETECTION_ENABLED=true
PEST_DETECTION_CLOUD_ENABLED=true
PEST_DETECTION_CLOUD_API_KEY=dein-kindwise-api-key
PEST_DETECTION_PRIMARY_ADAPTER=local_pest_symptom # lokal bleibt Default; Cloud als Fallback oder primär wählbar
Die Schaltfläche erscheint nach dem nächsten Backend-Neustart automatisch in der UI. Nutzer, die den Cloud-Adapter nutzen möchten, werden beim ersten Aufruf zur Einwilligung aufgefordert.
Status prüfen¶
Rufe den Status-Endpunkt auf (tenant-scoped, JWT erforderlich):
curl -H "Authorization: Bearer <JWT>" \
http://localhost:8000/api/v1/t/{tenant_slug}/pests/status | python3 -m json.tool
Erwartete Antwort, wenn ein Adapter aktiv ist:
{
"adapter": "local_pest_symptom",
"pest_detection_enabled": true,
"symptom_enabled": true,
"detector_enabled": false,
"cloud_enabled": false
}
Ist pest_detection_enabled: false oder adapter: null, bleibt der Button in der UI ausgeblendet.
Optionale Feineinstellungen¶
Die folgenden Variablen müssen in der Regel nicht geändert werden. Eine vollständige Beschreibung findet sich in der Umgebungsvariablen-Referenz:
| Variable | Standard | Zweck |
|---|---|---|
PEST_DETECTION_ENABLED | false | Gesamtschalter — Feature ein/aus |
PEST_DETECTION_SYMPTOM_ENABLED | true | Schadbild-Erkennung (Modus 2) ein/aus |
PEST_DETECTION_DETECTOR_ENABLED | false | Direkt-Detektor (Modus 1, Phase 2) ein/aus |
PEST_DETECTION_CLOUD_ENABLED | false | Cloud-Adapter ein/aus |
PEST_DETECTION_CLOUD_API_KEY | — | API-Key für den Cloud-Adapter (Kindwise) |
PEST_DETECTION_PRIMARY_ADAPTER | local_pest_symptom | Bevorzugter Adapter |
PEST_DETECTION_MAX_IMAGE_SIZE_MB | 8 | Maximale Bildgröße in Megabyte |
Datenschutz-Hinweis¶
- Lokaler Adapter: Fotos verlassen die Instanz nicht; kein Consent erforderlich; EXIF wird vor jeder Verarbeitung entfernt.
- Cloud-Adapter: Fotos gehen an Kindwise (EU); Nutzer müssen einmalig für den Zweck
pest_detection_cloudeinwilligen; AVV vertraglich erforderlich; EXIF zweifach gestrippt (Frontend + Backend). - Fotos werden nie dauerhaft gespeichert — nur Erkennungsergebnis und anonymer Bild-Hash bleiben.
Weitere Details: Datenschutz (DSGVO).
Referenzbilder für die Bilderkennung kuratieren¶
Die Self-Hosted-Bilderkennung (DINOv2) vergleicht Nutzer-Fotos mit einem gespeicherten Referenz-Index. Enthält dieser Index unscharfe, falsch bestimmte oder anderweitig ungeeignete Bilder, verschlechtert sich die Erkennungsgenauigkeit für die betroffene Art.
Als Platform-Admin kannst du einzelne Referenzbilder nach einem Sichttest abwählen — sie werden dann aus der Erkennung ausgeschlossen, bleiben aber im System erhalten (Soft-Delete, reaktivierbar). Die vollständige Anleitung einschließlich Coverage-Schwellenwert (< 5 aktive Bilder), API-Endpunkten und FAQ findest du auf der Seite:
Nutzer-Schädlingsbilder freigeben (Moderation)¶
Nutzer können in der Schädlings-Detailseite eigene Fotos zu einem Schädling beitragen. Diese Bilder sind zunächst privat (nur für den jeweiligen Garten/Mandanten sichtbar). Als Platform-Admin kannst du besonders gute Aufnahmen global freigeben.
Die Moderation findest du im Admin-Bereich in der Karte „Beigesteuerte Schädlingsbilder":
- Wähle den betreffenden Schädling aus.
- Du siehst alle beigesteuerten Bilder aller Mandanten mit Vorschau, Herkunft (Nutzer/Mandant/Datum) und Status (privat/global).
- Mit Freigeben wird ein Bild auf
globalgesetzt — es ist dann für alle Nutzer in der Galerie sichtbar (über einen globalen, schreibgeschützten Auslieferungspfad, der ausschließlich freigegebene Bilder bereitstellt). Zurücknehmen macht die Freigabe rückgängig (mit Bestätigung).
Abwählen direkt auf der Detailseite
Als Platform-Admin kannst du Bilder auch direkt auf der Schädlings-Detailseite kuratieren: Mit dem Schalter „Abgewählte einblenden" werden auch deaktivierte Bilder sichtbar, und je Bild kannst du es abwählen (deaktivieren statt löschen) bzw. wieder aufnehmen. Das gilt für Erkennungs-Referenzbilder und für beigesteuerte Bilder. Normale Nutzer sehen ausschließlich aktive Bilder. Abwählen ist reversibel; der Erkennungs-Index bleibt von einer reinen Galerie-Abwahl unberührt.
Wirkung auf die KI-Erkennung
Wenn die Schädlingserkennung aktiv ist (PEST_DETECTION_ENABLED=true), wird ein freigegebenes Bild zusätzlich als Few-Shot-Referenz (source=user_contributed) in den Erkennungs-Index aufgenommen — sofern der Schädling eine Erkennungsklasse (detection_slug) hat. Es wird nur das Embedding samt Herkunft gespeichert, kein Originalbild. Das Zurücknehmen deaktiviert die Referenz wieder.
Datenschutz
Beigesteuerte Bilder werden beim Löschen eines Nutzers oder Mandanten vollständig entfernt (Dokument und Bilddatei). Standortdaten (EXIF) werden bereits beim Hochladen entfernt.
Häufige Fragen¶
Wer kann die Plattform-Admin-Rolle vergeben?
Die Plattform-Admin-Rolle kann nur von einem bestehenden Platform-Admin vergeben werden — direkt über die API oder im Admin-Bereich. Beim ersten Setup wird der erste registrierte Nutzer automatisch als Platform-Admin konfiguriert.
Kann ein Platform-Admin auch Tenant-Daten einsehen?
Ja. Platform-Admins haben Lesezugriff auf alle mandantengebundenen Daten. Diese Berechtigung sollte auf vertrauenswürdige Personen beschränkt und mit einem Audit-Log versehen sein (REQ-024).
Gibt es eine Viewer-Rolle für den Admin-Bereich?
Ja. Die Plattform-Rolle viewer bietet Lesezugriff auf alle Admin-Statistiken und Mandanten-Übersichten, jedoch keine Schreibberechtigungen.
Wo genau in der UI finde ich die Einstellung für den Pl@ntNet-Key?
Öffne Konto-Einstellungen (Klick auf dein Profilbild oben rechts) → Tab Integrationen → Abschnitt Pflanzenerkennung. Dort kannst du den Key eintragen, prüfen und entfernen. Die Einstellung ist nur für Nutzer mit der Plattform-Rolle admin sichtbar.
Kann ich den Key auch ohne UI als Umgebungsvariable setzen?
Ja. Die Umgebungsvariable PLANTNET_API_KEY ist weiterhin gültig und eignet sich für GitOps-Workflows oder automatisierte Deployments. Wichtig: Ein über die UI in der Datenbank gespeicherter Key hat Vorrang vor der Umgebungsvariable und wirkt sofort ohne Pod-Neustart.
Was passiert, wenn das Tages-Limit erschöpft ist?
Das Backend meldet remaining_today: 0. In der UI erscheint die Meldung „Tages-Limit für Bilderkennung erreicht. Morgen wieder verfügbar." Das Limit erneuert sich täglich um Mitternacht UTC. Alle anderen Funktionen bleiben uneingeschränkt verfügbar.
Kann ich einen anderen Erkennungsdienst als Pl@ntNet verwenden?
Aktuell ist Pl@ntNet der einzige implementierte Adapter (IDENTIFICATION_PRIMARY_ADAPTER=plantnet). Eine Phase-2-Erweiterung für lokale Offline-Erkennung (ohne Drittanbieter) ist geplant.
Siehe auch¶
- Mandanten & Gärten — Mandantenverwaltung als Tenant-Admin (REQ-024)
- Datenschutz (DSGVO) — Betroffenenrechte und DSGVO-Compliance
- Authentifizierung — JWT, OAuth2/OIDC, Service Accounts
- Pflanze per Foto identifizieren — Endnutzer-Anleitung
- Umgebungsvariablen — Vollständige Variablen-Referenz