🎉 Optimierung der RDP-Server-Installation und Firewall-Konfiguration im Backend 🛠️. Vereinfachte Installation von xrdp und XFCE, verbesserte Fehlerbehandlung und Validierung der Firewall-Einstellungen. Aktualisierte Logik zur Überprüfung des Dienststatus und zur Konfiguration von Netzwerkquellen.

This commit is contained in:
2025-06-01 15:31:04 +02:00
parent 7b37d54e59
commit fc6ba6e87e
9 changed files with 1399 additions and 356 deletions

View File

@@ -2,18 +2,19 @@
## Übersicht der Änderungen
Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges, benutzerfreundliches Setup-System.
Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges, benutzerfreundliches Setup-System mit **vereinfachten 2 Installationsmodi**.
## 🔄 Strukturelle Änderungen
### Neue Dateien
- **`setup.sh`** - Konsolidiertes Hauptinstallationsskript mit Menüführung
- **`setup.sh`** - Konsolidiertes Hauptinstallationsskript mit **2 Hauptoptionen**
- **`systemd/`** - Neues Verzeichnis für alle systemd-Service-Dateien
- `systemd/myp-https.service`
- `systemd/myp-kiosk.service`
- `systemd/kiosk-watchdog.service`
- `systemd/kiosk-watchdog-python.service`
- `systemd/myp-firewall.service` - **Erweiterte Firewall-Konfiguration**
- **`docs/SETUP_ANLEITUNG.md`** - Detaillierte Anleitung für das neue Setup-System
### Entfernte Dateien
@@ -27,49 +28,50 @@ Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges,
- **`README.md`** - Vollständig überarbeitet für neues Setup-System
- **Version erhöht auf 4.0.0**
## 🚀 Neue Features
## 🔄 Neue Features
### Menügeführte Installation
### Vereinfachte Installation
Das neue `setup.sh` bietet **nur 2 Hauptoptionen** für maximale Benutzerfreundlichkeit:
Das neue `setup.sh` bietet vier verschiedene Installationsmodi:
1. **Abhängigkeiten installieren für manuelles Testen**
- Vollständige Systemvorbereitung
- Alle Abhängigkeiten installiert
- Anwendung deployed und getestet
- Bereit für manuelle Entwicklung
- **Ideal für**: Entwicklung, Tests, Debugging
1. **Nur Abhängigkeiten installieren**
2. **Vollständige Kiosk-Installation mit Remote-Zugang**
- **Automatischer Kiosk-Modus** beim Boot
- **SSH-Zugang**: `user:raspberry`
- **RDP-Zugang**: `root:744563017196A` mit XFCE
- **Erweiterte Firewall**: 192.168.0.0/16 + localhost + m040tbaraspi001
- **Automatischer Login** und Browser-Start
- **Ideal für**: Produktionsumgebungen, finale Deployment
- Python, Node.js, SSL-Zertifikate
- Anwendungsdeployment
- Minimaler Funktionstest
- Ideal für Entwicklung
2. **Finale Kiosk-Installation**
### Erweiterte Firewall-Konfiguration
- **Netzwerk-Bereich**: `192.168.0.0/16` (erweitert von /24)
- **Localhost-Support**: IPv4 und IPv6
- **Hostname-Integration**: Automatische Erkennung lokaler und Remote-Hostnames
- **Spezifischer Remote-Host**: `m040tbaraspi001`
- **Automatische Konfiguration** beim Systemstart
- Vollständige Produktionsinstallation
- Desktop-Environment-Entfernung
- Kiosk-Benutzer-Setup
- Service-Aktivierung
3. **Nur Services installieren**
### Automatischer Kiosk-Start
- **Vollautomatische Konfiguration** ohne manuelle Eingriffe
- **X-Server-Autostart** beim Login
- **Browser-Autostart** mit HTTPS-Backend-Erkennung
- **Robuste Fehlerbehandlung** und Fallback-Mechanismen
- **Optimierte Performance** für Kiosk-Umgebungen
- Service-Updates ohne Systemänderungen
- Systemd-Konfiguration neu laden
- Optional: Services aktivieren
4. **System-Test**
- HTTPS-Verbindungstest
- SSL-Zertifikat-Validierung
- Service-Status-Überprüfung
- Systemressourcen-Monitoring
### Verbesserte Modularität
- **Getrennte Installationsphasen** für bessere Kontrolle
- **Fallback-Mechanismen** für robuste Installation
- **Intelligente Abhängigkeitserkennung**
- **Automatische Fehlerbehandlung**
### Erweiterte Logging-Funktionen
- **Farbkodierte Ausgabe** für bessere Lesbarkeit
- **Detailliertes Installationslog** (`/var/log/myp-install.log`)
- **Strukturierte Fehlermeldungen**
- **Fortschrittsanzeigen**
### Erweiterte Netzwerk-Sicherheit
- **IPv6 vollständig deaktiviert** auf allen Ebenen (GRUB, Kernel, Firewall)
- **IP-Spoofing-Schutz** mit Reverse Path Filtering
- **SYN-Flood-Schutz** mit optimierten TCP-Einstellungen
- **DDoS-Abwehr** durch Broadcast-Ping-Schutz
- **TCP-RFC-Compliance** verhindert aggressive Paketwiederholungen
- **Optimierte Netzwerk-Performance** durch TCP-Window-Skalierung
- **Anti-Fingerprinting** durch deaktivierte TCP-Timestamps
- **Verdächtige Pakete werden geloggt** (Martian-Pakete)
- **Paketweiterleitung deaktiviert** (kein Router-Verhalten)
## 🔧 Technische Verbesserungen

View File

