// README.md - Installationsanleitung // ===================================
- PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 oder neuer (Docker-Image: 8.4.27)
- Ältere Versionen sind von den kritischen RCE-Lücken CVE-2026-109618 und CVE-2026-109619 betroffen (Security Advisory vom 21.10.2026): https://www.php.net/archive/2026.php#2026-10-21-5
- PHP 7.4 / 8.0 / 8.1 erhalten keine Upstream-Updates mehr und sollten nicht mehr eingesetzt werden
- MySQL 5.7 oder höher
- Webserver (Apache/Nginx)
- curl PHP Extension
- PDO MySQL Extension
-
Dateien auf den Server kopieren
-
Datenbank einrichten:
mysql -u root -p < install.sql -
Konfiguration anpassen:
config/config.phpkopieren und anpassen- Divera Access Key eintragen
- Stein.app API Key und Business Unit ID eintragen
- Datenbank-Zugangsdaten eintragen
- Unter
authBenutzer und Passwort für Dashboard/API setzen (bzw. die UmgebungsvariablenDASHBOARD_USER/DASHBOARD_PASSWORD). Ohne Passwort ist die API für jeden erreichbar, der den Server erreicht.
-
Berechtigungen setzen:
chmod 755 . chmod 644 *.php chmod 755 src/ config/
Für automatische Synchronisation alle 5 Minuten:
*/5 * * * * /usr/bin/php /pfad/zu/cron.php >> /var/log/divera-sync.log 2>&1Öffnen Sie index.html im Browser für das Dashboard.
git pull
make build # baut mit --pull, zieht also auch das aktuelle PHP-Base-Image
make upOhne Make:
git pull
docker compose build --pull
docker compose up -dDie Datenbank bleibt im Volume mariadb-data erhalten. Vorher sichern:
make backup- Datenbank sichern (
mysqldump) - Neue Dateien auf den Server kopieren,
config/config.phpdabei nicht überschreiben - PHP auf dem Server auf eine gepatchte Version bringen (siehe Voraussetzungen)
- Prüfen, ob
install.sqlneue Tabellen oder Spalten enthält, und diese bei Bedarf nachziehen
Bestehende Installationen, die vor dem 21.10.2026 aufgesetzt wurden, laufen
auf einer verwundbaren PHP-Version. Ein git pull allein genügt nicht, der
Container muss neu gebaut und neu gestartet werden:
git pull
make build
make upAnschließend prüfen:
docker compose exec web php -vDie Ausgabe muss PHP 8.4.27 oder neuer zeigen.
- Dashboard öffnen
- Sync-Richtung wählen
- "Jetzt synchronisieren" klicken
Im Dashboard können Sie auswählen, welche Felder synchronisiert werden sollen.
GET api.php?action=stats- Statistiken abrufenGET api.php?action=logs&limit=50- Logs abrufenPOST api.php?action=sync- Synchronisation startenGET api.php?action=fieldConfig- Feld-Konfiguration abrufenPOST api.php?action=updateField- Feld-Konfiguration aktualisierenPOST api.php?action=updateAutoSync- Auto-Sync ein/aus und Intervall (60–3600 s)GET api.php?action=systemStatus- Status des Auto-SyncGET api.php?action=vehicles- Fahrzeugliste aus beiden SystemenGET api.php?action=health- Health-Check inkl.version
Alle Endpoints verlangen HTTP-Basic-Auth, sobald ein Passwort konfiguriert ist.
POST-Endpoints erwarten Content-Type: application/json.
curl -u admin:geheim "http://localhost:8080/api.php?action=health"Der Health-Endpoint liefert die installierte Version. Beispiel für einen
REST-Sensor in der configuration.yaml, der Version und letzten Sync anzeigt:
rest:
- resource: "http://sync.example.local:8080/api.php?action=health"
authentication: basic
username: admin
password: !secret divera_stein_sync
scan_interval: 300
sensor:
- name: "Divera-Stein Sync Version"
value_template: "{{ value_json.version }}"
- name: "Divera-Stein Sync letzter Lauf"
value_template: "{{ value_json.last_sync }}"Die aktuelle Version steht in CHANGELOG.md; ein Vergleich mit dem Sensorwert
zeigt, ob ein Update ansteht.
- API und Dashboard sind per HTTP-Basic-Auth geschützt (
DASHBOARD_USER/DASHBOARD_PASSWORD). Ohne gesetztes Passwort ist die API offen, der Container warnt beim Start. - Kein CORS-Wildcard mehr; POST nur mit
Content-Type: application/json(schützt vor CSRF trotz Basic-Auth). - Alle Eingaben werden validiert (Sync-Richtung, Feldnamen, Intervall, Limit)
- API verwendet Prepared Statements gegen SQL Injection
- Werte aus Divera/Stein werden im Dashboard HTML-escaped (XSS)
.htaccessblockiert Konfigurations-, Log-, Shell-, SQL- und.env-Dateien;cron.php/cleanup.phplaufen nur per CLI- TLS-Zertifikate der Stein- und Divera-API werden geprüft
- Datenbank- und interne Fehler gehen nur ins Server-Log, nicht an den Client
- Rate Limiting für externe APIs implementiert
- Docker-Image läuft auf PHP 8.4.27 (Fix für CVE-2026-109618 / CVE-2026-109619);
Datei-Uploads und
session.upload_progresssind im Container deaktiviert, da die API ausschließlich JSON verarbeitet - MariaDB und phpMyAdmin sind im Docker-Setup nur auf
127.0.0.1erreichbar - Nach PHP-Sicherheitsupdates immer
make build(nutzt--pull) undmake upausführen, damit das gepatchte Base-Image tatsächlich gezogen wird
Für den Betrieb außerhalb des eigenen Netzes gehört zusätzlich ein Reverse Proxy mit TLS davor. Die Basic-Auth hat keine Sperre gegen Brute-Force, ein starkes Passwort ist Pflicht.
Bei Fragen oder Problemen erstellen Sie bitte ein Issue im Repository.