diff --git a/TODO.md b/TODO.md index 5c87d2e..41f4b50 100644 --- a/TODO.md +++ b/TODO.md @@ -681,6 +681,10 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`: nicht verifiziert werden konnten (kein Aufschub aus Unklarheit über den Bedarf, sondern um keine falsch berechneten Kosten zu riskieren). Kein Admin-UI für Guthaben-Aufladung — bei der aktuellen Nutzerzahl reicht ein dokumentierter manueller SQL-Befehl (`ai-backend/README.md`). + Nutzeranlage über `scripts/create-user.php` setzt PHP-CLI/SSH voraus — auf typischem Shared + Hosting ohne CLI-Zugriff gibt es mit `ai-backend/setup-user.php` eine web-erreichbare + Alternative (durch ein Geheimnis in `config.php` geschützt, nach Gebrauch vom Server zu + löschen). **Nicht ohne echtes Deployment + echten API-Key verifizierbar** (siehe `ai-backend/README.md`): ob Anthropic zuverlässig valides JSON im erwarteten Schema liefert, ob die berechneten diff --git a/ai-backend/README.md b/ai-backend/README.md index 0e3b395..5d81960 100644 --- a/ai-backend/README.md +++ b/ai-backend/README.md @@ -22,19 +22,37 @@ macht der Nutzer selbst — dieses README beschreibt die nötigen Schritte. 2. `config.example.php` nach `config.php` kopieren und ausfüllen (DB-Zugang, Anthropic-API-Key, ggf. die Preistabelle gegen die aktuelle Anthropic-Preisseite prüfen — Preise ändern sich). `config.php` ist in `.gitignore` und darf nie committet werden. -3. Ersten Nutzer anlegen (weitere Lehrer später genauso): - ```bash - php scripts/create-user.php sebastian "einStarkesPasswort" 10.00 - ``` - Der dritte Parameter ist das Startguthaben in USD, optional (Standard 0). +3. Falls du die Web-Variante aus Schritt 5 nutzen willst (kein PHP-CLI/SSH auf dem Hosting): + `setup_secret` in `config.php` auf einen langen Zufallswert setzen (z.B. per + `openssl rand -hex 32` erzeugt, oder ein beliebiger Passwortgenerator). 4. Den kompletten `ai-backend/`-Ordner auf den PHP-Server hochladen. **Empfehlung:** `config.php`, `db.php`, `schema.sql`, `providers/` und `scripts/` außerhalb des öffentlichen Webroots ablegen, falls das Hosting das erlaubt (Pfade in den `require`-Aufrufen entsprechend anpassen) — robuster als sich allein auf die mitgelieferte `.htaccess` zu verlassen, die nur bei Apache mit aktiviertem `mod_rewrite`/erlaubten `.htaccess`-Overrides greift. -5. In `LehrerApp.Desktop/AppBootstrapper.cs` die Konstante `AiBackendUrl` auf die tatsächlich +5. Ersten Nutzer anlegen (weitere Lehrer später genauso) — zwei Varianten, je nachdem was das + Hosting hergibt: + + **Mit PHP-CLI/SSH-Zugriff** (`scripts/create-user.php`): + ```bash + php scripts/create-user.php sebastian "einStarkesPasswort" 10.00 + ``` + Der dritte Parameter ist das Startguthaben in USD, optional (Standard 0). + + **Ohne CLI/SSH** (übliches Shared Hosting, nur FTP/Webspace) — der Server läuft nach Schritt 4 + bereits, also einmalig von deinem eigenen Rechner aus aufrufen: + ```bash + curl -X POST https://DEINE-DOMAIN/setup-user.php \ + -d '{"secret":"","username":"sebastian","password":"einStarkesPasswort","balanceUsd":10.00}' + ``` + **Direkt danach `setup-user.php` per FTP wieder vom Server löschen** — sonst bleibt ein + Endpunkt erreichbar, der (mit dem Geheimnis) beliebige Nutzer anlegen kann. Ein erneuter + Aufruf mit demselben Benutzernamen aktualisiert Passwort/Guthaben, falls z.B. das Guthaben + beim ersten Versuch vergessen wurde — dafür braucht es die Datei aber kein zweites Mal auf + dem Server, einfach vor dem Löschen alle nötigen Nutzer in einer Sitzung anlegen. +6. In `LehrerApp.Desktop/AppBootstrapper.cs` die Konstante `AiBackendUrl` auf die tatsächlich deployte Domain setzen und die App neu bauen. -6. In der App unter Einstellungen → KI-Unterstützung aktivieren und mit dem angelegten Nutzer +7. In der App unter Einstellungen → KI-Unterstützung aktivieren und mit dem angelegten Nutzer anmelden. ## Smoke-Test ohne echten API-Key diff --git a/ai-backend/config.example.php b/ai-backend/config.example.php index 644bfa3..643584c 100644 --- a/ai-backend/config.example.php +++ b/ai-backend/config.example.php @@ -10,6 +10,11 @@ return [ 'pass' => 'CHANGE_ME', ], + // Nur für setup-user.php gebraucht (Web-Alternative zu scripts/create-user.php auf Hosting + // ohne PHP-CLI/SSH) — ein langer Zufallswert, z.B. per `openssl rand -hex 32` erzeugt. + // setup-user.php nach Gebrauch vom Server löschen, siehe README.md. + 'setup_secret' => 'CHANGE_ME', + // Nur 'anthropic' ist aktuell fertig implementiert (siehe providers/AnthropicProvider.php). // Die Provider-Schnittstelle ist so gebaut, dass ein OpenAiProvider später ergänzt werden // kann — bewusst nicht in dieser Runde, da aktuelle OpenAI-Preise/API-Version zum Zeitpunkt diff --git a/ai-backend/setup-user.php b/ai-backend/setup-user.php new file mode 100644 index 0000000..6ae5877 --- /dev/null +++ b/ai-backend/setup-user.php @@ -0,0 +1,49 @@ +prepare( + 'INSERT INTO users (username, password_hash, balance_usd) VALUES (?, ?, ?) + ON DUPLICATE KEY UPDATE password_hash = VALUES(password_hash), balance_usd = VALUES(balance_usd)' +); +$stmt->execute([$username, $hash, $balance]); + +echo json_encode([ + 'ok' => true, + 'username' => $username, + 'balanceUsd' => $balance, + 'hinweis' => 'Nutzer angelegt/aktualisiert. Diese Datei (setup-user.php) jetzt vom Server löschen.', +]);