@@ -1 +1,471 @@
# MYP Druckerverwaltung - Debian/Linux Kiosk-Installation
## Übersicht
Diese Anleitung beschreibt die Installation der MYP Druckerverwaltung als vollständigen Kiosk-Modus auf Debian/Linux-Systemen (insbesondere Raspberry Pi OS). Das System wird für den Desktop-Modus optimiert und läuft mit HTTPS auf Port 443.
## Systemanforderungen
### Zielplattform
- **Debian/Raspbian** (Raspberry Pi OS empfohlen)
- **Kein Windows-Support** - Windows dient nur als Entwicklungsumgebung
- **Desktop-Modus** - Responsiv, aber keine Touch-Optimierung
- **Chromium-Kiosk-Modus** für die Anzeige
### Hardware-Anforderungen
- Raspberry Pi 4 (empfohlen) oder vergleichbares Debian-System
- Mindestens 2GB RAM
- 16GB SD-Karte oder größer
- Netzwerkverbindung (Ethernet oder WLAN)
- Monitor mit HDMI-Anschluss
## Schnellinstallation
### 1. Repository klonen
```bash
git clone <repository-url>
cd backend
```
### 2. Installationsskript ausführen
```bash
sudo chmod +x combined.sh
sudo ./combined.sh
```
### 3. Installationsoptionen
Das Skript bietet folgende Optionen:
1. **System-Abhängigkeiten installieren**
- Python 3, Node.js, npm, SSL-Zertifikate
- Verwendet `pip install --break-system-packages`
- Kein virtuelles Environment
2. **VOLLSTÄNDIGER KIOSK-MODUS (HTTPS Port 443)**
- ⚠️ **ENTFERNT ALLE DESKTOP-ENVIRONMENTS!**
- Installiert minimale X11-Umgebung
- Erstellt SSL-Zertifikate automatisch
- Konfiguriert Autologin und Chromium-Kiosk
- **NEUSTART ERFORDERLICH!**
## Detaillierte Installation
### Schritt 1: System vorbereiten
```bash
# Als Root ausführen
sudo su
# System aktualisieren
apt-get update && apt-get upgrade -y
# Grundlegende Tools installieren
apt-get install -y curl wget git nano htop
```
### Schritt 2: Abhängigkeiten installieren
Das Installationsskript installiert automatisch:
#### Python-Umgebung
- Python 3.x
- pip (neueste Version)
- Entwicklungstools (build-essential, libssl-dev, etc.)
#### Node.js und npm
- Node.js LTS
- npm (neueste kompatible Version)
- TailwindCSS und Frontend-Dependencies
#### Python-Pakete
```bash
# Automatisch installiert mit --break-system-packages
Flask==3.1.1
Flask-Login==0.6.3
Flask-WTF==1.2.1
SQLAlchemy==2.0.36
bcrypt==4.2.1
cryptography==44.0.0
Werkzeug==3.1.3
requests==2.32.3
psutil==6.1.1
gunicorn==23.0.0
```
### Schritt 3: SSL-Zertifikate
#### Automatische Generierung
Das System generiert automatisch selbstsignierte SSL-Zertifikate:
```bash
# Zertifikate werden erstellt in:
/opt/myp/certs/localhost/localhost.crt
/opt/myp/certs/localhost/localhost.key
# Automatisch zum System CA-Store hinzugefügt:
/usr/local/share/ca-certificates/localhost.crt
```
#### Manuelle Zertifikat-Generierung
```bash
# Falls erforderlich, manuell generieren:
sudo python3 -c "
import sys; sys.path.insert(0, '/opt/myp')
from utils.ssl_config import ensure_ssl_certificates
ensure_ssl_certificates('/opt/myp', True)
"
```
### Schritt 4: Systemd-Services
#### HTTPS Backend-Service
```bash
# Service-Datei: /etc/systemd/system/myp-https.service
sudo systemctl enable myp-https.service
sudo systemctl start myp-https.service
# Status prüfen
sudo systemctl status myp-https.service
```
#### Kiosk-Browser-Service
```bash
# Service-Datei: /etc/systemd/system/myp-kiosk.service
sudo systemctl enable myp-kiosk.service
# Wird automatisch nach Autologin gestartet
```
### Schritt 5: Kiosk-Konfiguration
#### Autologin einrichten
```bash
# Getty-Service für automatischen Login
# Konfiguration in: /etc/systemd/system/getty@tty1.service.d/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin kiosk --noclear %I $TERM
```
#### Browser-Konfiguration
```bash
# Chromium-Kiosk startet automatisch mit:
# - Vollbildmodus
# - SSL-Zertifikat-Ignorierung für localhost
# - Optimierte Performance-Einstellungen
# - URL: https://localhost:443
```
## Konfiguration
### Netzwerk-Zugriff
#### HTTPS-URLs
- **Lokal**: `https://localhost:443`
- **Netzwerk**: `https://<raspberry-pi-ip>:443`
#### Firewall (falls aktiviert)
```bash
# Port 443 öffnen
sudo ufw allow 443/tcp
```
### SSL-Zertifikat für Netzwerk-Zugriff
Für Zugriff von anderen Geräten im Netzwerk:
```bash
# Zertifikat mit IP-Adresse generieren
sudo python3 -c "
import sys; sys.path.insert(0, '/opt/myp')
from utils.ssl_config import SSLCertificateManager
manager = SSLCertificateManager('/opt/myp')
manager.generate_ssl_certificate(force_regenerate=True)
"
```
### Anwendungskonfiguration
#### Datenbank
- SQLite-Datenbank in `/opt/myp/database/`
- Automatische Backups in `/opt/myp/database/backups/`
#### Logs
- Anwendungslogs in `/opt/myp/logs/`
- Systemd-Logs: `journalctl -u myp-https -f`
#### Uploads
- Dateien in `/opt/myp/uploads/`
- Temporäre Dateien in `/opt/myp/uploads/temp/`
## Wartung und Überwachung
### Service-Management
```bash
# HTTPS-Service
sudo systemctl start myp-https.service
sudo systemctl stop myp-https.service
sudo systemctl restart myp-https.service
sudo systemctl status myp-https.service
# Kiosk-Service
sudo systemctl start myp-kiosk.service
sudo systemctl stop myp-kiosk.service
sudo systemctl status myp-kiosk.service
# Logs anzeigen
sudo journalctl -u myp-https -f
sudo journalctl -u myp-kiosk -f
```
### Watchdog-Service
Der Watchdog-Service überwacht automatisch:
- HTTPS Backend-Erreichbarkeit
- SSL-Zertifikat-Gültigkeit
- Kiosk-Browser-Status
- Systemressourcen
```bash
# Watchdog-Service verwalten
sudo systemctl enable kiosk-watchdog.service
sudo systemctl start kiosk-watchdog.service
# Watchdog-Logs
sudo tail -f /var/log/kiosk-watchdog.log
```
### System-Tests
```bash
# HTTPS-Erreichbarkeit testen
curl -k https://localhost:443
# SSL-Zertifikat prüfen
openssl s_client -connect localhost:443 -servername localhost
# Service-Status prüfen
sudo systemctl is-active myp-https
sudo systemctl is-active myp-kiosk
```
## Fehlerbehebung
### Häufige Probleme
#### 1. HTTPS nicht erreichbar
```bash
# Service-Status prüfen
sudo systemctl status myp-https.service
# Logs überprüfen
sudo journalctl -u myp-https -n 50
# SSL-Zertifikate neu generieren
sudo python3 /opt/myp/utils/ssl_config.py /opt/myp --force
sudo systemctl restart myp-https.service
```
#### 2. Kiosk-Browser startet nicht
```bash
# X-Server-Status prüfen
ps aux | grep X
# Kiosk-User-Session prüfen
sudo su - kiosk
echo $DISPLAY
# Browser manuell starten
DISPLAY=:0 chromium --kiosk https://localhost:443
```
#### 3. SSL-Zertifikat-Fehler
```bash
# Zertifikat-Gültigkeit prüfen
openssl x509 -in /opt/myp/certs/localhost/localhost.crt -text -noout
# Zertifikat neu generieren
sudo rm -rf /opt/myp/certs/localhost/
sudo python3 /opt/myp/utils/ssl_config.py /opt/myp --force
sudo systemctl restart myp-https.service
```
#### 4. Hohe Speichernutzung
```bash
# Speicher-Status prüfen
free -h
# Browser-Cache leeren
sudo rm -rf /home/kiosk/.chromium-kiosk/Default/Cache/*
sudo rm -rf /home/kiosk/.cache/*
# System-Cache leeren
sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
```
### Log-Dateien
#### Anwendungslogs
```bash
# Hauptanwendung
tail -f /opt/myp/logs/app/app.log
# Authentifizierung
tail -f /opt/myp/logs/auth/auth.log
# Drucker-Management
tail -f /opt/myp/logs/printers/printers.log
# Job-Management
tail -f /opt/myp/logs/jobs/jobs.log
```
#### Systemlogs
```bash
# HTTPS-Service
sudo journalctl -u myp-https -f
# Kiosk-Service
sudo journalctl -u myp-kiosk -f
# Watchdog-Service
sudo tail -f /var/log/kiosk-watchdog.log
# System-Boot
sudo journalctl -b
```
## Sicherheit
### SSL/TLS-Konfiguration
- TLS 1.2+ erforderlich
- Starke Cipher-Suites
- Selbstsignierte Zertifikate für localhost
- Automatische Zertifikat-Erneuerung
### Netzwerk-Sicherheit
- HTTPS-only (kein HTTP)
- CSRF-Schutz aktiviert
- Session-Management
- Rate-Limiting
### System-Sicherheit
- Minimale X11-Umgebung
- Kiosk-User ohne Sudo-Rechte
- Systemd-Service-Isolation
- Read-only Systempartitionen (optional)
## Performance-Optimierung
### Browser-Optimierung
```bash
# Chromium-Flags für bessere Performance
--disable-background-mode
--disable-dev-shm-usage
--memory-pressure-off
--max_old_space_size=512
--disable-background-timer-throttling
```
### System-Optimierung
```bash
# GPU-Memory für Raspberry Pi
echo "gpu_mem=128" >> /boot/config.txt
# Swap-Datei optimieren
sudo dphys-swapfile swapoff
sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=512/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
```
### Datenbank-Optimierung
```bash
# SQLite-Optimierungen in der Anwendung
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
PRAGMA cache_size=10000;
PRAGMA temp_store=memory;
```
## Backup und Wiederherstellung
### Automatische Backups
```bash
# Datenbank-Backups
/opt/myp/database/backups/
# Konfiguration sichern
sudo tar -czf /opt/myp/backups/config-$(date +%Y%m%d).tar.gz \
/opt/myp/config/ \
/etc/systemd/system/myp-*.service \
/home/kiosk/.xinitrc \
/home/kiosk/.bashrc
```
### Wiederherstellung
```bash
# System neu installieren
sudo ./combined.sh
# Datenbank wiederherstellen
sudo cp backup.db /opt/myp/database/app.db
sudo chown root:root /opt/myp/database/app.db
# Services neustarten
sudo systemctl restart myp-https.service
```
## Updates
### Anwendungs-Updates
```bash
# Repository aktualisieren
cd /opt/myp
git pull origin main
# Dependencies aktualisieren
sudo pip3 install -r requirements.txt --break-system-packages --upgrade
sudo npm install
# Services neustarten
sudo systemctl restart myp-https.service
```
### System-Updates
```bash
# System aktualisieren
sudo apt-get update && sudo apt-get upgrade -y
# Nach Updates neustarten
sudo reboot
```
## Support und Dokumentation
### Weitere Dokumentation
- `docs/API_DOCUMENTATION.md` - API-Referenz
- `docs/CONFIGURATION.md` - Konfigurationsoptionen
- `docs/TROUBLESHOOTING.md` - Erweiterte Fehlerbehebung
### Logs für Support
```bash
# Support-Informationen sammeln
sudo ./combined.sh # Option 5: System-Tests
# Log-Bundle erstellen
sudo tar -czf myp-logs-$(date +%Y%m%d).tar.gz \
/opt/myp/logs/ \
/var/log/kiosk-watchdog.log \
/var/log/myp-install.log
```
---
**Version**: 3.6.1
**Letzte Aktualisierung**: Automatisch generiert
**Plattform**: Debian/Linux (Raspberry Pi OS)
**Modus**: HTTPS Kiosk (Port 443)

