Feedback-Collector serverfest: Datenpfad konfigurierbar + Doku fuer php-fpm
Vorbereitung fuer Server-Deploy (Server hat kein PHP; nginx vorhanden, PHP 8.3 im Repo installierbar): - feedback.php: Datenverzeichnis ueber Env SLC_FEEDBACK_DIR ueberschreibbar (empfohlen ausserhalb des Web-Roots -> keine git-pull-Konflikte, .jsonl nicht oeffentlich). Default unveraendert ./feedback-data. Weiterhin NUR PHP-Core noetig, keine Extensions. - .gitignore: 04_Tablet-Quiz/app/feedback-data/ ausgenommen (falls Default-Pfad). - DEPLOY.md: konkrete Schritte fuer Ubuntu 24.04 + nginx (apt install php-fpm, Socket php8.3-fpm, NUR feedback.php als PHP ausfuehren = Hardening, feedback-data per deny all schuetzen, SLC_FEEDBACK_DIR setzen) + curl-Verifikation. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
28c584acb3
commit
029a12151e
3 changed files with 33 additions and 11 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -5,3 +5,5 @@ _*.png
|
||||||
*.bak
|
*.bak
|
||||||
*.tmp
|
*.tmp
|
||||||
.claude/settings.local.json
|
.claude/settings.local.json
|
||||||
|
# Feedback-Daten der Companion-App (vom feedback.php-Collector geschrieben, nicht versionieren)
|
||||||
|
04_Tablet-Quiz/app/feedback-data/
|
||||||
|
|
|
||||||
|
|
@ -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
|
gleiche Domain). Der Service Worker fasst POSTs nicht an — der Offline-Cache stört
|
||||||
also nicht.
|
also nicht.
|
||||||
|
|
||||||
**Variante A — PHP (Referenz, einfachste Option).** `feedback.php` liegt im App-Ordner.
|
**Variante A — PHP (empfohlen, mit nginx der kürzeste Weg).** `feedback.php` braucht
|
||||||
Voraussetzung: `php-fpm` aktiv und das App-Verzeichnis für PHP freigegeben; das
|
**nur den PHP-Core** (json + Datei-I/O) — **keine** Extensions (kein php-mysql/curl/mbstring).
|
||||||
Datenverzeichnis `feedback-data/` muss vom Webserver-User beschreibbar sein.
|
|
||||||
|
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
|
```nginx
|
||||||
# innerhalb des server{}-Blocks von oben:
|
# im server{}-Block der SLC-App:
|
||||||
location ~ \.php$ {
|
# 1) NUR feedback.php als PHP ausführen (kein generelles .php — Hardening):
|
||||||
|
location = /feedback.php {
|
||||||
include fastcgi_params;
|
include fastcgi_params;
|
||||||
fastcgi_pass unix:/run/php/php-fpm.sock; # Pfad anpassen
|
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # Pfad ggf. anpassen
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
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://<host>/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
|
**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
|
zeigen lassen (z. B. ein kleines Node-/Worker-Skript, das den Body an eine Datei
|
||||||
|
|
|
||||||
|
|
@ -39,8 +39,11 @@ if (!is_array($data)) {
|
||||||
$data['_received'] = gmdate('c');
|
$data['_received'] = gmdate('c');
|
||||||
$data['_ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
|
$data['_ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
|
||||||
|
|
||||||
$dir = __DIR__ . '/feedback-data';
|
// Datenverzeichnis: per Env SLC_FEEDBACK_DIR überschreibbar (empfohlen: AUSSERHALB
|
||||||
$file = $dir . '/feedback.jsonl';
|
// 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); }
|
if (!is_dir($dir)) { @mkdir($dir, 0775, true); }
|
||||||
|
|
||||||
$line = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";
|
$line = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue