Progressive Web App (PWA) für das interne Koordinationsmanagement von Feuerwehren. Keine Datenbank erforderlich - läuft mit Apache + PHP und verschlüsselten JSON-Dateien.
- Features
- Installation
- Update / Upgrade (Datenübernahme)
- Offline-Funktionalität
- Erste Schritte
- Administration
- Operator-Bereich
- Push-Benachrichtigungen (ntfy)
- Konfiguration
- Sicherheit
- Health-Check & Tests
- Technologie-Stack
- Support
- Lizenz
- Drei Benutzerrollen:
- Global-Admin: Vollzugriff auf alle Standorte und Systemeinstellungen
- Standort-Admin: Verwaltung eines spezifischen Standorts
- Operator: Formulare & Ansichten (keine Verwaltung)
- Multi-Standort-Unterstützung: Mehrere Einsatzabteilungen/Standorte verwalten
- Verschlüsselte Datenspeicherung: Alle Daten AES-256-CBC verschlüsselt
- Sichere Passwörter: bcrypt-Hashing; neue Passwörter min. 10 Zeichen (bestehende kürzere bleiben gültig)
- CSRF-Schutz: Token-Validierung für state-changing Requests
- Rate-Limiting: Login und Passwort-Reset (5 Fehlversuche / 15 Min.)
- Remember-Me / Sitzungsübersicht: Geräte widerrufen („Angemeldet bleiben“)
- Audit-Log: Nachvollziehbare Admin-/Sicherheitsaktionen
- Session-Management: Automatischer Timeout
- XSS & Command Injection Schutz: Output-Escaping und Whitelisting
- Einsatzkräfte-Verwaltung: Zentrale Datenbank aller Mitglieder
- Qualifikationen: AGT, Maschinist, Sanitäter
- Führungsrollen: Truppführer, Gruppenführer, Zugführer, Verbandsführer
- Ausbilder-Kennzeichnung: Separate Markierung für Übungsleiter
- Zentrale Fahrzeugverwaltung: Ort, Typ, Funkrufname
- Multi-Select Integration: Automatische Verfügbarkeit in allen Formularen
-
Anwesenheitsliste (Übungsdienste):
- Übungsleiter-Auswahl (nur Ausbilder)
- Teilnehmer (Multi-Select)
- Automatische Zeitberechnung
- Teilnehmerzählung
- Datei-Upload mit E-Mail-Anhang
-
Einsatzbericht:
- Vollständige Einsatzdaten (Grund, Ort, Leiter, Lage, Tätigkeiten)
- Dynamische Fahrzeugbesatzung (1-20 Einsatzkräfte)
- Beteiligte Personen (dynamisch 0-10)
- Verdienstausfall-Tracking
- Kostenpflichtigkeit
- Entwurf speichern: Autosave in localStorage (Wiederaufnahme vor Absenden)
-
E-Mail & PDF: Automatischer Versand als HTML-E-Mail mit PDF-Anhang
- Online Karte: OpenStreetMap mit Leaflet + leaflet-routing-machine
- Gefahrenmatrix: AAAA-CCCC-EEEE Einsatzstellen-Gefahren
- Gefahrstoffkennzeichen: UN-Nummern Datenbank mit GHS/ADR-Klassen
- Wichtige Telefonnummern: Notfallkontakte mit Direktwahl (tel:-Links)
- Globale Suche: Personal, Fahrzeuge, Übungen und Einsätze
- Kalender: Monatsübersicht für Übungen und Einsätze
- ntfy Nachrichten: Push-Hinweise an standortbezogene ntfy-Kanäle senden
- Backup & Export: Vollbackups (Rotation, letzte 15) sowie JSON/CSV-Export
- Health-Check:
/health.phpfür Runtime-Status ohne Login
- Jahres-Übersicht: Abteilungsweit
- Personen-Statistiken: Einzelauswertung je Einsatzkraft
- Auswertungen: Übungsstunden, Einsatzstunden, Anzahl Dienste
- Progressive Web App: Installierbar auf mobilen Geräten
- Responsive Design: Optimiert für Mobile (iPhone 13 Pro) und Desktop
- Light/Dark Mode: Manuell umschaltbar; Default aus
prefers-color-scheme - Haptik & Toasts: Vibration/Feedback und Toasts statt
alert/confirm - Deep-Links / Browser-History: Navigation mit
?page=und Zurück-Button - Touch-optimiert: Große Buttons für mobile Bedienung
- Material Design Icons: Moderne, intuitive Benutzeroberfläche
- Offline-Funktionalität: Service Worker + IndexedDB für Offline-Formulare
- Push-Benachrichtigungen (ntfy): Standortbezogene Nachrichten an Mobilgeräte versenden
- PHP 7.4+ mit Extensions:
openssl,mbstring,json - Apache oder anderer PHP-kompatibler Webserver
- Git (für Installation via Repository)
Hinweis: Alle PHP-Abhängigkeiten (mPDF, PHPMailer) sind bereits im Repository enthalten - Composer ist nicht erforderlich!
Der Web-Installer ist die einfachste Methode und erfordert keinen Zugriff auf die Kommandozeile.
git clone https://github.com/TimUx/feuerwehr-app.git
cd feuerwehr-appAlternativ: Laden Sie die Dateien per FTP auf Ihren Webserver hoch.
Navigieren Sie zu Ihrer Domain im Browser:
http://ihre-domain.de/install.php
Der Wizard führt Sie durch folgende Schritte:
Der Installer prüft automatisch:
- ✅ PHP Version (7.4.0 oder höher erforderlich)
- ✅ PHP Extensions:
- Erforderlich:
openssl,mbstring,json,session - Empfohlen:
curl,gd,zip
- Erforderlich:
- ✅ Verzeichnis-Berechtigungen (
config/,data/) - ✅ PHP-Konfiguration (
upload_max_filesize,post_max_size,memory_limit)
Sie können erst fortfahren, wenn alle erforderlichen Voraussetzungen erfüllt sind. Warnungen bei empfohlenen Features erlauben das Fortfahren.
Übersicht über die Einrichtung und was konfiguriert wird.
Erstellen Sie den ersten Admin-Benutzer:
- Benutzername (min. 3 Zeichen)
- Passwort (min. 10 Zeichen, mit Bestätigung)
Das Passwort wird automatisch mit bcrypt gehashed und verschlüsselt gespeichert.
Konfigurieren Sie E-Mail-Einstellungen für Formular-Übermittlungen:
- Absender E-Mail-Adresse und Name
- Standard-Empfänger (optional)
- SMTP Server-Einstellungen:
- Host, Port, Verschlüsselung (TLS/SSL)
- Optional: SMTP-Authentifizierung mit Benutzername/Passwort
✅ Verschlüsselungsschlüssel automatisch generiert (64 Zeichen, AES-256-CBC)
✅ Administrator-Benutzer erstellt
✅ E-Mail-Einstellungen konfiguriert
✅ Datenverzeichnis erstellt mit sicheren Berechtigungen
Wichtig: Der Verschlüsselungsschlüssel wird automatisch generiert - keine Kommandozeile erforderlich!
Platzieren Sie Ihr Feuerwehr-Logo als public/assets/logo.png. Dieses wird in E-Mails und PDFs verwendet.
Nach erfolgreicher Installation können Sie sich mit Ihrem erstellten Administrator-Benutzer anmelden und die App nutzen.
Hinweis: Sobald config/config.php existiert, ist der Installations-Wizard (install.php) gesperrt (HTTP 403). Für Updates siehe Update / Upgrade – install.php nicht erneut ausführen.
Wenn Sie Zugriff auf die Kommandozeile haben, können Sie die App auch manuell einrichten:
git clone https://github.com/TimUx/feuerwehr-app.git
cd feuerwehr-appcp config/config.example.php config/config.phpphp -r "echo bin2hex(random_bytes(32));"Kopieren Sie den generierten Schlüssel und fügen Sie ihn in config/config.php als encryption_key ein (64 Hex-Zeichen für AES-256).
Öffnen Sie config/config.php und passen Sie die E-Mail-Einstellungen an:
'email' => [
'from_address' => 'noreply@ihre-feuerwehr.de',
'from_name' => 'Feuerwehr Willingshausen',
'smtp_host' => 'localhost',
'smtp_port' => 25,
],
'app_base_url' => 'https://ihre-domain.de', // Für Passwort-Reset-Linkschmod 700 data
chmod 600 config/config.phpNavigieren Sie zu Ihrer Domain im Browser und melden Sie sich an.
Standard-Zugangsdaten:
- Benutzername:
admin - Passwort:
admin123
- Öffnen Sie die App im Browser auf Ihrem Smartphone
- Tippen Sie auf "Zum Startbildschirm hinzufügen" (iOS) oder "Installieren" (Android)
- Die App erscheint als eigenständige Anwendung auf Ihrem Gerät
Bestehende Installationen können aktualisiert werden, ohne install.php erneut auszuführen. Der Verschlüsselungsschlüssel und die Daten bleiben erhalten.
-
config/config.phpunddata/behalten
Diese Verzeichnisse/Dateien beim Deploy nicht überschreiben. Derencryption_keydarf sich nicht ändern – sonst sind bestehende Daten unlesbar. -
Neuen Code ausrollen
PHP-/Frontend-Dateien aktualisieren (z. B. per Git-Pull oder Upload), Konfiguration und Daten unverändert lassen. -
App einmal öffnen
Beim nächsten Request führtAppUpgrade(src/php/upgrade.php) ausstehende Migrationen aus (aktuell Schema v2):- legt unter
data/backups/pre_upgrade_v*_…/eine Vor-Upgrade-Sicherung an - schreibt/aktualisiert
data/app_meta.json(Schema-Version, Zeitstempel)
- legt unter
-
Health-Check prüfen
https://ihre-domain.de/health.php– Config, Encryption-Key,data/und Backup-Verzeichnis solltenokmelden. -
install.phpnicht erneut ausführen
Der Installer ist nach der Erstinstallation gesperrt und würde bei erzwungenem Reset den Schlüssel und den Datenzugriff gefährden.
- Migrationen sind idempotent und brechen ab, wenn Kern-Dateien nicht entschlüsselbar sind (kein Daten-Wipe bei falschem Key).
- Manuelle Vollbackups und JSON/CSV-Exports sind zusätzlich unter Backup & Export (Admin) verfügbar.
Die App unterstützt vollständige Offline-Funktionalität für kritische Features - perfekt für den Einsatz in Gebieten mit schlechter Netzabdeckung.
Erweiterte Caching-Strategie
- Cache-First für statische Assets (CSS, JS, Icons, Fonts)
- Network-First mit Cache-Fallback für API-Endpunkte
- Dynamisches Caching für Seiteninhalte
- Intelligentes Cache-Versioning und automatisches Cleanup
Offline-Formular-Speicherung
- Formulare können offline ausgefüllt werden
- Daten werden lokal in IndexedDB gespeichert
- Automatische Synchronisation bei Verbindungswiederherstellung
- Background Sync API für automatische Formular-Übermittlung im Hintergrund
Benutzeroberfläche
- Online/Offline-Statusanzeige (unten rechts)
- Sync-Button mit Badge für ausstehende Formulare
- Benachrichtigungssystem für Sync-Feedback
- Offline-Banner auf Formularseiten
- Navigieren Sie zu einem Formular (Anwesenheitsliste oder Einsatzbericht)
- Wenn offline: Ein gelber Banner wird oben im Formular angezeigt
- Füllen Sie das Formular aus wie gewohnt
- Klicken Sie auf "Absenden"
- Das Formular wird lokal gespeichert und zeigt eine Bestätigung
Automatisch:
- Wenn die Verbindung wiederhergestellt wird, synchronisiert die App automatisch alle ausstehenden Formulare
- Eine Benachrichtigung bestätigt erfolgreiche Synchronisationen
Manuell:
- Klicken Sie auf das Sync-Symbol (🔄) in der Kopfzeile
- Das Badge zeigt die Anzahl der ausstehenden Formulare
- Nach dem Klicken werden alle ausstehenden Formulare sofort übermittelt
- Grünes Symbol: Online und synchronisiert
- Rotes Symbol: Offline-Modus aktiv
- Der Status wird automatisch aktualisiert
Wenn OFFLINE:
- Erscheint unten rechts mit rotem Rahmen
- Rotes Cloud-Off-Icon
- Text: "Offline"
Wenn ONLINE:
- Grüner Rahmen
- Grünes Cloud-Done-Icon
- Text: "Online"
- Verschwindet automatisch nach kurzer Zeit
Normal (keine ausstehenden Formulare):
- Button ist versteckt
Mit ausstehenden Formularen:
- Erscheint rechts neben Theme-Toggle
- Badge zeigt Anzahl der ausstehenden Formulare
- Badge pulsiert zur Aufmerksamkeit
- Klick startet manuelle Synchronisation
- Button rotiert während Synchronisation
In Anwesenheitsliste und Einsatzbericht (wenn offline):
- Gelber Hintergrund mit Warnsymbol
- Informiert Benutzer über Offline-Modus
- Text: "Offline-Modus - Formulare können offline ausgefüllt werden und werden automatisch gesendet, sobald Sie wieder online sind."
- Verschwindet wenn online
Bei Offline-Speicherung:
- Gelbe Warnung: "Keine Internetverbindung. [Formular] wurde offline gespeichert und wird automatisch gesendet, sobald Sie wieder online sind."
Bei erfolgreicher Synchronisation:
- Grüne Bestätigung: "X Formular(e) erfolgreich synchronisiert"
Bei Sync-Fehler:
- Rote Fehlermeldung: "Synchronisierung fehlgeschlagen"
-
Benutzer öffnet Anwesenheitsliste
- Offline-Banner erscheint (gelb)
- Status-Indikator zeigt "Offline" (rot, unten rechts)
-
Benutzer füllt Formular aus
- Alle Felder funktionieren normal
- Datepicker, Dropdowns, etc. funktionieren
-
Benutzer klickt "Absenden"
- Warnung erscheint: "Keine Internetverbindung. Anwesenheitsliste wurde offline gespeichert..."
- Formular wird zurückgesetzt
- Sync-Button erscheint mit Badge "1"
-
Benutzer kann weitermachen
- Weitere Formulare ausfüllen möglich
- Badge erhöht sich: "2", "3", etc.
-
Internet kehrt zurück
- Status-Indikator wechselt zu "Online" (grün)
- Automatische Sync startet (im Hintergrund)
-
Während Sync
- Sync-Button rotiert
- Badge bleibt sichtbar
-
Nach erfolgreicher Sync
- Benachrichtigung: "2 Formular(e) erfolgreich synchronisiert"
- Badge verschwindet
- Sync-Button verschwindet
- Formulare wurden an Server gesendet
- E-Mails wurden versendet
-
Benutzer ist online
- Hat ausstehende Formulare (Badge "2")
-
Benutzer klickt Sync-Button
- Button dreht sich
- Formulare werden übermittelt
-
Nach Sync
- Benachrichtigung zeigt Ergebnis
- Badge wird aktualisiert oder verschwindet
Unterstützte Formulare:
- ✅ Anwesenheitsliste
- ✅ Einsatzbericht
1. Enhanced Service Worker (sw.js)
Cache-Strategien:
├── Cache-First: Statische Assets (CSS, JS, Icons)
├── Network-First: API-Endpunkte, Seiteninhalte
└── Network-Only: Formular-Submissions (mit Offline-Fallback)
Features:
├── Intelligentes Caching mit Versioning (v2)
├── Automatische Cache-Cleanup
├── Background Sync Support
└── IndexedDB-Integration für Form-Sync
2. Offline Storage (public/js/offline-storage.js)
Funktionen:
├── IndexedDB-Initialisierung
├── Formulare speichern
├── Ausstehende Formulare abrufen
├── Synchronisation mit Server
├── Background Sync Registrierung
└── Fehlerbehandlung
3. Offline UI (public/js/offline-ui.js)
UI-Komponenten:
├── Online/Offline-Statusanzeige (unten rechts)
├── Sync-Button mit Badge (Kopfzeile)
├── Benachrichtigungssystem
└── Offline-Banner auf Formularen
4. Integration in Haupt-App (public/js/app.js)
Erweiterungen:
├── Offline-Support-Initialisierung
├── Formular-Handler mit Offline-Erkennung
├── Konfiguration für unterstützte Formulare
└── Graceful Degradation
5. Shared Utilities (public/js/offline-utils.js)
Hilfsfunktionen:
├── Offline-Banner-Management
├── DOM-Ready-Checks
└── Wiederverwendbare Utilities
Cache-Strategien:
Cache-First (Statische Assets)
Request → Cache → Network (fallback)
Verwendet für CSS, JavaScript, Bilder, Icons und Fonts
Network-First (API & Pages)
Request → Network → Cache (fallback)
Verwendet für API-Endpunkte, Seiteninhalte und dynamische Daten
Network-Only (Formulare & Verwaltung)
Request → Network (no cache)
Verwendet für Formular-Submissions (außer bei Offline), Admin-Funktionen und Benutzer-Verwaltung
Browser-Unterstützung:
| Feature | Chrome/Edge | Firefox | Safari | Mobile |
|---|---|---|---|---|
| Service Worker | ✅ 45+ | ✅ 44+ | ✅ 11.1+ | ✅ |
| IndexedDB | ✅ 24+ | ✅ 10+ | ✅ 10+ | ✅ |
| Background Sync | ✅ 49+ | |||
| Cache API | ✅ 40+ | ✅ 41+ | ✅ 11.1+ | ✅ |
*Fallback auf manuelle Synchronisation verfügbar
**Teilweise unterstützt auf Android Chrome
Datenspeicherung:
Alle offline gespeicherten Formulare werden in IndexedDB gespeichert:
- Datenbank:
FeuerwehrAppDB - Object Store:
pending-forms - Gespeicherte Felder: ID, Formulartyp, Ziel-URL, FormData, Zeitstempel, Status
Dateigröße:
Neue Dateien:
├── sw.js (erweitert): +5 KB
├── offline-storage.js: 8 KB
├── offline-ui.js: 9 KB
├── offline-utils.js: 1 KB
└── style.css (Ergänzung): +3 KB
Gesamt: ~26 KB zusätzlich (unkomprimiert)
Performance:
- Keine Auswirkungen im Online-Modus
- Schnellere Ladezeiten durch Caching
- Offline-Formulare speichern in <100ms
- Synchronisation hängt von Netzwerkgeschwindigkeit ab
- ✅ Alle Daten werden nur lokal im Browser gespeichert
- ✅ Keine sensiblen Daten werden im Cache gespeichert
- ✅ Formulardaten werden nach erfolgreicher Synchronisation gelöscht
- ✅ HTTPS erforderlich für Service Worker in Produktion
- ✅ CodeQL Scan: 0 Alerts - keine Sicherheitsrisiken
- Chrome DevTools öffnen (F12)
- Network Tab → Online → Offline wählen
- Formular ausfüllen und absenden
- In IndexedDB (Application Tab) prüfen
- Online → Online wechseln
- Automatische Sync beobachten
F12 → Application Tab → IndexedDB
└─► FeuerwehrAppDB
└─► pending-forms
└─► Gespeicherte Formulare anzeigen
Struktur eines gespeicherten Formulars:
{
"id": 1,
"type": "Anwesenheitsliste",
"url": "/src/php/forms/submit_attendance.php",
"data": FormData {},
"timestamp": "2025-01-15T10:30:00.000Z",
"status": "pending"
}F12 → Application Tab → Cache Storage
└─► feuerwehr-app-static-v2
├─► /, /index.php, /public/css/style.css
├─► /public/js/app.js
└─► /public/icons/...
└─► feuerwehr-app-dynamic-v2
└─► Seiteninhalte
└─► feuerwehr-app-api-v2
└─► API-Responses
F12 → Application Tab → Service Workers
└─► sw.js
└─► Status: activated and is running
└─► Update on reload ☐
Beim Laden der App:
[SW] Installing service worker...
[SW] Caching static assets
[SW] Activating service worker...
[App] Offline support initialized
[OfflineStorage] Database opened successfully
[OfflineUI] Offline UI initialized
Bei Offline-Formular:
Form submission error: TypeError: Failed to fetch
[OfflineStorage] Form saved offline: Anwesenheitsliste 1
[OfflineUI] Pending count: 1
[OfflineStorage] Background sync registered
Bei Sync:
[SW] Background sync triggered
[SW] Found 2 pending forms to sync
[OfflineStorage] Submitting form: 1 Anwesenheitsliste
[SW] Successfully synced form: 1
[OfflineUI] Form synced by service worker: 1
[OfflineStorage] Form submitted successfully: 1
- Datei-Uploads: Datei-Uploads in der Anwesenheitsliste funktionieren offline, werden aber mit dem Formular gespeichert
- Browser-Storage-Limits: IndexedDB hat Browser-abhängige Speichergrenzen (typisch 50-100MB)
- Background Sync: Nicht in allen Browsern verfügbar (siehe Browser-Unterstützung)
Problem: Formulare werden nicht synchronisiert
Lösung:
- Überprüfen Sie die Internetverbindung
- Klicken Sie auf das Sync-Symbol in der Kopfzeile
- Öffnen Sie die Browser-Konsole (F12) für Details
Problem: Offline-Status wird nicht angezeigt
Lösung:
- Stellen Sie sicher, dass JavaScript aktiviert ist
- Löschen Sie den Browser-Cache und laden Sie die Seite neu
- Überprüfen Sie, dass der Service Worker registriert ist (F12 → Application → Service Workers)
Problem: Cache wird nicht aktualisiert
Lösung:
- Die App verwendet Cache-Versionierung - alte Caches werden automatisch gelöscht
- Bei Problemen: Browser-Cache manuell löschen
- Service Worker-Update erzwingen: F12 → Application → Service Workers → "Update"
Die Offline-Funktionalität wurde vollständig umgesetzt:
✅ Offline-Cache vorhanden - Wichtige Informationen und Funktionen offline verfügbar
✅ Formulare offline ausfüllbar - Anwesenheitsliste und Einsatzbericht
✅ Lokale Speicherung - IndexedDB speichert Formulardaten sicher
✅ Automatische Synchronisation - Daten werden automatisch gesendet, wenn online
✅ E-Mail-Versand - Nach erfolgreicher Sync werden E-Mails wie gewohnt versendet
✅ Benutzerfreundlich - Klare visuelle Indikatoren und Benachrichtigungen
✅ Sicher - Keine Sicherheitsrisiken, alle Daten lokal
✅ Browser-kompatibel - Funktioniert in allen modernen Browsern
✅ Erweiterbar - Einfach weitere Formulare hinzufügbar
Die PWA ist jetzt vollständig offline-fähig! 🎉
Nach der Installation können Sie sich mit Ihrem Administrator-Benutzer anmelden. Die App bietet einen modernen Login-Bildschirm im Light- und Dark-Mode:
Light Mode
|
Dark Mode
|
Die App unterstützt drei Benutzerrollen:
- Global-Admin: Vollzugriff auf alle Standorte und Systemeinstellungen
- Standort-Admin: Verwaltung eines spezifischen Standorts
- Operator: Zugriff auf Formulare und Ansichten (keine Verwaltung)
Nach erfolgreicher Anmeldung gelangen Sie zum Hauptmenü, das schnellen Zugriff auf alle wichtigen Funktionen bietet:
Light Mode
|
Dark Mode
|
Das Hauptmenü ist in zwei Bereiche unterteilt:
Operator-Funktionen (für alle Benutzer verfügbar):
- 📋 Anwesenheitsliste
- 🚒 Einsatzbericht
- 🚗 Fahrzeuge (Ansicht)
- 📞 Wichtige Telefonnummern
- 🗺️ Online Karte
⚠️ Gefahrenmatrix- ☣️ Gefahrstoffkennzeichen
- 📊 Statistiken
- 📁 Formulardaten
- 🔍 Suche
- 📅 Kalender
- 📱 Sitzungen
- 🔔 Nachricht senden (ntfy)
Administration (nur für Admins sichtbar):
- 📍 Standorte verwalten
- 🔧 Fahrzeuge verwalten
- 👥 Einsatzkräfte verwalten
- 📞 Telefonnummern verwalten
- 👤 Benutzerverwaltung
- 💾 Backup & Export
- 📜 Audit-Log
- ⚙️ Allgemeine Einstellungen (nur Global-Admin)
- ✉️ E-Mail-Einstellungen (nur Global-Admin)
Der Administrationsbereich steht nur Benutzern mit Admin-Rechten (Global-Admin oder Standort-Admin) zur Verfügung.
Die Benutzerverwaltung ermöglicht das Erstellen und Verwalten von App-Benutzern mit verschiedenen Rollen und Zugriff.
- 🌍 Vollzugriff auf das gesamte System
- ✅ Kann alle Einsatzabteilungen/Standorte verwalten
- ✅ Kann alle Benutzer (Global und Standort) erstellen, bearbeiten und löschen
- ✅ Zugriff auf alle Fahrzeuge, Einsatzkräfte und Daten aller Standorte
- ✅ Kann globale Einstellungen (E-Mail, Allgemein) konfigurieren
- ✅ Kann Backup & Export sowie Audit-Log nutzen
- ✅ Kann neue Standorte anlegen und verwalten
- 🔑 Erkennung: Kein Standort zugewiesen (wird als "Global" angezeigt)
- 📍 Eingeschränkter Zugriff auf einen bestimmten Standort
- ✅ Kann nur Benutzer des eigenen Standorts verwalten
- ✅ Kann nur Fahrzeuge des eigenen Standorts verwalten
- ✅ Kann nur Einsatzkräfte des eigenen Standorts verwalten
- ✅ Kann Formulare für den eigenen Standort ausfüllen
- ✅ Kann Statistiken des eigenen Standorts einsehen
- ✅ Kann Backup & Export sowie Audit-Log nutzen (Admin-Rechte)
- ❌ Kein Zugriff auf:
- Globale Einstellungen (E-Mail, Allgemein)
- Andere Standorte und deren Daten
- Anlegen neuer Standorte
- 🔑 Erkennung: Hat einen Standort zugewiesen (z.B. "Willingshausen")
- 📋 Lesezugriff und Formularnutzung
- ✅ Kann Formulare ausfüllen (Anwesenheitsliste, Einsatzbericht inkl. Entwurf)
- ✅ Kann Einsatztools nutzen (Karte, Gefahrenmatrix, Gefahrstoffkennzeichen)
- ✅ Kann Suche, Kalender, Sitzungen und standortbezogene ntfy-Nachrichten nutzen
- ✅ Kann Statistiken einsehen
- ✅ Kann Telefonnummern einsehen
- ❌ Keine Verwaltungsrechte:
- Keine Bearbeitung von Einsatzkräften
- Keine Bearbeitung von Fahrzeugen
- Keine Benutzerverwaltung
- Keine Systemeinstellungen / Backup / Audit-Log
Szenario 1: Einzelne Feuerwehr
- Ein Global-Admin für die Verwaltung
- Mehrere Operators für Formular-Eingabe
Szenario 2: Mehrere Standorte (z.B. Gemeinde mit mehreren Ortswehren)
- Ein Global-Admin für übergreifende Verwaltung
- Je ein Standort-Admin pro Ortswehr (Willingshausen, Leimbach, etc.)
- Operators an jedem Standort für tägliche Arbeit
- Jeder Standort-Admin verwaltet nur seine eigene Ortswehr
- ➕ Benutzer erstellen
- ✏️ Benutzer bearbeiten
- 🔒 Passwort ändern
- 🗑️ Benutzer löschen
- 📍 Standort zuweisen (für Standort-Admins und Operators)
- 👁️ Übersicht aller Benutzer (Global-Admin) oder Standort-Benutzer (Standort-Admin)
Zentrale Verwaltung aller Einsatzabteilungen und Standorte der Feuerwehr.
Verwaltete Informationen:
- Name des Standorts
- Adresse
- E-Mail-Adresse (für standortspezifische E-Mails)
- ntfy Publish-URL (pro Standort)
- Optionaler ntfy Zugangsschlüssel (Bearer-Token)
Funktionen:
- ➕ Standort hinzufügen (nur Global-Admin)
- ✏️ Standort bearbeiten
- 🗑️ Standort löschen (nur Global-Admin)
- 🔍 Übersichtliche Tabellen-Darstellung
Verwendung: Standorte werden bei der Verwaltung von Fahrzeugen, Einsatzkräften und in Formularen als Dropdown zur Verfügung gestellt. Standort-Admins sehen nur ihren zugewiesenen Standort, Global-Admins können alle Standorte verwalten.
Hinweis zu ntfy: Die Zugangsschlüssel werden absichtlich nie im Klartext zurück an das Frontend geliefert. In der Standortliste wird nur angezeigt, ob ein Schlüssel hinterlegt ist.
Zentrale Verwaltung aller Feuerwehrmitglieder mit umfassenden Informationen zu Qualifikationen und Führungsrollen.
Verwaltete Informationen:
- Persönliche Daten: Name
- Qualifikationen:
- AGT (Atemschutzgeräteträger)
- Maschinist
- Sanitäter
- Führungsrollen:
- Truppführer
- Gruppenführer
- Zugführer
- Verbandsführer
- Ausbilder: Kennzeichnung für Übungsleiter
Funktionen:
- ➕ Einsatzkraft hinzufügen
- ✏️ Einsatzkraft bearbeiten
- 🗑️ Einsatzkraft löschen
- 🔍 Übersichtliche Tabellen-Darstellung
Die Einsatzkräfte werden automatisch in allen Formularen (Anwesenheitsliste, Einsatzbericht) zur Auswahl bereitgestellt.
Verwaltung aller Feuerwehrfahrzeuge mit detaillierten Informationen für den Einsatz.
Verwaltete Informationen:
- Standort (Ort)
- Fahrzeugtyp (z.B. TSF-W, LF 16)
- Funkrufname (z.B. Florian Willingshausen 1/44)
Funktionen:
- ➕ Fahrzeug hinzufügen
- ✏️ Fahrzeug bearbeiten
- 🗑️ Fahrzeug löschen
Fahrzeuge werden automatisch in allen Formularen (Einsatzbericht) zur Auswahl bereitgestellt.
Verwaltung wichtiger Notfallkontakte und Telefonnummern für schnellen Zugriff im Einsatzfall.
Verwaltete Informationen:
- Name
- Firma/Organisation
- Funktion
- Telefonnummer
Funktionen:
- ➕ Telefonnummer hinzufügen
- ✏️ Telefonnummer bearbeiten
- 🗑️ Telefonnummer löschen
Die Telefonnummern sind für alle Benutzer (auch Operators) im Hauptmenü sichtbar und können direkt per tel:-Link angerufen werden.
Admin-Bereich für Vollsicherungen und Audit-fähige Exporte.
Vollbackup:
- Momentaufnahme aller verschlüsselten Datendateien unter
data/backups/ - Automatische Rotation (die letzten 15 Vollbackups werden behalten)
- Zusätzlich: Pre-Upgrade-Snapshots bei Schema-Migrationen
Export:
- Entschlüsselte Daten als JSON oder CSV
- Datensätze wählbar (z. B. Personal, Fahrzeuge, Anwesenheit, Einsätze, Audit)
- Ohne Passwort-Hashes und SMTP-Geheimnisse
Hinweis: Nur für Admins. Für Updates siehe Update / Upgrade.
Nachvollziehbare Protokollierung wichtiger Aktionen (Login-relevant, Admin-Änderungen u. a.).
Funktionen:
- Übersicht der letzten Einträge (Aktion, Benutzer, IP, Zeitpunkt)
- Clientseitige Filterung nach Aktion/Benutzer/IP
- Daten verschlüsselt in
data/audit.json
Konfiguration der Feuerwehr-Informationen und des Logos (nur Global-Admin).
Verwaltete Einstellungen:
- Name der Feuerwehr: Wird in E-Mails und PDFs verwendet
- Stadt/Gemeinde: Optional, wird auf separater Zeile angezeigt
- Logo: Upload und Verwaltung des Feuerwehr-Logos für E-Mails und PDFs
Funktionen:
- ✏️ Feuerwehr-Informationen bearbeiten
- 📤 Logo hochladen (PNG, max. 2MB)
- 🗑️ Logo entfernen
- 💾 Einstellungen speichern
Hinweis: Diese Einstellungen sind nur für Global-Admins zugänglich und wirken sich auf alle Standorte aus.
SMTP-Konfiguration für den automatischen Versand von Formular-E-Mails (nur Global-Admin).
Konfigurierbare Parameter:
- SMTP Server: Hostname oder IP-Adresse
- Port: SMTP-Port (z.B. 25, 465, 587)
- Verschlüsselung: Keine, TLS oder SSL
- Authentifizierung: Optional mit Benutzername und Passwort
- Absender: E-Mail-Adresse und Name
- Standard-Empfänger: E-Mail-Adressen für Formular-Versand
Funktionen:
- ✏️ SMTP-Einstellungen bearbeiten
- 🧪 Testmail senden zur Überprüfung
- 💾 Konfiguration speichern
Hinweis: Diese Einstellungen sind nur für Global-Admins zugänglich und gelten für alle Standorte.
Der Operator-Bereich steht allen angemeldeten Benutzern zur Verfügung und bietet Zugriff auf Formulare, Einsatztools und Statistiken.
Vollständiges Formular zur Dokumentation von Übungsdiensten mit automatischer Berechnung und E-Mail-Versand.
Felder:
- 📅 Datum & Uhrzeit (Von/Bis mit automatischer Dauerberechnung)
- 📝 Thema der Übung
- 👨🏫 Übungsleiter (nur Einsatzkräfte mit "Ausbilder"-Kennzeichnung oder Freitext)
- 👥 Teilnehmer (Multi-Select aus Einsatzkräften)
- 🔢 Automatische Teilnehmerzählung
- 💬 Anmerkungen (optional)
- 📎 Datei-Upload (optional, wird per E-Mail mitgeschickt)
Ausgabe:
- ✉️ HTML-E-Mail mit formatiertem Bericht
- 📄 PDF-Anhang
- 💾 Lokale verschlüsselte Speicherung
Umfangreiches Formular basierend auf JetForm-Spezifikation zur vollständigen Dokumentation von Einsätzen.
Basis-Informationen:
- 🚨 Einsatzgrund (max. 150 Zeichen) *
- 📅 Einsatzdatum *
- ⏰ Beginn & Ende (mit automatischer Dauerberechnung) *
- 📍 Einsatzort *
- 👨🚒 Einsatzleiter *
Einsatz-Details:
- 📋 Einsatzlage (Beschreibung) *
- ⚙️ Tätigkeiten der Feuerwehr *
- 🧯 Verbrauchte Mittel (optional)
⚠️ Besondere Vorkommnisse (optional)- 💰 Einsatz kostenpflichtig? (Ja/Nein)
Fahrzeuge & Besatzung:
- 🚒 Eingesetzte Fahrzeuge * (Multi-Select aus Fahrzeug-Verwaltung + Sonstiges)
- 👥 Dynamische Fahrzeugbesatzung (1-20 Einsatzkräfte):
- Funktion (Dropdown: Fahrzeugführer, Melder, Maschinist, Angriffstrupp-, Wassertrupp-, Schlauchtrupp- Führer/Mann)
- Name (aus Einsatzkräfte-Liste)
- Fahrzeug (aus ausgewählten Fahrzeugen)
- Verdienstausfall (Checkbox)
Beteiligte Personen:
- 👤 Dynamische Beteiligte Personen (0-10):
- Beteiligungsart (Verursacher, Geschädigter, Zeuge, Sonstiges)
- Name
- Telefonnummer
- Adresse
- KFZ-Kennzeichen
(*) = Pflichtfelder
Ausgabe:
- ✉️ HTML-E-Mail mit vollständigem Einsatzbericht
- 📄 PDF-Anhang mit Fahrzeugbesatzungs- und Personentabellen
- 💾 Lokale verschlüsselte Speicherung mit eindeutiger ID
- 📝 Entwurf: Autosave in
localStorage– Entwurf laden/verwerfen vor dem Absenden (bei neuen Berichten)
Durchsucht Personal, Fahrzeuge, Übungen und Einsätze standortbezogen.
Funktionen:
- Live-Suche nach Name, Funkrufname, Thema, Ort u. a.
- Gruppierte Trefferlisten mit Sprung in die jeweilige Ansicht
Monatsübersicht über Übungsdienste und Einsätze.
Funktionen:
- Monat vor-/zurückblättern
- Markierung von Übungen und Einsätzen
- Tagesdetail mit Einträgen
Verwaltung von „Angemeldet bleiben“-Geräten (Remember-Me).
Funktionen:
- Übersicht aktiver Geräte (Browser, IP, Gültigkeit)
- Einzelne Sitzungen widerrufen
- Alle eigenen Sitzungen beenden
- Admins können optional Sitzungen aller Benutzer einsehen
Versand kurzer Push-Hinweise über ntfy an den konfigurierten Kanal des Standorts.
Voraussetzung: In der Standortverwaltung Publish-URL (und optional Token) hinterlegen.
Funktionen:
- Nachricht an eigenen Standort oder (mit Berechtigung) an alle Standorte mit ntfy-URL
- Optionaler Titel und TTL
OpenStreetMap-Integration mit Leaflet und leaflet-routing-machine für Routenplanung und Navigation im Einsatz.
Funktionen:
- 📍 Aktuelle Position ermitteln
- 🛣️ Routenberechnung zwischen zwei Adressen (OSRM)
- 📏 Entfernungs- und Zeitanzeige
- 📱 Touch-optimierte Bedienung
- 🗺️ Kartenlayer (OSM / Topo / Satellit)
- 🎯 Interaktive Marker für Start- und Zielpunkte
Interaktive AAAA-CCCC-EEEE Einsatzstellengefahren-Matrix zur systematischen Gefahrenerkennung.
Gefahrenkategorien:
- A - Atemgifte, Angstreaktionen, Ausbreitung, Atomare Gefahren
- C - Chemische Stoffe, Container, Strahlende Stoffe, Elektrizität
- E - Erkrankung/Verletzung, Explosion, Einsturz
- Weitere: Tiere, Gewalt, Wasser, Hitze, Verkehr, Umwelt, Radioaktiv
Funktionen:
- ✓ Antippen zum Markieren identifizierter Gefahren
- 📋 Echtzeit-Zusammenfassung markierter Gefahren
- 🔄 Reset-Funktion
Umfassende Gefahrstoff-Datenbank mit GHS-Piktogrammen, ADR-Klassen und UN-Nummern.
GHS-Piktogramme (9 Symbole):
- Explosiv, Entzündbar, Oxidierend, Druckgase, Ätzend
- Giftig, Gesundheitsschädlich, Gesundheitsgefahr, Umweltgefährlich
ADR-Gefahrgutklassen (1-9):
- Mit detaillierten Beschreibungen
UN-Nummern Suche:
- Datenbank mit 15+ häufigen Gefahrstoffen
- Detailansicht mit:
- Beschreibung
- Gefahren
- Erste-Hilfe-Maßnahmen
- Brandbekämpfung
- Freisetzungsmaßnahmen
- Schnellreferenz-Buttons für häufige Stoffe
Schneller Zugriff auf wichtige Notfallkontakte mit One-Tap-Calling.
Funktionen:
- 📋 Übersichtliche Liste aller Kontakte
- 📱 Direkter Anruf via tel:-Link (One-Tap-Calling)
- 🔍 Anzeige von Name, Firma, Funktion und Telefonnummer
Versendet standortbezogene Push-Benachrichtigungen über ntfy.
Funktionen:
- ✉️ Nachricht mit optionalem Titel senden
- ⏱️ Optionales TTL-Feld (als
X-Ntfy-TTLHeader) - 📍 Versand an den eigenen Standort oder (bei globalen Rechten) an alle Standorte mit hinterlegter ntfy-URL
- 🧾 Detaillierte Rückmeldung pro Standort (gesendet/übersprungen/fehlerhaft)
Berechtigungen:
- Operator/Standort-Admin mit Standortbindung: Versand nur an den eigenen Standort
- Benutzer ohne Standortbindung (z. B. Global-Admin/Operator global): Optionaler Versand an alle Standorte
Umfassende Auswertungen für Übungsdienste und Einsätze auf Abteilungs- und Personenebene.
- 📊 Anzahl Übungsdienste
- ⏱️ Gesamte Übungsstunden
- 🚒 Anzahl Einsätze
- ⏱️ Gesamte Einsatzstunden
- 📅 Jahres-Auswahl per Dropdown
- 👤 Auswahl einzelner Einsatzkraft
- 📊 Detaillierte Aufschlüsselung:
- Teilgenommene Übungen
- Absolvierte Übungsstunden
- Teilgenommene Einsätze
- Absolvierte Einsatzstunden
- Gesamtstunden
Archiv aller eingereichten Formulare mit Übersicht, Detailansicht und Verwaltungsfunktionen.
Verfügbare Daten:
- Anwesenheitslisten: Alle eingereichten Übungsdienste
- Einsatzberichte: Alle dokumentierten Einsätze
Funktionen:
- 📋 Übersicht aller Formulare nach Datum sortiert
- 🔍 Details einzelner Formulare anzeigen
- 📄 PDF-Dokumente anzeigen/herunterladen
- ✉️ Formulare erneut per E-Mail versenden
- 🗑️ Formulare löschen (nur Admins)
- 🔎 Filterung nach Typ (Anwesenheit/Einsatz)
Datenschutz:
- Standort-beschränkte Benutzer sehen nur Formulare ihres Standorts
- Global-Admins haben Zugriff auf alle Formulare
- Alle Daten sind verschlüsselt gespeichert
Die App unterstützt den Versand von Push-Benachrichtigungen über ntfy mit standortbezogener Konfiguration.
- Administration → Standorte verwalten öffnen
- Standort anlegen oder bearbeiten
- ntfy Publish-URL hinterlegen (z. B.
https://ntfy.sh/geheimes-themaoder eigener Server) - Optional ntfy Zugangsschlüssel (Bearer-Token) speichern
- Auf der Seite Nachricht senden (ntfy) Nachricht und optional Titel/TTL eingeben
- Bei entsprechender Berechtigung kann der Versand auf alle Standorte erweitert werden
- Nur Standorte mit hinterlegter ntfy-URL werden berücksichtigt
- Der Versand erfolgt serverseitig über die API
src/php/api/ntfy-send.php ntfy_tokenwird serverseitig gespeichert, aber in API-Antworten nicht im Klartext ausgegeben- Leere oder fehlende ntfy-URLs werden beim Sammelversand übersprungen und als Hinweis zurückgemeldet
Alle Einstellungen werden in config/config.php vorgenommen:
'encryption_key' => 'IHR_32_ZEICHEN_SCHLUESSEL_HIER'Generieren mit:
php -r "echo bin2hex(random_bytes(32));"'email' => [
'from_address' => 'noreply@ihre-feuerwehr.de',
'from_name' => 'Feuerwehr Willingshausen',
'smtp_host' => 'localhost',
'smtp_port' => 25,
'smtp_auth' => false,
'smtp_username' => '',
'smtp_password' => '',
'smtp_secure' => '', // 'tls' oder 'ssl'
]'app_name' => 'Feuerwehr Management',
'timezone' => 'Europe/Berlin',
'session_timeout' => 3600, // 1 Stundedata_dir und backup_dir sollten immer relative Pfade mit __DIR__ verwenden:
'data_dir' => __DIR__ . '/../data',
'backup_dir' => __DIR__ . '/../data/backups',Verwenden Sie KEINE absoluten Pfade wie /var/www/html/data, da diese nicht funktionieren, wenn die Anwendung in einem anderen Verzeichnis installiert wird. Der Installations-Wizard generiert automatisch die korrekten relativen Pfade.
Platzieren Sie Ihr Feuerwehr-Logo unter:
public/assets/logo.png
- Empfohlene Größe: 200x200px oder höher
- Format: PNG mit Transparenz
- Wird verwendet in: E-Mails, PDF-Dokumenten
Für saubere URLs und erhöhte Sicherheit:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Schutz für Konfigurationsdateien
<FilesMatch "config\.php">
Require all denied
</FilesMatch>
</IfModule>
# Verzeichnis-Auflistungen deaktivieren
Options -Indexes
# PHP-Einstellungen
php_value upload_max_filesize 10M
php_value post_max_size 10MEmpfohlene php.ini Einstellungen:
upload_max_filesize = 10M
post_max_size = 10M
max_execution_time = 60
memory_limit = 128M
session.gc_maxlifetime = 3600- AES-256-CBC: Alle JSON-Dateien (Einsatzkräfte, Fahrzeuge, Formulare)
- Unique Initialization Vector (IV): Für jede Verschlüsselung
- OpenSSL: Moderne Kryptographie-Bibliothek
- bcrypt-Hashing: Mit Kostenfaktor 10
- Salted Hashes: Automatisch durch bcrypt
- Keine Klartextspeicherung
- Mindestlänge: 10 Zeichen für neue Passwörter (Create/Update/Reset); bestehende kürzere Hashes bleiben gültig
- Rate-Limiting: Login und Passwort-Reset – 5 Fehlversuche in 15 Minuten → 15 Min. Sperre
- CSRF-Tokens: Pflicht für state-changing API-/Formular-Requests
- Session-Timeout: Automatisches Logout nach Inaktivität
- Secure Cookies: httponly & secure Flags (bei HTTPS)
- Session-Regeneration: Nach Login
- Remember-Me: Widerrufbar über die Sitzungsübersicht
- XSS-Schutz:
htmlspecialchars()für alle Ausgaben - Command Injection Prevention: Whitelisting +
escapeshellarg() - Upload MIME-Checks: Dateityp-Prüfung per
finfo(u. a. Anwesenheitsliste, Logo) - SQL Injection: Nicht relevant (keine SQL-Datenbank)
- Verschlüsselte Speicherung: Alle sensiblen Daten
- Sicheres Entschlüsseln: Bei falschem Key werden Dateien nicht geleert/überschrieben
- Installer-Sperre:
install.phpnach erfolgreicher Installation deaktiviert - SMTP-Passwort: Wird im Formular nicht im Klartext zurückgegeben (Platzhalter)
- Beschränkte Berechtigungen:
data/Verzeichnis: 700config/config.php: 600
- Web-Zugriff verweigert:
data/.htaccessblockiert direkten HTTP-Zugriff auf alle Datendateien - Fallback-Schutz:
data/index.phpbeendet Ausführung, wenn.htaccessnicht greift
Für maximale Sicherheit sollte das data/-Verzeichnis außerhalb des Web-Document-Root platziert werden, sodass der Webserver es gar nicht erst ausliefern kann.
Beispiel-Konfiguration:
-
Verzeichnis außerhalb des Document Root erstellen:
sudo mkdir -p /var/feuerwehr/data sudo chown www-data:www-data /var/feuerwehr/data sudo chmod 700 /var/feuerwehr/data
-
config/config.phpanpassen:'data_dir' => '/var/feuerwehr/data',
-
Das
data/-Verzeichnis im App-Root kann dann leer bleiben (oder entfernt werden, da es nicht mehr genutzt wird).
- Ändern Sie Standard-Passwörter sofort
- Verwenden Sie HTTPS in Produktionsumgebungen
- Regelmäßige Backups der
data/undconfig/Verzeichnisse (auch über Admin → Backup & Export) - Firewall-Regeln für Admin-Bereich
- Regelmäßige Updates von PHP und Abhängigkeiten – siehe Update / Upgrade
- Monitoring über
/health.phpund Log-Dateien
Wenn Sie nach dem Installations-Wizard die Fehlermeldung "Ungültiger Benutzername oder Passwort" erhalten, gibt es verschiedene mögliche Ursachen.
- ❌ Session-Verzeichnis nicht beschreibbar (Nginx/PHP-FPM)
- ❌ Falsche Dateiberechtigungen für config/ oder data/
- ❌ Config-Datei wurde nicht erstellt
- ❌ Browser-Cookies blockiert
# Session-Verzeichnis Berechtigungen
sudo chown www-data:www-data /var/lib/php/sessions/
sudo chmod 733 /var/lib/php/sessions/
# App-Verzeichnis Berechtigungen
sudo chown -R www-data:www-data /pfad/zur/app/config /pfad/zur/app/data
sudo chmod 755 /pfad/zur/app/config /pfad/zur/app/data
# PHP-FPM neu starten
sudo systemctl restart php8.4-fpm
# Browser-Cookies löschen und erneut versuchenÖffentlicher Status-Endpunkt ohne Login:
GET /health.php
Liefert JSON mit Prüfungen u. a. zu Config, Encryption-Key, Schreibbarkeit von data/ und Backup-Verzeichnis. Nützlich nach Updates und für Monitoring.
Minimales Test-Suite ohne PHPUnit:
php tests/run.phpPrüft u. a. Verschlüsselung, Auth-Helfer und AppUpgrade-Migrationen in einer temporären Umgebung.
- PHP 7.4+: Hauptprogrammiersprache
- OpenSSL: Verschlüsselung (AES-256-CBC)
- JSON: Datenspeicherung (verschlüsselt)
- Sessions: Authentifizierung & Autorisierung
- upgrade.php: Idempotente Schema-Migrationen (
AppUpgrade, aktuell v2) - health.php: Runtime-Health-Check
- tests/run.php: CLI-Testläufer
- HTML5: Semantisches Markup
- CSS3: Responsive Design, Flexbox, Grid
- JavaScript (Vanilla): Keine Frameworks, moderne ES6+ Features
- Material Design Icons: Icon-Set
- Service Worker: Offline-Funktionalität & Caching
- Web App Manifest: Installierbarkeit
- Cache API: Asset-Caching
- IndexedDB: Offline-Formulare (implementiert)
- Leaflet + leaflet-routing-machine: Karten & Routen
- OpenStreetMap: Kartenmaterial (Raster-Tiles)
- OSRM: Routing-API (Open Source Routing Machine)
feuerwehr-app/
├── config/ # Konfigurationsdateien
│ ├── config.php # Hauptkonfiguration (nicht überschreiben!)
│ └── config.example.php
├── data/ # Verschlüsselte JSON-Dateien
│ ├── users.json
│ ├── personnel.json
│ ├── vehicles.json
│ ├── attendance.json
│ ├── missions.json
│ ├── phone_numbers.json
│ ├── audit.json
│ ├── app_meta.json # Schema-Version nach Upgrade
│ └── backups/ # Vollbackups & pre_upgrade_* Snapshots
├── public/ # Öffentliche Assets
│ ├── css/
│ ├── js/
│ ├── icons/ # PWA Icons
│ └── assets/ # Logo, Bilder
├── src/php/ # PHP Backend
│ ├── api/ # REST API Endpoints
│ ├── forms/ # Formular-Handler
│ ├── pages/ # Seiten-Templates
│ ├── auth.php # Authentifizierung
│ ├── datastore.php # Datenverwaltung
│ ├── email_pdf.php # E-Mail & PDF
│ ├── encryption.php # AES-Verschlüsselung
│ └── upgrade.php # Auto-Migration
├── tests/
│ └── run.php # Test Suite
├── health.php # Health-Check
├── index.php # Haupteinstiegspunkt
├── manifest.json # PWA Manifest
└── sw.js # Service Worker
Das Design orientiert sich an der alarm-messenger App:
- Farbschema: Rot (Feuerwehr-Thema) mit Akzenten
- Light/Dark Mode: Manuell umschaltbar; ohne gespeicherte Wahl Default aus
prefers-color-scheme - Mobile First: Primär für Smartphone-Nutzung optimiert
- Touch-freundlich: Große Buttons, ausreichend Abstand
- Material Design: Moderne, intuitive UI-Komponenten
- Konsistenz: Einheitliche Bedienung über alle Bereiche
MIT License
Copyright (c) 2025–2026 Freiwillige Feuerwehr Willingshausen
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- Issues erstellen: GitHub Issues
- Dokumentation lesen: Diese README-Datei
- Code-Beispiele: Siehe
config/config.example.php
Geplante / offene Features:
- Export-Funktionen (JSON/CSV) – umgesetzt unter Backup & Export
- Kalender-Integration – Monatsübersicht Übungen/Einsätze
- [~] Push-Benachrichtigungen – teilweise: ntfy-Versand aus der App (kein In-App-Push-Empfang)
- Multi-Mandanten-Fähigkeit
Pull Requests sind willkommen! Bitte erstellen Sie zunächst ein Issue für größere Änderungen.
Entwickelt für die Freiwillige Feuerwehr Willingshausen 🚒
Made with ❤️ in Germany



























