> **Vollständiges Paket 1.3.1 (14.10.2026):** Enthält alle PHP-Ansichten einschließlich `admin_security.php` und `admin_upgrade.php` sowie die 2FA-/Passkey-Klassen. Für ein Update der bestehenden Installation **zuerst `INSTALLATION_UPDATE.txt` lesen**. Danach mit `php bin/check_files.php` den Serverbestand prüfen. Deine `.env`, Datenbank und dein `storage/`-Ordner dürfen nicht durch leere Dateien ersetzt oder gelöscht werden.

# RETUROX Website

Moderne, selbst gehostete Website für das kostenlose Minecraft-Netzwerk Returox. Enthalten sind **Startseite, Plugin-Wiki, Vote, Regeln, Impressum, Datenschutz und ein Admin-Panel**.

## Technik

- PHP **8.3 oder neuer** mit `pdo_mysql`, `fileinfo` und `iconv`
- MySQL 8 oder MariaDB 10.6+
- Apache mit mod_rewrite oder Nginx
- HTTPS (Let's Encrypt o.ä.)
- Bootstrap 5, Marked.js und eigenes CSS/JS liegen **lokal** bei. Kein CDN oder Node.js zur Laufzeit nötig.
- Keine externe Datenbank für Minecraft-Status, Abfrage erfolgt über Minecraft Java Status-Protokoll (Port konfigurierbar).

## Installation (ca. 10 Minuten)

1. ZIP entpacken und auf den Webserver hochladen, zum Beispiel nach `/var/www/returox-website/`.
2. Die **DocumentRoot / Webroot unbedingt auf `/var/www/returox-website/public/` legen**. Niemals auf das Projekt-Stammverzeichnis zeigen, weil sonst die Datenbank-Konfiguration, Backups und Dokumentationen öffentlich werden können.
3. Datenbank und einen eigenen Datenbankbenutzer anlegen (UTF8MB4). Beispiel:

   ```sql
   CREATE DATABASE returox_website CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
   CREATE USER 'returox'@'localhost' IDENTIFIED BY 'EIN_LANGES_EIGENES_PASSWORT';
   GRANT ALL PRIVILEGES ON returox_website.* TO 'returox'@'localhost';
   ```

   Das SQL-Beispiel mit eigenem Kennwort ausführen. Bei externem Datenbankserver entsprechend Hostrechte anpassen.
4. `.env.example` in `.env` umbenennen und `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASS` eintragen. `APP_URL` auf deine Domain setzen.
5. Ein zufälliges Setup-Token generieren, zum Beispiel `php -r "echo bin2hex(random_bytes(32)),PHP_EOL;"` und als `SETUP_TOKEN` in `.env` eintragen. **Die Datei `.env` niemals ins öffentliche Webverzeichnis kopieren.**
6. PHP-Schreibrechte für `storage/markdown`, `storage/media`, `storage/backups`, `storage/cache`, `storage/logs` vergeben. Beispiel Linux: `sudo chown -R www-data:www-data storage/` und `sudo chmod -R u+rwX,go-rwx storage/` (Benutzer an deine PHP-FPM-Konfiguration anpassen).
7. `https://returox.net/admin/setup` öffnen. Setup-Token, neuen Administratornamen und ein mindestens 12 Zeichen langes Passwort eingeben. Das Setup legt Tabellen und Basiswerte an. Danach ist es automatisch deaktiviert.
8. Unter `/admin/settings` die echte Minecraft-Adresse, die Discord-Einladung, den Betreibernamen, die Kontakt-E-Mail und Hosterdaten eintragen. **`Returox.NET` ist die reguläre Spieladresse**. Die Statusabfrage bleibt deaktiviert, bis ein echter Host eingetragen wurde.
9. Über `/admin/wiki` deine `.md`-Dateien importieren. Über `/admin/media` Bilder hochladen und die ausgegebenen Markdown-Links einfügen.
10. Vote-Plattformen und Regeln in den entsprechenden Admin-Modulen erstellen. Es werden bewusst **keine** erfundenen Vote-Plattformen oder Regeln als echte Daten vorausgefüllt.
11. Impressum und Datenschutzerklärung vor Veröffentlichung rechtlich prüfen und vervollständigen. Standardmäßig wird `noindex, nofollow` gesetzt. Unter Einstellungen kann die Indexierung aktiviert werden.

### Apache

`public/.htaccess` enthält Rewrite-Regeln. `mod_rewrite` und `AllowOverride All` müssen aktiviert sein. DocumentRoot zeigt auf `public/`.

### Nginx

Siehe `nginx.example.conf`. PHP-FPM-Socket entsprechend der Installation konfigurieren. HTTPS/SSL im Server-Block einstellen.

### Lokaler Testserver (nach erfolgter Datenbank-Einrichtung)

```bash
php -S 127.0.0.1:8000 router.php
```

Dabei bleibt das Projekt-Stammverzeichnis für einen lokalen Entwicklungsserver zugänglich. Nur lokal testen, nicht als öffentliche Produktivkonfiguration verwenden.

### Systemcheck

```bash
php bin/healthcheck.php
```

## Seiten & Module

| Pfad | Funktion |
|---|---|
| `/` | Startseite, Modi, Serveradresse, Java-Serverstatus |
| `/wiki` | Wiki-Suche, Dokumentationsnavigation, Lese- und Vorlesemodus |
| `/wiki/rx-plots` | Direktlink zu einem hochgeladenen Wiki-Artikel |
| `/vote` | Administrierte Vote-Links und optionale Belohnungshinweise |
| `/regeln` | Nach Kategorien gruppierte Serverregeln |
| `/impressum` | Betreibername, Adresse und Kontakt |
| `/datenschutz` | Datenschutzhinweise als anpassbare Vorlage |
| `/admin` | Geschützte Administration |
| `/admin/media` | JPG, PNG, WebP, GIF hochladen; Markdown-Links kopieren |

### Admin-Rollen

- **Superadmin:** Alle Inhalte, Website-Einstellungen, Nutzer und Rollen.
- **Admin:** Wiki, Medien, Vote, Regeln und Seiteninhalte.
- **Editor:** Wiki-Dokumentationen und Medien hochladen/bearbeiten (keine Benutzer- oder Site-Konfiguration).

Anmeldung ist mit Passwort-Hashing, CSRF-Schutz, Session-Regeneration, Rollenprüfung und einem IP-basierten Login-Rate-Limit geschützt. Administrativer Änderungen werden in `audit_log` protokolliert. Eine Zwei-Faktor-Anmeldung mit TOTP sowie Passkeys sind seit Version 1.2 enthalten. Die Sicherheitstabellen benötigen bei älteren Installationen das Upgrade.

### Wiki-Import und Verlinkung

- Mehrere Markdown-Dateien gleichzeitig hochladen (`max. 2 MB` pro Datei, `POST`-Limit deines Hostings beachten).
- Dateiname `RX_BiggerChest.md` wird standardmäßig zum Link `/wiki/rx-biggerchest`.
- Admin-Editor, Entwürfe, Kategorien, sortierte Listen, Suche auch im Dateiinhalt.
- Backups werden bei Änderungen und Löschungen unter `storage/backups` abgelegt. Backup-Wiederherstellung erzeugt einen neuen unveröffentlichten Entwurf.
- Zum Verlinken zwischen Dokumenten funktionieren `.md`-Links wie `[Jobs](RX_Jobs.md)`.
- Bilder via `/admin/media` hochladen. Die fertigen Markdown-Links direkt kopieren, z.B. `![Bild](/media/<dateiname>.png)`.
- Aus Sicherheitsgründen werden eingebettetes HTML, Scripts, iFrames und externe Bildquellen in Markdown entfernt. HTTPS-Links bleiben möglich.

### Vorlesefunktion

- Verwendet **SpeechSynthesis im Browser** und **nur angebotene deutsche Stimmen** (`de-DE`, `de-AT`, `de-CH`).
- Stimmwahl, Hörprobe, Tempo, Start, Pause, Stopp; Markierung des aktuellen Abschnitts.
- Es werden keine Texte von der Website an eine bezahlte externe Sprachausgabe-API gesendet.
- Qualität und Verfügbarkeit hängen von den installierten Browser-/Systemstimmen ab. Für natürlichere Stimmen kann der Benutzer zusätzliche deutsche Stimmen auf seinem Gerät installieren. Kein Cloud-TTS in diesem Paket.

### Statusabfrage

- Funktioniert über das **Java Edition Status Protokoll** am konfigurierten Host und Port (meist Proxy/Bungee/Velocity).
- Serverstatus wird 60 Sekunden serverseitig gecacht, TCP-Verbindung mit begrenztem Timeout.
- Ein nicht erreichbarer Server wird nicht automatisch als "offline" behauptet, sondern als „Status nicht verfügbar“ dargestellt.
- Bei Bedrock-only-Servern oder Proxies ohne Java-Status-Antwort ist eine separate Integration erforderlich.

## Sicherheit & Backup

- Öffentlich ist ausschließlich `public/` erreichbar. Uploads und Datenbankkonfiguration sind außerhalb des Webroots.
- SQL-Queries mit Prepared Statements; Authentifizierung mit `password_hash`, `password_verify`.
- Dateinamen stark eingeschränkt; Upload-Größen und Bildtyp geprüft.
- Markdown wird browserseitig als streng gefiltertes HTML ausgegeben (Whitelist, keine Event-Attribute).
- Sichere HTTP-Header und CSP. HTTPS dringend empfohlen.
- Erstelle regelmäßige **Datenbank-Dumps UND Dateisicherungen des `storage/`-Ordners**. Beides gehört zusammen; in der Datenbank stehen Metadaten, im Ordner die Markdown-Dateien.
- Das Admin-Panel dient als Inhaltsverwaltung, nicht als Ersatz für ein komplettes Backup-System.
- Bei externem Discord-Link werden Spieler erst nach dem Anklicken weitergeleitet.

## Gestaltung ändern

`public/assets/css/site.css`: komplettes Designsystem inkl. responsivem Layout. Im Admin-Panel kannst du Primär- und Akzentfarbe ändern sowie Logo, Favicon und Hero-Bild durch eigene Bilder aus der Medienverwaltung ersetzen. Vote-Plattformen können eigene Logos bekommen. Im `public/assets/images/` liegen ein editierbares SVG-Favicon und die Minecraft-inspirierte Hero-Illustration.

## Rechtliches

Die c/o-Adresse ist nach Vorgabe hinterlegt:

c/o IP-Management #974  
Ludwig-Erhard-Str. 18  
20459 Hamburg  
Deutschland

**Wichtig:** Eine vollständige Anbieterkennzeichnung benötigt gegebenenfalls Betreibername und weitere Angaben; diese nicht erraten, sondern im Admin-Panel eintragen. Die c/o-Adresse muss für deine konkrete Nutzung rechtlich zulässig sein. Die Datenschutzerklärung enthält ein anpassbares Grundgerüst und ist keine geprüfte Rechtsberatung.

## Systemtests & bekannte Grenzen

Alle PHP-Dateien wurden mit `php -l` und die JavaScript-Dateien mit `node --check` geprüft. Der Build entstand in einer Umgebung ohne PHP-Erweiterung `pdo_mysql` und ohne MariaDB-Testserver; deshalb konnte ein vollständiger Datenbank-/Login-/Upload-Durchlauf **hier nicht in Echtbetrieb getestet** werden. Führe unbedingt einen Installations- und Funktionstest in deiner Hosting-Umgebung durch. Der Browser-Standard-TTS kann trotz deutscher Stimmen künstlich klingen. OAuth/Discord-Login, Statistik-Aggregation, und automatische Online-Updates sind nicht implementiert. Zwei-Faktor-Authentifizierung und Passkeys wurden in Version 1.2 ergänzt und benötigen ein separates Upgrade sowie einen Praxistest.

## Lizenzhinweise

Die lokal enthaltenen Drittanbieter-Bibliotheken (Bootstrap 5 und Marked) unterliegen ihren jeweiligen MIT-Lizenzen. Dateien unter `LICENSES/` beachten. Eigene Returox-Dateien verbleiben beim Betreiber.

---

## Version 1.2: Upgrade ohne Verlust deiner Daten

**Vor jeder Aktualisierung:** Sicherung der Datenbank, `.env` und `storage/` erstellen. Den Webroot weiterhin auf `public/` lassen. Alte Datenbanken und `.env` nicht überschreiben. Das Update-ZIP enthält nur die angepassten Dateien und eine SQL-Migration.

1. ZIP-Dateien über die bestehende Website kopieren (Unterordnerstruktur beibehalten). `storage/`, `.env` und die Datenbank **nicht** löschen.
2. In der bisherigen `.env` ergänzen (nicht vollständig ersetzen):

   ```ini
   # Einmal generieren und danach nie ändern, solange 2FA-Codes existieren
   APP_KEY=ZUFALLSSCHLUESSEL_MIT_MINDESTENS_32_ZEICHEN

   # Datenbank der SimpleCloud, nur SELECT-Rechte nötig
   CLOUD_DB_HOST=127.0.0.1
   CLOUD_DB_PORT=3306
   CLOUD_DB_NAME=cloud
   CLOUD_DB_USER=cloud_website_reader
   CLOUD_DB_PASS=HIER_SICHERES_PASSWORT
   CLOUD_PROXY_NAME=Proxy-1
   # Optional falls automatische Erkennung des Servicenamen-Feldes fehlschlägt:
   CLOUD_SERVICE_COLUMN=
   ```

3. Zufallswert erzeugen: `php -r "echo bin2hex(random_bytes(32)), PHP_EOL;"`. Den ausgegebenen Wert als `APP_KEY` eintragen und sicher aufbewahren. **Bei Verlust können bestehende Authenticator-Geheimnisse nicht entschlüsselt werden.**
4. Die drei neuen Tabellen im Admin-Panel mit **`https://returox.net/admin/upgrade`** (Superadmin) anlegen. Alternativ das SQL-Skript `database/update_1_2.sql` mit einem berechtigten MariaDB-Client in der **Website-Datenbank**, nicht in `cloud`, ausführen.
5. Unter **Admin → 2FA & Passkeys** deinen Authenticator aktivieren und Wiederherstellungscodes sicher offline aufbewahren. Passkeys mit Windows Hello, Touch ID, Face ID oder einem FIDO2-Gerät hinzufügen. Ein Passkey-Login mit Geräteverifikation ist eine eigenständige passwortlose Anmeldung; nach Passwort-Login wird bei aktiviertem TOTP ein Zusatzcode verlangt.
6. Farben im Adminbereich unter **Einstellungen** anpassen; die Werte beeinflussen jetzt auch Buttons, Effekte und Farbverläufe. Bei alten Browser-Caches `Strg + F5` verwenden.
7. **Spielerzahl aus der Cloud:** `OnlinePlayersCount` aus `cloud.cloud_stats_service`, für `Proxy-1`, Aktualisierung spätestens nach ca. 20 Sekunden beim nächsten Website-Abruf. Das Servicenamen-Feld wird aus häufigen Spaltenbezeichnungen ermittelt; wenn es anders heißt, `CLOUD_SERVICE_COLUMN` auf den exakten Namen setzen. Die vorherige Minecraft-Ping-Spielerzahl wird nicht als Fallback verwendet. `0` ist ein gültiger Wert, `–` bedeutet unbekannt.
8. Die automatisch sichtbare Warnbox auf der Datenschutzseite wurde entfernt. Die bisher unveränderte Beispielpassage aus der Datenbank wird beim Upgrade nur dann geleert, wenn sie **exakt** dem alten Vorlagewert entspricht. Selbst eingetragene Datenschutztexte bleiben unverändert. Datenschutzangaben vor dem Onlinegang prüfen.

### Cloud-Datenbankberechtigung

Nutze nach Möglichkeit einen separaten MariaDB-Benutzer mit ausschließlich `SELECT` auf der Tabelle:

```sql
GRANT SELECT ON cloud.cloud_stats_service TO 'cloud_website_reader'@'WEB_SERVER_HOST';
```

Benutzererstellung, Host und Passwort müssen zu deiner tatsächlichen Serverkonfiguration passen. Keine Superadmin-Datenbankkonten für diese öffentliche Statusanzeige verwenden. Das SQL-Schema der Cloud selbst wird durch das Website-Update nicht verändert.

### Status der Tests für Version 1.2

- PHP-Syntax aller Projektdateien überprüft.
- JavaScript-Syntax überprüft.
- Authenticator-TOTP mit RFC-6238-Testvektor geprüft.
- Verschlüsselung/Entschlüsselung der TOTP-Schlüssel mit AES-256-GCM geprüft.
- WebAuthn-ES256- und RS256-Schlüsselkonvertierung und Signaturprüfung mit Testschlüsseln geprüft.
- Ein realer Passkey-Registrierungs- und Anmeldevorgang mit Hardware, eine Live-MariaDB-Verbindung und die Cloud-Datenabfrage konnten in dieser Umgebung **nicht** getestet werden. Diese Funktionen vor Produktivnutzung auf einem Testsystem und einer echten HTTPS-Domain prüfen.

Für die Passkey-Sicherheit ist `APP_URL=https://returox.net` (exakt der aufgerufene Origin) erforderlich. Nutze eine vertrauenswürdige HTTPS-Konfiguration. Weitere Schutzmaßnahmen wie hardwarebasierte U2F/Passkey-Verwaltung, Monitoring und Backup-/Recovery-Prozesse bleiben Verantwortung des Betreibers.


## Update 1.3: Wiki-Bedienung und Datenschutzeinstellungen

RETUROX 1.3 - UPDATE DER BESTEHENDEN INSTALLATION
================================================

Dieses Update behebt die Vorlese- und Inhaltsverzeichnis-Steuerung im Wiki,
ergaenzt eine einwilligungsbasierte Speicherung von Komforteinstellungen und
kennzeichnet Impressum / Datenschutz fuer Suchmaschinen als nicht indexierbar.

VOR DEM UPDATE: Backup der Website, der Datenbank, der .env und des Ordners
storage/ erstellen. ZIP in das Verzeichnis oberhalb des bestehenden
Returox_Website-Ordners entpacken und geaenderte Dateien ueberschreiben.

WICHTIG: Die Datenbank, .env, storage/ und Zugangsdaten werden nicht angefasst.
Keine neue SQL-Migration, kein Upgrade im Adminbereich noetig.
Danach Browser-Cache mit Strg+F5 neu laden.

COOKIE-EINSTELLUNGEN:
- Notwendig: PHP-Sitzung und Wahl-Cookie rx_consent (180 Tage).
- Optional: lokale Komfort-Einstellungen im Browser, nur nach Einwilligung.
- Kein Analytics/Marketing enthalten. Spaeter integrierte Tracker muessen
  separat an die Einwilligungslogik angeschlossen werden.
- Der Betreiber MUSS die gesamte Datenschutzerklaerung (insbes. Hosting,
  Logs, weitere Dienste) vor Veroeffentlichung pruefen und ggf. anpassen.

IMPRESSUM/DATENSCHUTZ:
- robots.txt disallow + X-Robots-Tag und Meta-Robots noindex.
- Damit werden kooperative Bots gebeten, nicht zu crawlen bzw. zu indexieren.
- Kein technischer Zugriffsschutz; aggressive Bots koennen oeffentliche
  Seiten trotzdem abrufen. Suchmaschinen koennen noindex bei robots.txt-
  Blockade u.U. nicht lesen und die reine URL dennoch anzeigen.
- Impressum und Datenschutz bleiben im Footer erreichbar.

HINWEIS: Sofern ein Cookie-Consent-Management bereits in einem anderen
Reverse-Proxy oder CDN installiert ist, dieses vor dem Einsatz abgleichen,
damit keine widerspruechlichen Abfragen entstehen.
