diff --git a/.gitignore b/.gitignore index c79c37b..4b60caa 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ _*.png *.bak *.tmp .claude/settings.local.json +# Feedback-Daten der Companion-App (vom feedback.php-Collector geschrieben, nicht versionieren) +04_Tablet-Quiz/app/feedback-data/ diff --git a/04_Tablet-Quiz/app/DEPLOY.md b/04_Tablet-Quiz/app/DEPLOY.md index 0783e14..6c5bd72 100644 --- a/04_Tablet-Quiz/app/DEPLOY.md +++ b/04_Tablet-Quiz/app/DEPLOY.md @@ -62,20 +62,37 @@ Die App schickt jedes gespeicherte Feedback per `POST` als JSON an den im gleiche Domain). Der Service Worker fasst POSTs nicht an — der Offline-Cache stört also nicht. -**Variante A — PHP (Referenz, einfachste Option).** `feedback.php` liegt im App-Ordner. -Voraussetzung: `php-fpm` aktiv und das App-Verzeichnis für PHP freigegeben; das -Datenverzeichnis `feedback-data/` muss vom Webserver-User beschreibbar sein. +**Variante A — PHP (empfohlen, mit nginx der kürzeste Weg).** `feedback.php` braucht +**nur den PHP-Core** (json + Datei-I/O) — **keine** Extensions (kein php-mysql/curl/mbstring). + +Konkret auf Ubuntu 24.04 + nginx (PHP ist dort nicht vorinstalliert, aber 8.3 im Repo): + +```bash +sudo apt install php-fpm # zieht php8.3-fpm; Socket: /run/php/php8.3-fpm.sock +# Datenverzeichnis AUSSERHALB des Web-Roots anlegen und dem nginx/php-User geben: +sudo mkdir -p /srv/slc-feedback && sudo chown www-data:www-data /srv/slc-feedback +``` ```nginx -# innerhalb des server{}-Blocks von oben: -location ~ \.php$ { +# im server{}-Block der SLC-App: +# 1) NUR feedback.php als PHP ausführen (kein generelles .php — Hardening): +location = /feedback.php { include fastcgi_params; - fastcgi_pass unix:/run/php/php-fpm.sock; # Pfad anpassen - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_pass unix:/run/php/php8.3-fpm.sock; # Pfad ggf. anpassen + fastcgi_param SCRIPT_FILENAME $document_root/feedback.php; + fastcgi_param SLC_FEEDBACK_DIR /srv/slc-feedback; # Daten ausserhalb des Web-Roots } +# 2) Datenverzeichnis im Web-Root (Fallback) niemals ausliefern: +location ^~ /feedback-data/ { deny all; return 404; } ``` -Daten landen in `feedback-data/feedback.jsonl` (eine JSON-Zeile pro Feedback) → -später für die Auswertung einlesen/zu CSV konvertieren. + +Daten landen als **JSON Lines** in `$SLC_FEEDBACK_DIR/feedback.jsonl` (eine Zeile pro +Feedback) → für die Auswertung einlesen / zu CSV konvertieren. Ohne gesetzte +`SLC_FEEDBACK_DIR` schreibt das Skript nach `./feedback-data/` (per `.gitignore` +ausgenommen, von nginx via Regel 2 nicht ausgeliefert). + +> **Verifikation:** `curl https:///feedback.php` → `{"ok":true,...}`. Nach einem +> gespeicherten Feedback wächst `feedback.jsonl` um eine Zeile. **Variante B — kein PHP verfügbar.** Endpoint auf einen beliebigen JSON-POST-Empfänger zeigen lassen (z. B. ein kleines Node-/Worker-Skript, das den Body an eine Datei diff --git a/04_Tablet-Quiz/app/feedback.php b/04_Tablet-Quiz/app/feedback.php index 9c1981a..0f9fe85 100644 --- a/04_Tablet-Quiz/app/feedback.php +++ b/04_Tablet-Quiz/app/feedback.php @@ -39,8 +39,11 @@ if (!is_array($data)) { $data['_received'] = gmdate('c'); $data['_ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; -$dir = __DIR__ . '/feedback-data'; -$file = $dir . '/feedback.jsonl'; +// Datenverzeichnis: per Env SLC_FEEDBACK_DIR überschreibbar (empfohlen: AUSSERHALB +// des Web-Roots, dann ist die Datei nicht öffentlich abrufbar und git pull bleibt sauber). +// Default: ./feedback-data neben diesem Skript (ist per .gitignore aus der Versionierung). +$dir = getenv('SLC_FEEDBACK_DIR') ?: (__DIR__ . '/feedback-data'); +$file = rtrim($dir, '/') . '/feedback.jsonl'; if (!is_dir($dir)) { @mkdir($dir, 0775, true); } $line = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";