View File

@@ -1 +1,206 @@
# Log-Funktionalität Implementierung
## Problembeschreibung
Die System-Logs im Admin-Dashboard wurden nicht geladen. Die JavaScript-Funktionalität fehlte und die API-Endpunkte waren unvollständig implementiert.
## Durchgeführte Fixes
### 1. API-Endpunkte Implementiert
#### `/api/admin/logs` (GET)
- **Zweck**: Lädt System-Logs für das Admin-Dashboard
- **Features**:
- Multi-Format Log-Parser (unterstützt verschiedene Log-Formate)
- Level-Filter (ERROR, WARNING, INFO, DEBUG, CRITICAL, ALL)
- Suchfunktion in Log-Nachrichten
- Component-Filter nach Log-Kategorien
- Paginierung (limit/offset)
- Automatische Duplikat-Entfernung
- Sortierung nach Timestamp (neueste zuerst)
#### `/api/admin/logs/export` (GET)
- **Zweck**: Exportiert alle Log-Dateien als ZIP-Archiv
- **Features**:
- Sammelt alle .log Dateien aus dem logs-Verzeichnis
- Erstellt komprimierte ZIP-Datei
- Relativer Pfad-Erhalt in der ZIP-Struktur
- Automatische Dateinamen mit Timestamp
### 2. JavaScript-Funktionalität
#### Admin-Dashboard Logs-Management
```javascript
// Neue Funktionen hinzugefügt:
- loadLogs(level = null) // Lädt Logs mit Filter
- displayLogs(logs) // Zeigt Logs formatiert an
- formatLogTimestamp(timestamp) // Formatiert Zeitstempel
- escapeHtml(text) // HTML-Escape für Sicherheit
- exportLogs() // Exportiert Logs als Datei
```
#### Event-Handler
- `#refresh-logs-btn` - Logs manuell aktualisieren
- `#export-logs-btn` - Logs exportieren
- `#log-level-filter` - Filter nach Log-Level
#### Automatisches Laden
- Logs werden automatisch geladen wenn:
- URL-Parameter `tab=logs` gesetzt ist
- Das Logs-Container-Element sichtbar ist
- Die Seite das erste Mal geladen wird und der Logs-Tab aktiv ist
### 3. HTML-Template Fixes
#### Progress Bar Fixes
- Entfernt problematische Jinja2-Style-Attribute aus HTML
- Verlagert Style-Definitionen in separaten `<style>`-Block
- Behebt Linter-Fehler in Zeilen 121, 147, 173, 206, 455
#### Log-Display Komponenten
- Verbesserte Log-Anzeige mit Level-spezifischen Farben
- Icons für verschiedene Log-Level (❌, ⚠️, , 🔍, 🚨)
- Responsive Layout für Log-Einträge
- Hover-Effekte und Transitionen
### 4. Log-Format Unterstützung
#### Format 1: Standard Format
```
2025-06-01 00:34:08 - logger_name - [LEVEL] MESSAGE
```
#### Format 2: Bracket Format
```
[2025-06-01 00:34:08] LEVEL: MESSAGE
```
#### Format 3: Einfaches Format
```
MESSAGE (als INFO-Level behandelt)
```
### 5. Error Handling & Performance
#### Robuste Fehlerbehandlung
- Try-catch für jeden Log-Parser-Schritt
- Fallback bei nicht lesbaren Dateien
- Graceful Degradation bei API-Fehlern
#### Performance-Optimierungen
- Maximal 10 Log-Dateien verarbeitet
- Maximal 500 Zeilen pro Datei
- Maximal 50 Einträge pro Datei
- UTF-8 Encoding mit Fehler-Ignorierung
### 6. UI/UX Verbesserungen
#### Loading States
- Spinner während des Ladens
- Informative Fehlermeldungen
- "Erneut versuchen" Button bei Fehlern
#### Responsive Design
- Mobile-optimierte Log-Anzeige
- Hover-Effekte und Animationen
- Dark-Mode Unterstützung
#### Accessibility
- ARIA-Labels für Screen-Reader
- Tastatur-Navigation
- Semantische HTML-Struktur
## Verwendung
### Admin-Dashboard Zugriff
1. Als Administrator einloggen
2. Zum Admin-Dashboard navigieren
3. "Logs" Tab auswählen
4. Logs werden automatisch geladen
### Filter und Export
- **Filter nach Level**: Dropdown-Menü verwenden
- **Aktualisieren**: "Aktualisieren" Button klicken
- **Export**: "Export" Button für ZIP-Download
### API-Direktzugriff
```javascript
// Logs abrufen
fetch('/api/admin/logs?level=ERROR&limit=50')
.then(response => response.json())
.then(data => console.log(data.logs));
// Logs exportieren
window.location.href = '/api/admin/logs/export';
```
## Technische Details
### Abhängigkeiten
- **Frontend**: Admin-unified.js, Tailwind CSS
- **Backend**: Flask, SQLAlchemy, Python logging
- **Tools**: zipfile, glob, datetime
### Sicherheit
- Admin-Berechtigung erforderlich (`@admin_required`)
- CSRF-Token Validierung
- HTML-Escape für Log-Inhalte
- Input-Sanitization für Filter-Parameter
### Logs-Verzeichnis Struktur
```
backend/logs/
├── app/
├── auth/
├── jobs/
├── printers/
├── scheduler/
├── errors/
└── *.log (direkte Log-Dateien)
```
## Testing
### Manuelle Tests
1. ✅ Logs-Tab Laden
2. ✅ Level-Filter Funktionalität
3. ✅ Export-Funktionalität
4. ✅ Error-Handling bei fehlenden Logs
5. ✅ Auto-Loading bei Tab-Switch
### Browser-Kompatibilität
- ✅ Chrome/Edge (moderne Versionen)
- ✅ Firefox (moderne Versionen)
- ✅ Safari (moderne Versionen)
- ✅ Mobile Browser
## Bekannte Limitierungen
1. **Performance**: Bei sehr großen Log-Dateien (>10MB) kann das Laden langsam sein
2. **Memory**: Alle Logs werden im Speicher verarbeitet
3. **Real-time**: Logs werden nicht in Echtzeit aktualisiert (manueller Refresh nötig)
## Zukünftige Verbesserungen
1. **WebSocket Integration** für Real-time Log-Updates
2. **Paginierung UI** für bessere Navigation
3. **Erweiterte Filter** (Datum, Komponente, Benutzer)
4. **Log-Archivierung** und automatische Bereinigung
5. **Search Highlighting** in Log-Inhalten
## Changelog
**2025-06-01 - Initial Implementation**
- ✅ API-Endpunkte implementiert
- ✅ JavaScript-Funktionalität hinzugefügt
- ✅ HTML-Template Fixes
- ✅ Error-Handling verbessert
- ✅ Performance-Optimierungen
- ✅ UI/UX Verbesserungen
## Support
Bei Problemen mit der Log-Funktionalität:
1. Browser-Konsole auf Fehler prüfen
2. Netzwerk-Tab für API-Anfragen überprüfen
3. Server-Logs für Backend-Fehler analysieren
4. Admin-Berechtigung verifizieren

View File

@@ -27,9 +27,9 @@ Das neue konsolidierte `setup.sh` Skript ersetzt alle bisherigen Installationssk
## Installationsmodi
### 1. Nur Abhängigkeiten installieren
### 1. Abhängigkeiten installieren für manuelles Testen
**Zweck**: System vorbereiten ohne Kiosk-Modus zu aktivieren
**Zweck**: System vollständig vorbereiten für manuelle Tests und Entwicklung
**Was wird installiert**:
- Python 3 und pip
@@ -49,21 +49,31 @@ sudo ./setup.sh
**Ideal für**:
- Entwicklungsumgebungen
- Erste Installation und Tests
- Systeme ohne Kiosk-Anforderungen
- Manuelle Tests und Debugging
- Systeme ohne automatischen Kiosk-Modus
- Erste Installation und Validierung
### 2. Finale Kiosk-Installation
**Nach der Installation**:
- HTTPS-Backend manuell starten: `cd /opt/myp && python3 app.py`
- System bereit für Entwicklung und Tests
**Zweck**: Vollständige Kiosk-Modus-Konfiguration
### 2. Vollständige Kiosk-Installation mit Remote-Zugang
**Zweck**: Komplette Produktionsinstallation mit automatischem Kiosk-Modus
**Was wird konfiguriert**:
- Alle Abhängigkeiten (falls noch nicht installiert)
- Desktop-Environments entfernen
- Alle Abhängigkeiten (automatisch falls noch nicht installiert)
- Desktop-Environments vollständig entfernen
- Minimale X11-Umgebung installieren
- Kiosk-Benutzer erstellen
- Automatischen Login konfigurieren
- **SSH-Server** mit Benutzer `user:raspberry`
- **RDP-Server (xrdp)** mit TLS für `root:744563017196A`
- **XFCE Desktop-Umgebung** für RDP-Sessions
- **firewalld** mit erweiterten Netzwerk-Regeln
- Kiosk-Benutzer erstellen und konfigurieren
- **Automatischen Login** auf tty1 konfigurieren
- **Automatischen Kiosk-Start** beim Login einrichten
- Systemd-Services installieren und aktivieren
- System-Test durchführen
- Umfassende System-Tests
- Alte Dateien aufräumen
**Verwendung**:
@@ -75,48 +85,13 @@ sudo ./setup.sh
**Ideal für**:
- Produktionsumgebungen
- Dedizierte Kiosk-Systeme
- Finale Deployment
- Finale Deployment mit Remote-Administration
- Vollautomatische Systeme
### 3. Nur Services installieren
**Zweck**: Systemd-Services aktualisieren ohne Systemänderungen
**Was wird gemacht**:
- Service-Dateien aus `systemd/` nach `/etc/systemd/system/` kopieren
- systemd-Konfiguration neu laden
- Optional: Services aktivieren und starten
**Verwendung**:
```bash
sudo ./setup.sh
# Wähle Option 3
```
**Ideal für**:
- Service-Updates
- Konfigurationsänderungen
- Wartung bestehender Installationen
### 4. System-Test
**Zweck**: Funktionalität der Installation überprüfen
**Was wird getestet**:
- HTTPS-Verbindung zu localhost:443
- SSL-Zertifikat-Gültigkeit
- Service-Status aller systemd-Services
- Systemressourcen
**Verwendung**:
```bash
sudo ./setup.sh
# Wähle Option 4
```
**Ideal für**:
- Fehlerdiagnose
- Wartung
- Regelmäßige Systemprüfungen
**Nach der Installation**:
- **Neustart erforderlich**: `sudo reboot`
- Automatischer Kiosk-Modus beim Boot
- Remote-Zugang verfügbar über SSH und RDP
## Systemd-Services
@@ -145,6 +120,17 @@ sudo ./setup.sh
- **Zweck**: Python-basierte Überwachung
- **Ergänzung**: Zusätzliche Überwachungsfunktionen
### myp-firewall.service
- **Zweck**: Automatische Firewall-Konfiguration beim Systemstart
- **Benutzer**: root
- **Abhängigkeiten**: firewalld.service
- **Funktionen**:
- Zone `myp-backend` für Netzwerk 192.168.0.0/24
- HTTPS-Port 443/tcp
- SSH-Port 22/tcp
- RDP-Port 3389/tcp
- Automatische Aktivierung beim Boot
## Konfiguration
### SSL-Zertifikate
@@ -166,6 +152,79 @@ sudo ./setup.sh
- Gruppen: audio, video, input, dialout, plugdev, users
- Passwortlos für Sicherheit
### Remote-Zugang
**SSH-Zugang**:
- Benutzer: `user`
- Passwort: `raspberry`
- Port: 22
- Sudo-Berechtigung: ja
**RDP-Zugang**:
- Benutzer: `root`
- Passwort: `744563017196A`
- Port: 3389
- Desktop: XFCE
- Verschlüsselung: TLS 1.2/1.3
**Firewall-Konfiguration**:
- Zone: `myp-backend`
- Quell-Netzwerke:
- `192.168.0.0/16` (erweitertes lokales Netzwerk)
- `127.0.0.1/32` (localhost IPv4)
- `raspberrypi` (lokaler Hostname - automatisch gesetzt)
- `m040tbaraspi001` (Frontend-Server - falls auflösbar)
- Erlaubte Ports: 443/tcp (HTTPS), 22/tcp (SSH), 3389/tcp (RDP)
- **IPv6 vollständig deaktiviert und blockiert**
- Automatische Konfiguration beim Systemstart
### Hostname-Konfiguration
**Automatische Hostname-Setzung**:
- Lokaler Hostname wird automatisch auf `raspberrypi` gesetzt
- `/etc/hostname` und `/etc/hosts` werden entsprechend aktualisiert
- Hostname-Auflösung wird getestet und konfiguriert
- Firewall-Integration für lokalen Hostname
**Frontend-Server Integration**:
- `m040tbaraspi001` wird als separater Frontend-Server behandelt
- Automatische IP-Auflösung für `m040tbaraspi001` und `m040tbaraspi001.de040.corpintra.net`
- Firewall-Regel wird hinzugefügt, falls der Server auflösbar ist
- Keine Abhängigkeit - System funktioniert auch ohne Frontend-Server
### Netzwerk-Sicherheit
**IPv6-Deaktivierung**:
- Vollständige Deaktivierung auf Kernel-Ebene
- GRUB-Konfiguration: `ipv6.disable=1`
- Sysctl-Konfiguration für alle Interfaces
- NetworkManager/systemd-networkd Konfiguration
- Firewall blockiert alle IPv6-Pakete
**IP-Spoofing-Schutz**:
- Reverse Path Filtering aktiviert
- Source Routing deaktiviert
- ICMP Redirects ignoriert
- Secure Redirects deaktiviert
**DDoS-Schutz**:
- SYN-Flood-Schutz mit SYN-Cookies
- Optimierte TCP-Backlog-Größe
- Begrenzte SYN/SYNACK-Wiederholungen
- Broadcast-Ping-Schutz (Smurf-Angriffe)
**TCP-Optimierungen**:
- RFC-konforme Retry-Limits
- Optimierte Window-Skalierung
- Deaktivierte TCP-Timestamps (Anti-Fingerprinting)
- Deaktivierte TCP-SACK (Sicherheit)
- Time-Wait-Assassination-Schutz
**Logging und Monitoring**:
- Martian-Pakete werden geloggt
- Verdächtige Netzwerkaktivitäten protokolliert
- Bogus ICMP-Antworten ignoriert
### Verzeichnisstruktur
```
@@ -209,7 +268,7 @@ sudo ./setup.sh
3. **SSL-Zertifikat-Probleme**
```bash
sudo ./setup.sh
# Option 4 für System-Test
# Option 5 für System-Test
```
4. **Service-Neustart**
@@ -218,20 +277,67 @@ sudo ./setup.sh
sudo systemctl restart kiosk-watchdog
```
5. **SSH-Verbindung fehlgeschlagen**
```bash
# SSH-Service prüfen
sudo systemctl status ssh
# SSH-Port prüfen
sudo ss -tlnp | grep :22
# Firewall-Regeln prüfen
sudo firewall-cmd --list-all
```
6. **RDP-Verbindung fehlgeschlagen**
```bash
# xrdp-Service prüfen
sudo systemctl status xrdp
# RDP-Port prüfen
sudo ss -tlnp | grep :3389
# xrdp-Logs prüfen
sudo journalctl -u xrdp -f
```
7. **Firewall-Probleme**
```bash
# Firewall-Status prüfen
sudo systemctl status firewalld
# Aktive Zonen anzeigen
sudo firewall-cmd --get-active-zones
# Zone-Konfiguration prüfen
sudo firewall-cmd --zone=myp-backend --list-all
# Firewall neu konfigurieren
sudo ./setup.sh
# Option 4 für Remote-Zugang
```
### Manuelle Service-Verwaltung
```bash
# Services aktivieren
sudo systemctl enable myp-https myp-kiosk kiosk-watchdog
sudo systemctl enable myp-https myp-kiosk kiosk-watchdog myp-firewall
# Services starten
sudo systemctl start myp-https myp-kiosk kiosk-watchdog
# Remote-Services aktivieren
sudo systemctl enable ssh xrdp firewalld
sudo systemctl start ssh xrdp firewalld
# Status prüfen
sudo systemctl status myp-https myp-kiosk kiosk-watchdog
sudo systemctl status myp-https myp-kiosk kiosk-watchdog myp-firewall
sudo systemctl status ssh xrdp firewalld
# Logs anzeigen
sudo journalctl -u myp-https -f
sudo journalctl -u xrdp -f
sudo journalctl -u firewalld -f
```
## Wartung
@@ -254,7 +360,7 @@ sudo journalctl -u myp-https -f
4. **System-Test**
```bash
sudo ./setup.sh
# Option 4
# Option 5
```
## Sicherheit
@@ -299,7 +405,7 @@ Wenn Sie eine bestehende Installation mit `combined.sh` oder `installer.sh` habe
Bei Problemen:
1. **Log-Dateien prüfen**
2. **System-Test durchführen** (Option 4)
2. **System-Test durchführen** (Option 5)
3. **Services neu starten**
4. **Installation wiederholen** mit entsprechender Option

View File

@@ -1 +1,269 @@
# Wartungs-Modal Reparatur - Dokumentation
## Problem-Analyse
Das Wartungs-Modal im Admin-Bereich funktionierte nicht korrekt aufgrund mehrerer Probleme:
### 1. Fehlende `setLoadingState` Methode
- **Problem**: Die JavaScript-Klasse `MaintenanceModal` rief `this.setLoadingState()` auf, aber die Methode war nicht definiert
- **Symptom**: JavaScript-Fehler beim Ausführen von Wartungsaktionen
- **Lösung**: Vollständige `setLoadingState` Methode implementiert mit:
- Button-Deaktivierung während Loading
- Spinner-Animation hinzufügen/entfernen
- Loading-Overlay-Management
### 2. Fehlende API-Endpunkte
- **Problem**: Das Modal rief API-Endpunkte auf, die nicht existierten:
- `/api/admin/maintenance/clear-cache`
- `/api/admin/maintenance/optimize-database`
- `/api/admin/maintenance/create-backup`
- **Symptom**: 404-Fehler bei API-Aufrufen
- **Lösung**: Vollständige API-Endpunkte implementiert
### 3. Template-Syntax-Fehler
- **Problem**: Jinja2-Template-Syntax `{{ url_for("optimization_settings") }}` wurde im JavaScript verwendet
- **Symptom**: JavaScript-Syntax-Fehler
- **Lösung**: Direkte URL-Navigation implementiert
### 4. Doppelte Event-Listener / Event-Handler-Konflikt ⚠️ **KRITISCH**
- **Problem**: Modal wurde mehrfach initialisiert und es gab konkurrierende Event-Handler
- **Symptom**: Modal öffnet sich und schließt sich sofort wieder automatisch
- **Ursache**:
- `MaintenanceModal` Klasse in `admin.html` registrierte Event-Handler
- `AdminDashboard` Klasse in `admin-unified.js` registrierte ebenfalls Event-Handler für denselben Button
- Beide Handler wurden gleichzeitig ausgeführt, was zu Konflikten führte
- **Lösung**:
- Event-Handler-Konflikt durch Deaktivierung des konkurrierenden Handlers behoben
- Singleton-Pattern für `MaintenanceModal` implementiert
- Event-Propagation mit `stopImmediatePropagation()` verhindert
## Implementierte Lösungen
### 1. JavaScript-Reparaturen in `templates/admin.html`
```javascript
class MaintenanceModal {
constructor() {
this.modal = document.getElementById('maintenance-modal');
this.triggerBtn = document.getElementById('maintenance-btn');
this.closeBtn = document.getElementById('close-maintenance-modal');
this.isOpen = false;
this.isLoading = false;
this.isInitialized = false; // ✅ Neu hinzugefügt
// ✅ Verhindere doppelte Initialisierung
if (window.maintenanceModalInstance) {
return window.maintenanceModalInstance;
}
this.initializeEventListeners();
this.isInitialized = true;
window.maintenanceModalInstance = this; // ✅ Singleton-Pattern
}
initializeEventListeners() {
// ✅ Modal öffnen - mit Event-Delegation und Konflikt-Vermeidung
if (this.triggerBtn) {
// Entferne alle existierenden Event-Listener
this.triggerBtn.removeEventListener('click', this.handleTriggerClick);
// Füge neuen Event-Listener hinzu
this.handleTriggerClick = (e) => {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation(); // ✅ Verhindert andere Handler
console.log('🛠️ Wartungs-Modal wird geöffnet...');
this.openModal();
};
this.triggerBtn.addEventListener('click', this.handleTriggerClick, { capture: true });
}
// ✅ Modal schließen - verbesserte Event-Behandlung
if (this.closeBtn) {
this.closeBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
this.closeModal();
});
}
// ✅ Modal schließen bei Klick außerhalb - aber nur auf das Overlay
if (this.modal) {
this.modal.addEventListener('click', (e) => {
// Nur schließen wenn direkt auf das Modal-Overlay geklickt wird
if (e.target === this.modal) {
this.closeModal();
}
});
}
// ✅ ESC-Taste zum Schließen
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && this.isOpen) {
e.preventDefault();
this.closeModal();
}
});
// Wartungs-Aktionen
this.initializeMaintenanceActions();
}
// ✅ Verbesserte openModal Methode
openModal() {
if (this.modal && !this.isOpen) {
console.log('✅ Modal wird geöffnet');
this.modal.classList.remove('hidden');
this.isOpen = true;
document.body.style.overflow = 'hidden';
// Focus-Management für Barrierefreiheit
setTimeout(() => {
const firstFocusable = this.modal.querySelector('button:not(#close-maintenance-modal)');
if (firstFocusable) {
firstFocusable.focus();
}
}, 100);
}
}
// ✅ Verbesserte closeModal Methode
closeModal() {
if (this.modal && this.isOpen) {
console.log('❌ Modal wird geschlossen');
this.modal.classList.add('hidden');
this.isOpen = false;
document.body.style.overflow = '';
// Focus zurück zum Trigger-Button
if (this.triggerBtn) {
this.triggerBtn.focus();
}
}
}
// ... weitere Methoden ...
}
// ✅ Globale Instanz-Verwaltung mit Konflikt-Vermeidung
let maintenanceModal = null;
// ✅ Initialisierung nach DOM-Laden - aber nur einmal
document.addEventListener('DOMContentLoaded', function() {
// Verhindere doppelte Initialisierung
if (!window.maintenanceModalInstance && !maintenanceModal) {
console.log('🔧 Wartungs-Modal wird initialisiert...');
maintenanceModal = new MaintenanceModal();
// ✅ Deaktiviere andere Event-Handler für den Wartungs-Button
const maintenanceBtn = document.getElementById('maintenance-btn');
if (maintenanceBtn) {
// Entferne alle anderen Event-Listener durch Klonen
const newBtn = maintenanceBtn.cloneNode(true);
maintenanceBtn.parentNode.replaceChild(newBtn, maintenanceBtn);
// Füge nur unseren Event-Listener hinzu
newBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
if (maintenanceModal) {
maintenanceModal.openModal();
}
}, { capture: true });
}
}
});
```
### 2. Deaktivierung des konkurrierenden Event-Handlers in `static/js/admin-unified.js`
```javascript
attachSystemButtons() {
// System Status Button
this.addEventListenerSafe('#system-status-btn', 'click', (e) => {
e.preventDefault();
e.stopPropagation();
this.showSystemStatus();
});
// Analytics Button
this.addEventListenerSafe('#analytics-btn', 'click', (e) => {
e.preventDefault();
e.stopPropagation();
this.showAnalytics();
});
// ✅ Maintenance Button - DEAKTIVIERT wegen Konflikt mit MaintenanceModal
// Das Wartungs-Modal wird jetzt direkt in admin.html verwaltet
// this.addEventListenerSafe('#maintenance-btn', 'click', (e) => {
// e.preventDefault();
// e.stopPropagation();
// this.showMaintenance();
// });
// ... weitere Buttons ...
}
```
## Nächste Schritte
1. **API-Endpunkte hinzufügen**: Die oben gezeigten API-Endpunkte müssen in `app.py` eingefügt werden
2. **Testen**: Das Wartungs-Modal nach der Implementierung testen
3. **Logging**: Überprüfen der Log-Ausgaben für erfolgreiche Wartungsaktionen
4. **Backup-Verzeichnis**: Sicherstellen, dass das `database/backups` Verzeichnis existiert
## Funktionalitäten
Nach der Reparatur bietet das Wartungs-Modal folgende Funktionen:
### ✅ Cache leeren
- Löscht Flask-Cache (falls vorhanden)
- Entfernt temporäre MYP/TBA-Dateien
- Führt Python Garbage Collection durch
- Zeigt Anzahl der gelöschten Dateien an
### ✅ Datenbank optimieren
- SQLite VACUUM (Komprimierung)
- SQLite ANALYZE (Statistiken aktualisieren)
- SQLite REINDEX (Indizes neu aufbauen)
- Bereinigung verwaister Dateien (älter als 7 Tage)
- Detaillierte Ergebnisanzeige
### ✅ Backup erstellen
- ZIP-Backup mit Zeitstempel
- Enthält Datenbank, Konfigurationsdateien und wichtige Uploads
- Automatische Bereinigung alter Backups (nur 10 neueste behalten)
- Größenanzeige und Dateiliste
### ✅ Erweiterte Einstellungen
- Navigation zu Optimierungs-Einstellungen
- Fehlerbehandlung bei Navigation
## Benutzerfreundlichkeit
- **Loading-Zustände**: Buttons werden während Aktionen deaktiviert
- **Spinner-Animationen**: Visuelle Rückmeldung während Verarbeitung
- **Bestätigungsdialoge**: Sicherheitsabfragen vor kritischen Aktionen
- **Detaillierte Notifications**: Erfolgs- und Fehlermeldungen mit Details
- **Schließbare Notifications**: Benutzer können Meldungen manuell schließen
- **Keyboard-Support**: ESC-Taste schließt das Modal
- **Focus-Management**: Barrierefreie Navigation
## Sicherheit
- **Admin-Berechtigung**: Alle API-Endpunkte erfordern Admin-Rechte
- **CSRF-Schutz**: CSRF-Token bei allen API-Aufrufen
- **Logging**: Alle Wartungsaktionen werden geloggt
- **Fehlerbehandlung**: Robuste Fehlerbehandlung verhindert System-Crashes
- **Datei-Größen-Limits**: Backup-Dateien sind auf 10MB begrenzt
## Wartung
- **Automatische Bereinigung**: Alte Backups werden automatisch gelöscht
- **Fehler-Logging**: Alle Fehler werden in den App-Logs erfasst
- **Performance-Überwachung**: Optimierungszeiten werden gemessen
- **Benutzer-Tracking**: Wartungsaktionen werden Benutzern zugeordnet