3217 Zeilen
120 KiB
Markdown
3217 Zeilen
120 KiB
Markdown
# v2-Docker Projekt Journal
|
|
|
|
## Letzte Änderungen (22.06.2025 - 18:30 Uhr)
|
|
|
|
### Export-Funktionen komplett repariert ✅
|
|
|
|
**Probleme gefunden und behoben:**
|
|
|
|
1. **Parameter-Mismatch**: Templates übergaben `include_test`, Routes erwarteten `show_fake`
|
|
2. **Bootstrap Dropdowns funktionierten nicht**: JavaScript-Konflikt verhinderte Dropdown-Öffnung
|
|
3. **Excel Timezone-Fehler**: "Excel does not support datetimes with timezones"
|
|
|
|
**Implementierte Lösungen:**
|
|
|
|
1. **Nur echte Daten beim Export:**
|
|
- Alle Export-Queries filtern jetzt mit `WHERE is_fake = false`
|
|
- Keine Test/Fake-Daten mehr in Exporten
|
|
|
|
2. **Dropdown durch direkte Buttons ersetzt:**
|
|
- Statt problematischer Dropdowns: Einzelne Export-Buttons
|
|
- Funktioniert ohne JavaScript, zuverlässiger
|
|
- Übersichtlicher: alle Optionen sofort sichtbar
|
|
|
|
3. **Datetime-Formatierung für Excel-Kompatibilität:**
|
|
- `format_datetime_for_export()` entfernt Zeitzonen-Info
|
|
- Alle Datetime-Felder werden vor Export formatiert
|
|
- Einheitliches Format: `YYYY-MM-DD HH:MM:SS`
|
|
|
|
**Geänderte Dateien:**
|
|
- `templates/customers_licenses.html` - Export-Buttons statt Dropdown
|
|
- `templates/audit_log.html` - Export-Buttons statt Dropdown
|
|
- `templates/sessions.html` - Export-Buttons statt Dropdown
|
|
- `routes/export_routes.py` - Datetime-Formatierung für alle Exports
|
|
- `utils/export.py` - Timezone-Entfernung in format_datetime_for_export()
|
|
|
|
**Status:** Alle Export-Funktionen (Excel & CSV) funktionieren einwandfrei! ✅
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (22.06.2025 - 16:49 Uhr)
|
|
|
|
### Export-Funktionen Analyse und Lösungsplan ✅
|
|
|
|
**Problem:**
|
|
- CSV Export Buttons vorhanden, aber Backend liefert immer Excel-Dateien
|
|
- Monitoring Export zeigt nur Platzhalter-Alerts ("Export-Funktion wird implementiert")
|
|
- Leads/CRM Module hat keine Export-Funktionalität
|
|
- Format-Parameter wird in Export-Routes ignoriert
|
|
|
|
**Analyse-Ergebnisse:**
|
|
1. Excel-Exporte funktionieren für: Lizenzen, Kunden, Sessions, Audit Logs, Ressourcen
|
|
2. Export-Routes in `export_routes.py` prüfen nie den `format=csv` Parameter
|
|
3. Nur `create_excel_export()` existiert, keine CSV-Generierung implementiert
|
|
4. Monitoring-Exporte haben nur JavaScript-Platzhalter ohne Backend
|
|
5. Lead Management hat keine Export-Funktionalität
|
|
|
|
**Lösungsplan (YAGNI & Strukturiert):**
|
|
|
|
1. **CSV Export Fix (Priorität 1)**
|
|
- Format-Parameter in bestehenden Export-Routes prüfen
|
|
- CSV als Alternative zu Excel hinzufügen (Excel bleibt Default)
|
|
- Python's eingebautes csv-Modul nutzen, keine neuen Dependencies
|
|
- Minimale Änderung: ~10 Zeilen pro Route
|
|
|
|
2. **Monitoring Export (Priorität 2)**
|
|
- Neue Route `/export/monitoring` nach bestehendem Muster
|
|
- Daten von existierenden Monitoring-Endpoints nutzen
|
|
- Excel und CSV Format unterstützen
|
|
|
|
3. **Lead Export (Priorität 3)**
|
|
- Route `/leads/export` zum Lead Blueprint hinzufügen
|
|
- Institutionen mit Kontakt-Anzahl exportieren
|
|
- Gleiches Muster wie andere Exporte verwenden
|
|
|
|
**Vorteile dieser Lösung:**
|
|
- Keine Refaktorierung nötig
|
|
- Bestehende Excel-Exporte bleiben unverändert
|
|
- Konsistentes URL-Muster mit format-Parameter
|
|
- Rückwärtskompatibel (Excel als Standard)
|
|
- Einfach erweiterbar für zukünftige Formate
|
|
|
|
**Implementierung abgeschlossen:**
|
|
|
|
1. **CSV Export Support hinzugefügt:**
|
|
- Neue Funktion `create_csv_export()` in `utils/export.py`
|
|
- Alle Export-Routes prüfen jetzt den `format` Parameter
|
|
- CSV-Dateien mit UTF-8 BOM für Excel-Kompatibilität
|
|
|
|
2. **Monitoring Export implementiert:**
|
|
- Neue Route `/export/monitoring` in `export_routes.py`
|
|
- Exportiert Heartbeats und optional Anomalien
|
|
- JavaScript-Funktionen in Templates aktualisiert
|
|
|
|
3. **Lead Export hinzugefügt:**
|
|
- Neue Route `/leads/export` in `leads/routes.py`
|
|
- Exportiert Institutionen mit Kontakt-Statistiken
|
|
- Export-Buttons zu Institutions-Template hinzugefügt
|
|
|
|
**Geänderte Dateien:**
|
|
- `utils/export.py` - CSV-Export-Funktion hinzugefügt
|
|
- `routes/export_routes.py` - Format-Parameter-Prüfung für alle Routes
|
|
- `routes/export_routes.py` - Monitoring-Export hinzugefügt
|
|
- `leads/routes.py` - Lead-Export-Route hinzugefügt
|
|
- `templates/monitoring/analytics.html` - Export-Funktionen aktualisiert
|
|
- `templates/monitoring/live_dashboard.html` - Export-Funktionen aktualisiert
|
|
- `leads/templates/leads/institutions.html` - Export-Buttons hinzugefügt
|
|
|
|
**Testing abgeschlossen:**
|
|
- Alle Export-Routes sind verfügbar und funktionieren
|
|
- CSV-Export generiert korrekte CSV-Dateien mit UTF-8 BOM
|
|
- Excel bleibt der Standard wenn kein format-Parameter angegeben
|
|
- Container wurde neu gebaut und deployed
|
|
- Alle 7 Export-Endpoints unterstützen beide Formate:
|
|
- `/export/licenses`
|
|
- `/export/customers`
|
|
- `/export/sessions`
|
|
- `/export/audit`
|
|
- `/export/resources`
|
|
- `/export/monitoring`
|
|
- `/leads/export`
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (22.06.2025 - 16:35 Uhr)
|
|
|
|
### Lizenzfilter System komplett überarbeitet ✅
|
|
|
|
**Problem:**
|
|
- Checkbox-basiertes Filtersystem war unübersichtlich und fummelig
|
|
- "Fake-Daten anzeigen" Checkbox funktionierte nicht richtig
|
|
- "Läuft bald ab" Status machte keinen Sinn (inaktive Lizenzen können nicht ablaufen)
|
|
|
|
**Lösung 1 - Neues Dropdown-System:**
|
|
- Checkbox-Filter ersetzt durch 3 klare Dropdowns:
|
|
- Datenquelle: Echte Lizenzen / 🧪 Fake-Daten / Alle Daten
|
|
- Lizenztyp: Alle Typen / Vollversion / Testversion
|
|
- Status: Alle Status / ✅ Aktiv / ⚠️ Abgelaufen / ❌ Deaktiviert
|
|
- Auto-Submit bei Änderung
|
|
- Übersichtlicher "Filter zurücksetzen" Button
|
|
|
|
**Lösung 2 - API Bug Fix:**
|
|
- SQLAlchemy Fehler behoben: `text()` Wrapper für Raw SQL Queries hinzugefügt
|
|
- License Server API funktioniert jetzt korrekt
|
|
|
|
**Lösung 3 - Status-Logik korrigiert:**
|
|
- "Läuft bald ab" komplett entfernt (gehört nur ins Dashboard als Hinweis)
|
|
- Klare Trennung der 3 Status:
|
|
- Aktiv = `is_active=true` (egal ob abgelaufen)
|
|
- Abgelaufen = `valid_until <= heute` (läuft aber weiter bis manuell deaktiviert)
|
|
- Deaktiviert = `is_active=false` (manuell gestoppt)
|
|
- Lizenzen laufen nach Ablauf weiter bis zur manuellen Deaktivierung
|
|
|
|
**Geänderte Dateien:**
|
|
- `templates/licenses.html` - Komplettes Filter-UI überarbeitet
|
|
- `routes/license_routes.py` - Filter-Logik angepasst
|
|
- `v2_lizenzserver/app/core/api_key_auth.py` - SQL Bug behoben
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (22.06.2025 - 13:27 Uhr)
|
|
|
|
### Bug Fix: API Key Anzeige in Administration
|
|
|
|
**Problem:**
|
|
- "Kein System API Key gefunden!" wurde angezeigt obwohl Key existierte
|
|
- Query versuchte noch die gelöschte `api_key` Spalte aus `client_configs` zu lesen
|
|
|
|
**Lösung:**
|
|
- SELECT Statement in `admin_routes.py` korrigiert (api_key entfernt)
|
|
- Template Indizes angepasst (current_version: [5]→[4], minimum_version: [6]→[5])
|
|
- Admin Panel neu gestartet
|
|
|
|
**Status:** ✅ API Key wird jetzt korrekt angezeigt
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (22.06.2025 - 13:07 Uhr)
|
|
|
|
### Doppeltes API Key System entfernt ✅
|
|
|
|
**Problem:**
|
|
- Zwei verschiedene API Keys wurden angezeigt:
|
|
- `system_api_key` Tabelle: Globaler System API Key
|
|
- `client_configs` Tabelle: Account Forger spezifischer API Key
|
|
- Verwirrung welcher Key verwendet werden soll
|
|
|
|
**Lösung:**
|
|
- Da Admin Panel exklusiv für Account Forger ist, nur noch ein API Key System
|
|
- `api_key` Spalte aus `client_configs` entfernt
|
|
- UI zeigt nur noch den System API Key als "API Key für Account Forger"
|
|
- License Server validiert bereits gegen `system_api_key`
|
|
|
|
**Geänderte Dateien:**
|
|
- `templates/license_config.html` - Entfernt doppelte API Key Anzeige
|
|
- `migrations/remove_duplicate_api_key.sql` - Migration erstellt
|
|
- Datenbank aktualisiert
|
|
|
|
### Orphaned API Tabellen entfernt ✅
|
|
|
|
**Entfernte Tabellen:**
|
|
- `api_keys` - Ungenutzte API Key Tabelle (war leer)
|
|
- `api_clients` - Alternative API Client Verwaltung (war leer)
|
|
- `rate_limits` - Abhängige Tabelle (war leer)
|
|
- `license_events` - Abhängige Tabelle (war leer)
|
|
|
|
**Resultat:**
|
|
- Nur noch `system_api_key` Tabelle existiert
|
|
- Keine verwirrenden Duplikate mehr
|
|
- Saubere, eindeutige API Key Verwaltung
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (22.06.2025 - 12:18 Uhr)
|
|
|
|
### Lizenzserver Session Management - Vollständig implementiert ✅
|
|
|
|
**Implementierte Features:**
|
|
1. **Single-Session Enforcement**:
|
|
- Nur eine aktive Sitzung pro Lizenz erlaubt
|
|
- Deutsche Fehlermeldung bei Mehrfach-Login-Versuch
|
|
- Session-Token basiertes System mit UUID
|
|
|
|
2. **Heartbeat System**:
|
|
- 30-Sekunden Heartbeat-Intervall
|
|
- Automatische Session-Bereinigung nach 60 Sekunden Inaktivität
|
|
- Background Job für Session-Cleanup
|
|
|
|
3. **Session Management Endpoints**:
|
|
- `POST /api/license/session/start` - Session initialisierung
|
|
- `POST /api/license/session/heartbeat` - Keep-alive
|
|
- `POST /api/license/session/end` - Sauberes Session-Ende
|
|
- Vollständige Session-Historie in `session_history` Tabelle
|
|
|
|
4. **Admin Panel Integration**:
|
|
- Lizenzserver Administration mit API-Key Management
|
|
- Live Session Monitor mit Auto-Refresh
|
|
- Session-Terminierung durch Admins
|
|
- Version Management (Current/Minimum)
|
|
|
|
5. **Datenbank-Schema**:
|
|
- `client_configs` - Zentrale Konfiguration
|
|
- `license_sessions` - Aktive Sessions (UNIQUE per license_id)
|
|
- `session_history` - Audit Trail mit end_reason
|
|
- `system_api_key` - Globaler API Key
|
|
|
|
**Status**: ✅ Vollständig implementiert und produktionsbereit
|
|
|
|
### Dokumentation vollständig aktualisiert
|
|
|
|
**Aktualisierte Dateien:**
|
|
1. **OPERATIONS_GUIDE.md**:
|
|
- Korrekte Container-Namen (v2_*)
|
|
- Aktuelle Service-Konfigurationen
|
|
- Neue Features dokumentiert (Leads, Resources, Monitoring)
|
|
- Health-Check Befehle aktualisiert
|
|
|
|
2. **CLAUDE.md**:
|
|
- Vollständige Projektstruktur mit allen Modulen
|
|
- Alle Datenbank-Tabellen dokumentiert
|
|
- Session Management Patterns
|
|
- Erweiterte Common Issues Liste
|
|
|
|
3. **TODO_LIZENZSERVER_CONFIG.md**:
|
|
- Als abgeschlossen markiert
|
|
- Kann archiviert/gelöscht werden
|
|
|
|
**Alle Dokumentationen aktualisiert:**
|
|
- SYSTEM_DOCUMENTATION.md ✅ Vollständig aktualisiert
|
|
- API_REFERENCE.md ✅ Alle Endpoints dokumentiert
|
|
- TODO_LIZENZSERVER_CONFIG.md ✅ Gelöscht (da abgeschlossen)
|
|
|
|
### Dokumentation bereinigt und komprimiert
|
|
|
|
**Reduzierte Dateigröße:**
|
|
- OPERATIONS_GUIDE.md: Von 501 auf 409 Zeilen (-18%)
|
|
- CLAUDE.md: Von ~250 auf 142 Zeilen (-43%)
|
|
- SYSTEM_DOCUMENTATION.md: Von ~350 auf 243 Zeilen (-31%)
|
|
- API_REFERENCE.md: Von ~1057 auf 815 Zeilen (-23%)
|
|
|
|
**Entfernt:**
|
|
- Redundante YAML-Konfigurationen (verweisen auf docker-compose.yaml)
|
|
- Verbose Code-Beispiele (durch kompakte Referenzen ersetzt)
|
|
- Zukünftige/nicht implementierte Features
|
|
- Duplizierte Informationen zwischen Dateien
|
|
- Übermäßig detaillierte JSON-Beispiele
|
|
|
|
**Fokus auf:**
|
|
- Tatsächlich implementierte Features
|
|
- Praktische Operational-Informationen
|
|
- Kompakte API-Referenzen
|
|
- Verweise auf Source-Dateien statt Duplikation
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025 - 20:30 Uhr)
|
|
|
|
### Dokumentation aktualisiert und mit Realität abgeglichen
|
|
- **API_REFERENCE.md komplett überarbeitet**:
|
|
- Tatsächliche Lizenzserver-Endpunkte dokumentiert (nicht mehr v1)
|
|
- Korrekte Ports und URLs eingetragen
|
|
- Admin Panel API vollständig dokumentiert
|
|
- Nicht implementierte Endpunkte entfernt
|
|
|
|
- **SYSTEM_DOCUMENTATION.md aktualisiert**:
|
|
- Microservices-Status korrigiert (nur License Server & Admin Panel aktiv)
|
|
- Analytics, Admin API und Auth Service als "geplant" markiert
|
|
- Implementierungsstatus auf aktuellen Stand gebracht
|
|
- Lead Management als "vollständig implementiert" dokumentiert
|
|
|
|
- **OPERATIONS_GUIDE.md korrigiert**:
|
|
- Echte Docker-Container-Namen verwendet
|
|
- Korrekte Ports und Netzwerk-Konfiguration
|
|
- Aktuelle Monitoring-Stack-Services dokumentiert
|
|
- Troubleshooting-Befehle an echte Container angepasst
|
|
|
|
### Status:
|
|
✅ Dokumentation spiegelt nun den tatsächlichen Projektzustand wider
|
|
✅ Keine falschen oder veralteten Informationen mehr
|
|
✅ Alle drei Haupt-Dokumentationen sind aktuell
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025 - 19:20 Uhr)
|
|
|
|
### Bugfix: Kunden & Lizenzen API-Fehler behoben
|
|
- **Problem**: 500 Fehler beim Klicken auf Kunden in der "Kunden & Lizenzen" Ansicht
|
|
- **Ursache**: SQL-Abfrage versuchte auf nicht-existierende Tabellen und Spalten zuzugreifen:
|
|
- `license_heartbeats` Tabelle existiert noch nicht (wird mit License Server implementiert)
|
|
- `anomaly_detections` Tabelle existiert noch nicht
|
|
- Zu komplexe Subqueries führten zu Datenbankfehlern
|
|
|
|
- **Lösung implementiert**:
|
|
- SQL-Abfrage in `api_customer_licenses` vereinfacht
|
|
- Entfernt: Alle Referenzen zu noch nicht existierenden Tabellen
|
|
- Platzhalter-Werte (0) für License Server Statistiken eingefügt
|
|
- Bessere Fehlerbehandlung mit detaillierten Fehlermeldungen
|
|
|
|
- **Geänderte Dateien**:
|
|
- `v2_adminpanel/routes/customer_routes.py` - Vereinfachte SQL-Abfrage ohne Subqueries
|
|
|
|
### Status:
|
|
✅ Kunden & Lizenzen Ansicht funktioniert wieder einwandfrei
|
|
✅ API gibt korrekte Daten zurück
|
|
✅ Keine Abhängigkeit von noch nicht implementierten Tabellen
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025 - 15:07 Uhr)
|
|
|
|
### Lead-Management System implementiert
|
|
- **Komplett neues CRM-Modul für potentielle Kunden**:
|
|
- Separates `leads` Modul ohne Navbar-Eintrag
|
|
- Zugang über "Leads" Button auf Kunden & Lizenzen Seite
|
|
- Vollständig getrennt vom bestehenden Kundensystem
|
|
|
|
- **Refactoring-freie Architektur von Anfang an**:
|
|
- Service Layer Pattern für Business Logic
|
|
- Repository Pattern für Datenbankzugriffe
|
|
- RESTful API Design
|
|
- JSONB Felder für zukünftige Erweiterungen ohne Schema-Änderungen
|
|
- Event-System vorbereitet für spätere Integrationen
|
|
|
|
- **Datenmodell (vereinfacht aber erweiterbar)**:
|
|
- `lead_institutions`: Nur Name erforderlich
|
|
- `lead_contacts`: Kontaktpersonen mit Institution
|
|
- `lead_contact_details`: Flexible Telefon/E-Mail Verwaltung (beliebig viele)
|
|
- `lead_notes`: Versionierte Notizen mit vollständiger Historie
|
|
|
|
- **Features**:
|
|
- Institutionen-Verwaltung mit Kontakt-Zähler
|
|
- Kontaktpersonen mit Position (Freitext)
|
|
- Mehrere Telefonnummern/E-Mails pro Person mit Labels
|
|
- Notiz-Historie mit Zeitstempel und Benutzer-Tracking
|
|
- Notizen können bearbeitet werden (neue Version wird erstellt)
|
|
- Vollständige Audit-Trail Integration
|
|
|
|
- **Migration bereitgestellt**:
|
|
- SQL-Script: `migrations/create_lead_tables.sql`
|
|
- Python-Script: `apply_lead_migration.py`
|
|
- Anwendung: `docker exec -it v2_adminpanel python apply_lead_migration.py`
|
|
|
|
### Status:
|
|
✅ Lead-Management vollständig implementiert
|
|
✅ Refactoring-freie Architektur umgesetzt
|
|
✅ Keine Breaking Changes möglich durch Design
|
|
✅ Bereit für produktiven Einsatz
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025 - 13:15 Uhr)
|
|
|
|
### License Heartbeats Tabelle und Dashboard-Konsolidierung
|
|
- **Fehlende `license_heartbeats` Tabelle erstellt**:
|
|
- Migration-Script für partitionierte Tabellenstruktur (monatliche Partitionen)
|
|
- Automatische Partition-Erstellung für aktuellen und nächsten Monat
|
|
- Performance-optimierte Indizes und Foreign Keys
|
|
- Anwendbar via: `docker exec -it v2_adminpanel python apply_license_heartbeats_migration.py`
|
|
|
|
- **Live Dashboard & Analytics zusammengeführt**:
|
|
- Alle Analytics-Funktionen ins Live Dashboard integriert
|
|
- 3-Tab-Struktur: Übersicht, Sessions, Analytics
|
|
- Echtzeit-Monitoring + historische Daten an einem Ort
|
|
- Export-Funktionen beibehalten
|
|
|
|
- **Navigation weiter optimiert**:
|
|
- "Analytics" aus Navigation entfernt (in Live Dashboard integriert)
|
|
- Redundanten "Live Dashboard & Analytics" Menüpunkt entfernt
|
|
- Monitoring führt direkt zum kombinierten Dashboard
|
|
|
|
### Status:
|
|
✅ License Heartbeats Infrastruktur implementiert
|
|
✅ Dashboard-Konsolidierung abgeschlossen
|
|
✅ Navigation maximal vereinfacht
|
|
✅ Alle Monitoring-Features an einem zentralen Ort
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025 - 12:46 Uhr)
|
|
|
|
### Navigation komplett überarbeitet
|
|
- **500 Fehler auf /live-dashboard behoben**:
|
|
- Datenbankabfrage korrigiert (falsche Spaltenreferenz `c.contact_person` entfernt)
|
|
- Alle Referenzen nutzen jetzt korrekt `c.name as company_name`
|
|
|
|
- **Navigation aufgeräumt und reorganisiert**:
|
|
- "Admin Sessions" komplett entfernt (nicht benötigt)
|
|
- "Alerts & Anomalien" entfernt (redundant zu "Lizenz-Anomalien")
|
|
- "Lizenzserver Status" und "Analytics" zu einer Seite zusammengeführt
|
|
- "Live Dashboard" aus Submenu entfernt (Monitoring führt direkt dorthin)
|
|
- Neuer "Administration" Bereich erstellt (führt zu Lizenzserver Config)
|
|
|
|
- **Neue Navigationsstruktur**:
|
|
```
|
|
📊 Monitoring → (Live Dashboard)
|
|
├── System Status
|
|
├── Lizenz-Anomalien
|
|
└── Analytics (kombiniert)
|
|
|
|
🔧 Administration → (Lizenzserver Config)
|
|
├── Audit-Log
|
|
├── Backups
|
|
└── Gesperrte IPs
|
|
```
|
|
|
|
- **Weitere Verbesserungen**:
|
|
- Grafana-Link aus System Status entfernt
|
|
- Session-Route-Fehler behoben (`admin.sessions` → `sessions.sessions`)
|
|
- Klarere Trennung zwischen operativem Monitoring und Admin-Tools
|
|
|
|
### Status:
|
|
✅ Navigation ist jetzt intuitiv und aufgeräumt
|
|
✅ Alle 500 Fehler behoben
|
|
✅ Redundante Menüpunkte eliminiert
|
|
✅ Admin-Tools klar von Monitoring getrennt
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (19.06.2025)
|
|
|
|
### Monitoring vereinfacht und optimiert
|
|
- **Prometheus/Grafana/Alertmanager entfernt**:
|
|
- Monitoring Stack aus docker-compose.yaml entfernt (spart ~3GB RAM)
|
|
- Vereinfacht das Setup für PoC-Phase erheblich
|
|
- Alle wichtigen Monitoring-Features bleiben über Admin Panel verfügbar
|
|
|
|
- **Analytics-Seite überarbeitet**:
|
|
- Demo-Daten und statische Charts entfernt
|
|
- Revenue/Pricing-Metriken entfernt (Preismodell noch in Entwicklung)
|
|
- Zeigt jetzt echte Live-Statistiken aus der Datenbank
|
|
- Automatische Aktualisierung alle 30 Sekunden
|
|
- Verweis auf Live Dashboard für Echtzeit-Daten
|
|
|
|
- **Integriertes Monitoring bleibt funktional**:
|
|
- Live Dashboard mit aktiven Sessions und Heartbeats
|
|
- System Status mit Service Health Checks
|
|
- Alerts aus anomaly_detections Tabelle
|
|
- Alle Daten direkt aus PostgreSQL ohne externe Dependencies
|
|
|
|
### Status:
|
|
✅ Monitoring für PoC optimiert
|
|
✅ Analytics zeigt echte Daten statt Demo-Werte
|
|
✅ System ~3GB schlanker ohne externe Monitoring-Tools
|
|
✅ Alle wichtigen Features weiterhin verfügbar
|
|
|
|
---
|
|
|
|
## Letzte Änderungen (18.06.2025)
|
|
|
|
### Große Refaktorisierung erfolgreich abgeschlossen
|
|
- **Datenbankfeld-Inkonsistenzen behoben**:
|
|
- 91 falsche Feldnamen korrigiert (83 automatisch + 8 manuell)
|
|
- Hauptproblem: `active` → `is_active`, `device_id` → `hardware_id`
|
|
- Sessions-Tabelle: Alle Zeit-Felder vereinheitlicht (`login_time` → `started_at`, etc.)
|
|
- Status-Toggle-Bug behoben - funktioniert jetzt korrekt
|
|
|
|
- **Code-Bereinigung**:
|
|
- 15 obsolete Dateien gelöscht (Backups, Migrations-Scripts, Dokumentation)
|
|
- 5 überflüssige .md Dateien entfernt
|
|
- Saubere Verzeichnisstruktur ohne temporäre Dateien
|
|
|
|
- **Funktionale Verbesserungen**:
|
|
- Testkunden-Erstellung gefixt (is_test Flag wird jetzt korrekt verarbeitet)
|
|
- Audit-Log Dropdown erweitert: von 18 auf 37 Aktionen
|
|
- Neue Gruppierung im Audit-Log für bessere Übersicht
|
|
- Alle Route-Referenzen korrigiert (`customers.customers` → `customers.customers_licenses`)
|
|
|
|
- **Technische Details**:
|
|
- Alle Python-Abhängigkeiten funktionieren korrekt
|
|
- Datenbank-Foreign Keys alle intakt
|
|
- Blueprint-Registrierung erfolgreich
|
|
- Keine zirkulären Imports mehr
|
|
|
|
### Status:
|
|
✅ Anwendung vollständig funktionsfähig
|
|
✅ Alle bekannten Bugs behoben
|
|
✅ Code-Qualität deutlich verbessert
|
|
✅ Wartbarkeit erhöht durch konsistente Namensgebung
|
|
|
|
---
|
|
|
|
## Vorherige Änderungen (06.01.2025)
|
|
|
|
### Gerätelimit-Feature implementiert
|
|
- **Datenbank-Schema erweitert**:
|
|
- Neue Spalte `device_limit` in `licenses` Tabelle (Standard: 3, Range: 1-10)
|
|
- Neue Tabelle `device_registrations` für Hardware-ID Tracking
|
|
- Indizes für Performance-Optimierung hinzugefügt
|
|
|
|
- **UI-Anpassungen**:
|
|
- Einzellizenz-Formular: Dropdown für Gerätelimit (1-10 Geräte)
|
|
- Batch-Formular: Gerätelimit pro Lizenz auswählbar
|
|
- Lizenz-Bearbeitung: Gerätelimit änderbar
|
|
- Lizenz-Anzeige: Zeigt aktive Geräte (z.B. "💻 2/3")
|
|
|
|
- **Backend-Änderungen**:
|
|
- Lizenz-Erstellung speichert device_limit
|
|
- Batch-Erstellung berücksichtigt device_limit
|
|
- Lizenz-Update kann device_limit ändern
|
|
- API-Endpoints liefern Geräteinformationen
|
|
|
|
- **Migration**:
|
|
- Device-Limit wird automatisch bei neuen Lizenzen gesetzt
|
|
- Standard device_limit = 3 für alle Lizenzen
|
|
|
|
### Vollständig implementiert:
|
|
✅ Device Management UI (Geräte pro Lizenz anzeigen/verwalten)
|
|
✅ Device Validation Logic (Prüfung bei Geräte-Registrierung)
|
|
✅ API-Endpoints für Geräte-Registrierung/Deregistrierung
|
|
|
|
### API-Endpoints:
|
|
- `GET /api/license/<id>/devices` - Listet alle Geräte einer Lizenz
|
|
- `POST /api/license/<id>/register-device` - Registriert ein neues Gerät
|
|
- `POST /api/license/<id>/deactivate-device/<device_id>` - Deaktiviert ein Gerät
|
|
|
|
### Features:
|
|
- Geräte-Registrierung mit Hardware-ID Validierung
|
|
- Automatische Prüfung des Gerätelimits
|
|
- Reaktivierung deaktivierter Geräte möglich
|
|
- Geräte-Verwaltung UI mit Modal-Dialog
|
|
- Anzeige von Gerätename, OS, IP, Registrierungsdatum
|
|
- Admin kann Geräte manuell deaktivieren
|
|
|
|
---
|
|
|
|
## Projektübersicht
|
|
Lizenzmanagement-System für Social Media Account-Erstellungssoftware mit Docker-basierter Architektur.
|
|
|
|
### Technische Anforderungen
|
|
- **Lokaler Betrieb**: Docker mit 4GB RAM und 40GB Speicher
|
|
- **Internet-Zugriff**:
|
|
- Admin Panel: https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com
|
|
- API Server: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com
|
|
- **Datenbank**: PostgreSQL mit 2 Admin-Usern
|
|
- **Ziel**: PoC für spätere VPS-Migration
|
|
|
|
---
|
|
|
|
## Best Practices für Produktiv-Migration
|
|
|
|
### Passwort-Management
|
|
Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werden:
|
|
|
|
1. **Environment Variables erstellen:**
|
|
```bash
|
|
# .env.example (ins Git Repository)
|
|
POSTGRES_USER=changeme
|
|
POSTGRES_PASSWORD=changeme
|
|
POSTGRES_DB=changeme
|
|
SECRET_KEY=generate-a-secure-key
|
|
ADMIN_USER_1=changeme
|
|
ADMIN_PASS_1=changeme
|
|
ADMIN_USER_2=changeme
|
|
ADMIN_PASS_2=changeme
|
|
|
|
# .env (NICHT ins Git, auf Server erstellen)
|
|
POSTGRES_USER=produktiv_user
|
|
POSTGRES_PASSWORD=sicheres_passwort_min_20_zeichen
|
|
POSTGRES_DB=v2docker_prod
|
|
SECRET_KEY=generierter_64_zeichen_key
|
|
# etc.
|
|
```
|
|
|
|
2. **Sichere Passwörter generieren:**
|
|
- Mindestens 20 Zeichen
|
|
- Mix aus Groß-/Kleinbuchstaben, Zahlen, Sonderzeichen
|
|
- Verschiedene Passwörter für Dev/Staging/Prod
|
|
- Password-Generator verwenden (z.B. `openssl rand -base64 32`)
|
|
|
|
3. **Erweiterte Sicherheit (Optional):**
|
|
- HashiCorp Vault für zentrale Secret-Verwaltung
|
|
- Docker Secrets (für Docker Swarm)
|
|
- Cloud-Lösungen: AWS Secrets Manager, Azure Key Vault
|
|
|
|
4. **Wichtige Checkliste:**
|
|
- [ ] `.env` in `.gitignore` aufnehmen
|
|
- [ ] Neue Credentials für Produktion generieren
|
|
- [ ] Backup der Credentials an sicherem Ort
|
|
- [ ] Regelmäßige Passwort-Rotation planen
|
|
- [ ] Keine Default-Passwörter verwenden
|
|
|
|
---
|
|
|
|
## Änderungsprotokoll
|
|
|
|
### 2025-01-06 - Journal erstellt
|
|
- Initialer Projektstand dokumentiert
|
|
- Aufgabenliste priorisiert
|
|
- Technische Anforderungen festgehalten
|
|
|
|
### 2025-01-06 - UTF-8 Support implementiert
|
|
- Flask App Konfiguration für UTF-8 hinzugefügt (JSON_AS_ASCII=False)
|
|
- PostgreSQL Verbindung mit UTF-8 client_encoding
|
|
- HTML Forms mit accept-charset="UTF-8"
|
|
- Dockerfile mit deutschen Locale-Einstellungen (de_DE.UTF-8)
|
|
- PostgreSQL Container mit UTF-8 Initialisierung
|
|
- init.sql mit SET client_encoding = 'UTF8'
|
|
|
|
**Geänderte Dateien:**
|
|
- v2_adminpanel/app.py
|
|
- v2_adminpanel/templates/index.html
|
|
- v2_adminpanel/init.sql
|
|
- v2_adminpanel/Dockerfile
|
|
- v2/docker-compose.yaml
|
|
|
|
**Nächster Test:**
|
|
- Container neu bauen und starten
|
|
- Kundennamen mit Umlauten testen (z.B. "Müller GmbH", "Björn Schäfer")
|
|
- Email mit Umlauten testen
|
|
|
|
### 2025-01-06 - Lizenzübersicht implementiert
|
|
- Neue Route `/licenses` für Lizenzübersicht
|
|
- SQL-Query mit JOIN zwischen licenses und customers
|
|
- Status-Berechnung (aktiv, läuft bald ab, abgelaufen)
|
|
- Farbcodierung für verschiedene Status
|
|
- Navigation zwischen Lizenz erstellen und Übersicht
|
|
|
|
**Neue Features:**
|
|
- Anzeige aller Lizenzen mit Kundeninformationen
|
|
- Status-Anzeige basierend auf Ablaufdatum
|
|
- Unterscheidung zwischen Voll- und Testversion
|
|
- Responsive Tabelle mit Bootstrap
|
|
- Link von Dashboard zur Übersicht und zurück
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/app.py (neue Route hinzugefügt)
|
|
- v2_adminpanel/templates/licenses.html (neu erstellt)
|
|
- v2_adminpanel/templates/index.html (Navigation ergänzt)
|
|
|
|
**Nächster Test:**
|
|
- Container neu starten
|
|
- Mehrere Lizenzen mit verschiedenen Ablaufdaten erstellen
|
|
- Lizenzübersicht unter /licenses aufrufen
|
|
|
|
### 2025-01-06 - Lizenz bearbeiten/löschen implementiert
|
|
- Neue Routen für Bearbeiten und Löschen von Lizenzen
|
|
- Bearbeitungsformular mit vorausgefüllten Werten
|
|
- Aktiv/Inaktiv-Status kann geändert werden
|
|
- Lösch-Bestätigung per JavaScript confirm()
|
|
- Kunde kann nicht geändert werden (nur Lizenzdetails)
|
|
|
|
**Neue Features:**
|
|
- `/license/edit/<id>` - Bearbeitungsformular
|
|
- `/license/delete/<id>` - Lizenz löschen (POST)
|
|
- Aktionen-Spalte in der Lizenzübersicht
|
|
- Buttons für Bearbeiten und Löschen
|
|
- Checkbox für Aktiv-Status
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/app.py (edit_license und delete_license Routen)
|
|
- v2_adminpanel/templates/licenses.html (Aktionen-Spalte hinzugefügt)
|
|
- v2_adminpanel/templates/edit_license.html (neu erstellt)
|
|
|
|
**Sicherheit:**
|
|
- Login-Required für alle Aktionen
|
|
- POST-only für Löschvorgänge
|
|
- Bestätigungsdialog vor dem Löschen
|
|
|
|
### 2025-01-06 - Kundenverwaltung implementiert
|
|
- Komplette CRUD-Funktionalität für Kunden
|
|
- Übersicht zeigt Anzahl aktiver/gesamter Lizenzen pro Kunde
|
|
- Kunden können nur gelöscht werden, wenn sie keine Lizenzen haben
|
|
- Bearbeitungsseite zeigt alle Lizenzen des Kunden
|
|
|
|
**Neue Features:**
|
|
- `/customers` - Kundenübersicht mit Statistiken
|
|
- `/customer/edit/<id>` - Kunde bearbeiten (Name, E-Mail)
|
|
- `/customer/delete/<id>` - Kunde löschen (nur ohne Lizenzen)
|
|
- Navigation zwischen allen drei Hauptbereichen
|
|
- Anzeige der Kundenlizenzen beim Bearbeiten
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/app.py (customers, edit_customer, delete_customer Routen)
|
|
- v2_adminpanel/templates/customers.html (neu erstellt)
|
|
- v2_adminpanel/templates/edit_customer.html (neu erstellt)
|
|
- v2_adminpanel/templates/index.html (Navigation erweitert)
|
|
- v2_adminpanel/templates/licenses.html (Navigation erweitert)
|
|
|
|
**Besonderheiten:**
|
|
- Lösch-Button ist deaktiviert, wenn Kunde Lizenzen hat
|
|
- Aktive Lizenzen werden separat gezählt (nicht abgelaufen + aktiv)
|
|
- UTF-8 Support für Kundennamen mit Umlauten
|
|
|
|
### 2025-01-06 - Dashboard mit Statistiken implementiert
|
|
- Übersichtliches Dashboard als neue Startseite
|
|
- Statistik-Karten mit wichtigen Kennzahlen
|
|
- Listen für bald ablaufende und zuletzt erstellte Lizenzen
|
|
- Routing angepasst: Dashboard (/) und Lizenz erstellen (/create)
|
|
|
|
**Neue Features:**
|
|
- Statistik-Karten: Kunden, Lizenzen gesamt, Aktive, Ablaufende
|
|
- Aufteilung nach Lizenztypen (Vollversion/Testversion)
|
|
- Aufteilung nach Status (Aktiv/Abgelaufen)
|
|
- Top 10 bald ablaufende Lizenzen mit Restlaufzeit
|
|
- Letzte 5 erstellte Lizenzen mit Status
|
|
- Hover-Effekt auf Statistik-Karten
|
|
- Einheitliche Navigation mit Dashboard-Link
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/app.py (dashboard() komplett überarbeitet, create_license() Route)
|
|
- v2_adminpanel/templates/dashboard.html (neu erstellt)
|
|
- v2_adminpanel/templates/index.html (Navigation erweitert)
|
|
- v2_adminpanel/templates/licenses.html (Navigation angepasst)
|
|
- v2_adminpanel/templates/customers.html (Navigation angepasst)
|
|
|
|
**Dashboard-Inhalte:**
|
|
- 4 Hauptstatistiken als Karten
|
|
- Lizenztyp-Verteilung
|
|
- Status-Verteilung
|
|
- Warnung für bald ablaufende Lizenzen
|
|
- Übersicht der neuesten Aktivitäten
|
|
|
|
### 2025-01-06 - Suchfunktion implementiert
|
|
- Volltextsuche für Lizenzen und Kunden
|
|
- Case-insensitive Suche mit LIKE-Operator
|
|
- Suchergebnisse mit Hervorhebung des Suchbegriffs
|
|
- Suche zurücksetzen Button
|
|
|
|
**Neue Features:**
|
|
- **Lizenzsuche**: Sucht in Lizenzschlüssel, Kundenname und E-Mail
|
|
- **Kundensuche**: Sucht in Kundenname und E-Mail
|
|
- Suchformular mit autofocus für schnelle Eingabe
|
|
- Anzeige des aktiven Suchbegriffs
|
|
- Unterschiedliche Meldungen für leere Ergebnisse
|
|
|
|
**Geänderte Dateien:**
|
|
- v2_adminpanel/app.py (licenses() und customers() mit Suchlogik erweitert)
|
|
- v2_adminpanel/templates/licenses.html (Suchformular hinzugefügt)
|
|
- v2_adminpanel/templates/customers.html (Suchformular hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- GET-Parameter für Suche
|
|
- SQL LIKE mit LOWER() für Case-Insensitive Suche
|
|
- Wildcards (%) für Teilstring-Suche
|
|
- UTF-8 kompatibel für deutsche Umlaute
|
|
|
|
### 2025-01-06 - Filter und Pagination implementiert
|
|
- Erweiterte Filteroptionen für Lizenzübersicht
|
|
- Pagination für große Datenmengen (20 Einträge pro Seite)
|
|
- Filter bleiben bei Seitenwechsel erhalten
|
|
|
|
**Neue Features für Lizenzen:**
|
|
- **Filter nach Typ**: Alle, Vollversion, Testversion
|
|
- **Filter nach Status**: Alle, Aktiv, Läuft bald ab, Abgelaufen, Deaktiviert
|
|
- **Kombinierbar mit Suche**: Filter und Suche funktionieren zusammen
|
|
- **Pagination**: Navigation durch mehrere Seiten
|
|
- **Ergebnisanzeige**: Zeigt Anzahl gefilterter Ergebnisse
|
|
|
|
**Neue Features für Kunden:**
|
|
- **Pagination**: 20 Kunden pro Seite
|
|
- **Seitennavigation**: Erste, Letzte, Vor, Zurück
|
|
- **Kombiniert mit Suche**: Suchparameter bleiben erhalten
|
|
|
|
**Geänderte Dateien:**
|
|
- v2_adminpanel/app.py (licenses() und customers() mit Filter/Pagination erweitert)
|
|
- v2_adminpanel/templates/licenses.html (Filter-Formular und Pagination hinzugefügt)
|
|
- v2_adminpanel/templates/customers.html (Pagination hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- SQL WHERE-Klauseln für Filter
|
|
- LIMIT/OFFSET für Pagination
|
|
- URL-Parameter bleiben bei Navigation erhalten
|
|
- Responsive Bootstrap-Komponenten
|
|
|
|
### 2025-01-06 - Session-Tracking implementiert
|
|
- Neue Tabelle für Session-Verwaltung
|
|
- Anzeige aktiver und beendeter Sessions
|
|
- Manuelles Beenden von Sessions möglich
|
|
- Dashboard zeigt Anzahl aktiver Sessions
|
|
|
|
**Neue Features:**
|
|
- **Sessions-Tabelle**: Speichert Session-ID, IP, User-Agent, Zeitstempel
|
|
- **Aktive Sessions**: Zeigt alle laufenden Sessions mit Inaktivitätszeit
|
|
- **Session-Historie**: Letzte 24 Stunden beendeter Sessions
|
|
- **Session beenden**: Admins können Sessions manuell beenden
|
|
- **Farbcodierung**: Grün (aktiv), Gelb (>5 Min inaktiv), Rot (lange inaktiv)
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/init.sql (sessions Tabelle hinzugefügt)
|
|
- v2_adminpanel/app.py (sessions() und end_session() Routen)
|
|
- v2_adminpanel/templates/sessions.html (neu erstellt)
|
|
- v2_adminpanel/templates/dashboard.html (Session-Statistik)
|
|
- Alle Templates (Session-Navigation hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- Heartbeat-basiertes Tracking (last_heartbeat)
|
|
- Automatische Inaktivitätsberechnung
|
|
- Session-Dauer Berechnung
|
|
- Responsive Tabellen mit Bootstrap
|
|
|
|
**Hinweis:**
|
|
Die Session-Daten werden erst gefüllt, wenn der License Server API implementiert ist und Clients sich verbinden.
|
|
|
|
### 2025-01-06 - Export-Funktion implementiert
|
|
- CSV und Excel Export für Lizenzen und Kunden
|
|
- Formatierte Ausgabe mit deutschen Datumsformaten
|
|
- UTF-8 Unterstützung für Sonderzeichen
|
|
|
|
**Neue Features:**
|
|
- **Lizenz-Export**: Alle Lizenzen mit Kundeninformationen
|
|
- **Kunden-Export**: Alle Kunden mit Lizenzstatistiken
|
|
- **Format-Optionen**: Excel (.xlsx) und CSV (.csv)
|
|
- **Deutsche Formatierung**: Datum als dd.mm.yyyy, Status auf Deutsch
|
|
- **UTF-8 Export**: Korrekte Kodierung für Umlaute
|
|
- **Export-Buttons**: Dropdown-Menüs in Lizenz- und Kundenübersicht
|
|
|
|
**Geänderte Dateien:**
|
|
- v2_adminpanel/app.py (export_licenses() und export_customers() Routen)
|
|
- v2_adminpanel/requirements.txt (pandas und openpyxl hinzugefügt)
|
|
- v2_adminpanel/templates/licenses.html (Export-Dropdown hinzugefügt)
|
|
- v2_adminpanel/templates/customers.html (Export-Dropdown hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- Pandas für Datenverarbeitung
|
|
- OpenPyXL für Excel-Export
|
|
- CSV mit Semikolon-Trennung für deutsche Excel-Kompatibilität
|
|
- Automatische Spaltenbreite in Excel
|
|
- BOM für UTF-8 CSV (Excel-Kompatibilität)
|
|
|
|
### 2025-01-06 - Audit-Log implementiert
|
|
- Vollständiges Änderungsprotokoll für alle Aktionen
|
|
- Filterbare Übersicht mit Pagination
|
|
- Detaillierte Anzeige von Änderungen
|
|
|
|
**Neue Features:**
|
|
- **Audit-Log-Tabelle**: Speichert alle Änderungen mit Zeitstempel, Benutzer, IP
|
|
- **Protokollierte Aktionen**: CREATE, UPDATE, DELETE, LOGIN, LOGOUT, EXPORT
|
|
- **JSON-Speicherung**: Alte und neue Werte als JSONB für flexible Abfragen
|
|
- **Filter-Optionen**: Nach Benutzer, Aktion und Entität
|
|
- **Detail-Anzeige**: Aufklappbare Änderungsdetails
|
|
- **Navigation**: Audit-Link in allen Templates
|
|
|
|
**Geänderte/Neue Dateien:**
|
|
- v2_adminpanel/init.sql (audit_log Tabelle mit Indizes)
|
|
- v2_adminpanel/app.py (log_audit() Funktion und audit_log() Route)
|
|
- v2_adminpanel/templates/audit_log.html (neu erstellt)
|
|
- Alle Templates (Audit-Navigation hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- JSONB für strukturierte Datenspeicherung
|
|
- Performance-Indizes auf timestamp, username und entity
|
|
- Farbcodierung für verschiedene Aktionen
|
|
- 50 Einträge pro Seite mit Pagination
|
|
- IP-Adresse und User-Agent Tracking
|
|
|
|
### 2025-01-06 - PostgreSQL UTF-8 Locale konfiguriert
|
|
- Eigenes PostgreSQL Dockerfile für deutsche Locale
|
|
- Sicherstellung der UTF-8 Unterstützung auf Datenbankebene
|
|
|
|
**Neue Features:**
|
|
- **PostgreSQL Dockerfile**: Installiert deutsche Locale (de_DE.UTF-8)
|
|
- **Locale-Umgebungsvariablen**: LANG, LANGUAGE, LC_ALL gesetzt
|
|
- **Docker Compose Update**: Verwendet jetzt eigenes PostgreSQL-Image
|
|
|
|
**Neue Dateien:**
|
|
- v2_postgres/Dockerfile (neu erstellt)
|
|
|
|
**Geänderte Dateien:**
|
|
- v2/docker-compose.yaml (postgres Service nutzt jetzt build statt image)
|
|
|
|
**Technische Details:**
|
|
- Basis-Image: postgres:14
|
|
- Locale-Installation über apt-get
|
|
- locale-gen für de_DE.UTF-8
|
|
- Vollständige UTF-8 Unterstützung für deutsche Sonderzeichen
|
|
|
|
### 2025-01-07 - Backup-Funktionalität implementiert
|
|
- Verschlüsselte Backups mit manueller und automatischer Ausführung
|
|
- Backup-Historie mit Download und Wiederherstellung
|
|
- Dashboard-Integration für Backup-Status
|
|
|
|
**Neue Features:**
|
|
- **Backup-Erstellung**: Manuell und automatisch (täglich 3:00 Uhr)
|
|
- **Verschlüsselung**: AES-256 mit Fernet, Key aus ENV oder automatisch generiert
|
|
- **Komprimierung**: GZIP-Komprimierung vor Verschlüsselung
|
|
- **Backup-Historie**: Vollständige Übersicht aller Backups
|
|
- **Wiederherstellung**: Mit optionalem Verschlüsselungs-Passwort
|
|
- **Download-Funktion**: Backups können heruntergeladen werden
|
|
- **Dashboard-Widget**: Zeigt letztes Backup-Status
|
|
- **E-Mail-Vorbereitung**: Struktur für Benachrichtigungen (deaktiviert)
|
|
|
|
**Neue/Geänderte Dateien:**
|
|
- v2_adminpanel/init.sql (backup_history Tabelle hinzugefügt)
|
|
- v2_adminpanel/requirements.txt (cryptography, apscheduler hinzugefügt)
|
|
- v2_adminpanel/app.py (Backup-Funktionen und Routen)
|
|
- v2_adminpanel/templates/backups.html (neu erstellt)
|
|
- v2_adminpanel/templates/dashboard.html (Backup-Status-Widget)
|
|
- v2_adminpanel/Dockerfile (PostgreSQL-Client installiert)
|
|
- v2/.env (EMAIL_ENABLED und BACKUP_ENCRYPTION_KEY)
|
|
- Alle Templates (Backup-Navigation hinzugefügt)
|
|
|
|
**Technische Details:**
|
|
- Speicherort: C:\Users\Administrator\Documents\GitHub\v2-Docker\backups\
|
|
- Dateiformat: backup_v2docker_YYYYMMDD_HHMMSS_encrypted.sql.gz.enc
|
|
- APScheduler für automatische Backups
|
|
- pg_dump/psql für Datenbank-Operationen
|
|
- Audit-Log für alle Backup-Aktionen
|
|
- Sicherheitsabfrage bei Wiederherstellung
|
|
|
|
### 2025-01-07 - HTTPS/SSL und Internet-Zugriff implementiert
|
|
- Nginx Reverse Proxy für externe Erreichbarkeit eingerichtet
|
|
- SSL-Zertifikate von IONOS mit vollständiger Certificate Chain integriert
|
|
- Netzwerkkonfiguration für feste IP-Adresse
|
|
- DynDNS und Port-Forwarding konfiguriert
|
|
|
|
**Neue Features:**
|
|
- **Nginx Reverse Proxy**: Leitet HTTPS-Anfragen an Container weiter
|
|
- **SSL-Zertifikate**: Wildcard-Zertifikat von IONOS für *.z5m7q9dk3ah2v1plx6ju.com
|
|
- **Certificate Chain**: Server-, Intermediate- und Root-Zertifikate kombiniert
|
|
- **Subdomain-Routing**: admin-panel-undso und api-software-undso
|
|
- **Port-Forwarding**: FRITZ!Box 443 → 192.168.178.88
|
|
- **Feste IP**: Windows-PC auf 192.168.178.88 konfiguriert
|
|
|
|
**Neue/Geänderte Dateien:**
|
|
- v2_nginx/nginx.conf (Reverse Proxy Konfiguration)
|
|
- v2_nginx/Dockerfile (Nginx Container mit SSL)
|
|
- v2_nginx/ssl/fullchain.pem (Certificate Chain)
|
|
- v2_nginx/ssl/privkey.pem (Private Key)
|
|
- v2/docker-compose.yaml (nginx Service hinzugefügt)
|
|
- set-static-ip.ps1 (PowerShell Script für feste IP)
|
|
- reset-to-dhcp.ps1 (PowerShell Script für DHCP)
|
|
|
|
**Technische Details:**
|
|
- SSL-Termination am Nginx Reverse Proxy
|
|
- Backend-Kommunikation über Docker-internes Netzwerk
|
|
- Admin-Panel nur noch über Nginx erreichbar (Port 443 nicht mehr exposed)
|
|
- License-Server behält externen Port 8443 für direkte API-Zugriffe
|
|
- Intermediate Certificates aus ZIP extrahiert und korrekt verkettet
|
|
|
|
**Zugangsdaten:**
|
|
- Admin-Panel: https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com
|
|
- Benutzer 1: rac00n
|
|
- Benutzer 2: w@rh@mm3r
|
|
|
|
**Status:**
|
|
- ✅ Admin-Panel extern erreichbar ohne SSL-Warnungen
|
|
- ✅ Reverse Proxy funktioniert
|
|
- ✅ SSL-Zertifikate korrekt konfiguriert
|
|
- ✅ Netzwerk-Setup abgeschlossen
|
|
|
|
### 2025-01-07 - Projekt-Cleanup durchgeführt
|
|
- Redundante und überflüssige Dateien entfernt
|
|
- Projektstruktur verbessert und organisiert
|
|
|
|
**Durchgeführte Änderungen:**
|
|
1. **Entfernte Dateien:**
|
|
- v2_adminpanel/templates/.env (Duplikat der Haupt-.env)
|
|
- v2_postgreSQL/ (leeres Verzeichnis)
|
|
- SSL-Zertifikate aus Root-Verzeichnis (7 Dateien)
|
|
- Ungenutzer `json` Import aus app.py
|
|
|
|
2. **Organisatorische Verbesserungen:**
|
|
- PowerShell-Scripts in neuen `scripts/` Ordner verschoben
|
|
- SSL-Zertifikate nur noch in v2_nginx/ssl/
|
|
- Keine Konfigurationsdateien mehr in Template-Verzeichnissen
|
|
|
|
**Technische Details:**
|
|
- Docker-Container wurden gestoppt und nach Cleanup neu gestartet
|
|
- Alle Services laufen wieder normal
|
|
- Keine funktionalen Änderungen, nur Struktur-Verbesserungen
|
|
|
|
**Ergebnis:**
|
|
- Verbesserte Projektstruktur
|
|
- Erhöhte Sicherheit (keine SSL-Zertifikate im Root)
|
|
- Klarere Dateiorganisation
|
|
|
|
### 2025-01-07 - SSL "Nicht sicher" Problem behoben
|
|
- Chrome-Warnung trotz gültigem Zertifikat analysiert und behoben
|
|
- Ursache: Selbstsigniertes Zertifikat in der Admin Panel Flask-App
|
|
|
|
**Durchgeführte Änderungen:**
|
|
1. **Admin Panel Konfiguration (app.py):**
|
|
- Von HTTPS mit selbstsigniertem Zertifikat auf HTTP Port 5000 umgestellt
|
|
- `ssl_context='adhoc'` entfernt
|
|
- Flask läuft jetzt auf `0.0.0.0:5000` statt HTTPS
|
|
|
|
2. **Dockerfile Anpassung (v2_adminpanel/Dockerfile):**
|
|
- EXPOSE Port von 443 auf 5000 geändert
|
|
- Container exponiert jetzt HTTP statt HTTPS
|
|
|
|
3. **Nginx Konfiguration (nginx.conf):**
|
|
- proxy_pass von `https://admin-panel:443` auf `http://admin-panel:5000` geändert
|
|
- `proxy_ssl_verify off` entfernt (nicht mehr benötigt)
|
|
- Sicherheits-Header für beide Domains hinzugefügt:
|
|
- Strict-Transport-Security (HSTS) - erzwingt HTTPS für 1 Jahr
|
|
- X-Content-Type-Options - verhindert MIME-Type Sniffing
|
|
- X-Frame-Options - Schutz vor Clickjacking
|
|
- X-XSS-Protection - aktiviert XSS-Filter
|
|
- Referrer-Policy - kontrolliert Referrer-Informationen
|
|
|
|
**Technische Details:**
|
|
- Externer Traffic nutzt weiterhin HTTPS mit gültigen IONOS-Zertifikaten
|
|
- Interne Kommunikation zwischen Nginx und Admin Panel läuft über HTTP (sicher im Docker-Netzwerk)
|
|
- Kein selbstsigniertes Zertifikat mehr in der Zertifikatskette
|
|
- SSL-Termination erfolgt ausschließlich am Nginx Reverse Proxy
|
|
|
|
**Docker Neustart:**
|
|
- Container gestoppt (`docker-compose down`)
|
|
- Images neu gebaut (`docker-compose build`)
|
|
- Container neu gestartet (`docker-compose up -d`)
|
|
- Alle Services laufen normal
|
|
|
|
**Ergebnis:**
|
|
- ✅ "Nicht sicher" Warnung in Chrome behoben
|
|
- ✅ Saubere SSL-Konfiguration ohne Mixed Content
|
|
- ✅ Verbesserte Sicherheits-Header implementiert
|
|
- ✅ Admin Panel zeigt jetzt grünes Schloss-Symbol
|
|
|
|
### 2025-01-07 - Sicherheitslücke geschlossen: License Server Port
|
|
- Direkter Zugriff auf License Server Port 8443 entfernt
|
|
- Sicherheitsanalyse der exponierten Ports durchgeführt
|
|
|
|
**Identifiziertes Problem:**
|
|
- License Server war direkt auf Port 8443 von außen erreichbar
|
|
- Umging damit die Nginx-Sicherheitsschicht und Security Headers
|
|
- Besonders kritisch, da nur Platzhalter ohne echte Sicherheit
|
|
|
|
**Durchgeführte Änderung:**
|
|
- Port-Mapping für License Server in docker-compose.yaml entfernt
|
|
- Service ist jetzt nur noch über Nginx Reverse Proxy erreichbar
|
|
- Gleiche Sicherheitskonfiguration wie Admin Panel
|
|
|
|
**Aktuelle Port-Exposition:**
|
|
- ✅ Nginx: Port 80/443 (benötigt für externen Zugriff)
|
|
- ✅ PostgreSQL: Keine Ports exponiert (gut)
|
|
- ✅ Admin Panel: Nur über Nginx erreichbar
|
|
- ✅ License Server: Nur über Nginx erreichbar (vorher direkt auf 8443)
|
|
|
|
**Weitere identifizierte Sicherheitsthemen:**
|
|
1. Credentials im Klartext in .env Datei
|
|
2. SSL-Zertifikate im Repository gespeichert
|
|
3. License Server noch nicht implementiert
|
|
|
|
**Empfehlung:** Docker-Container neu starten für Änderungsübernahme
|
|
|
|
### 2025-01-07 - License Server Port 8443 wieder aktiviert
|
|
- Port 8443 für direkten Zugriff auf License Server wieder geöffnet
|
|
- Notwendig für Client-Software Lizenzprüfung
|
|
|
|
**Begründung:**
|
|
- Client-Software benötigt direkten Zugriff für Lizenzprüfung
|
|
- Umgehung von möglichen Firewall-Blockaden auf Port 443
|
|
- Weniger Latenz ohne Nginx-Proxy
|
|
- Flexibilität für verschiedene Client-Implementierungen
|
|
|
|
**Konfiguration:**
|
|
- License Server erreichbar über:
|
|
- Direkt: Port 8443 (für Client-Software)
|
|
- Via Nginx: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com (für Browser/Tests)
|
|
|
|
**Sicherheitshinweis:**
|
|
- Port 8443 ist wieder direkt exponiert
|
|
- License Server muss vor Produktivbetrieb implementiert werden mit:
|
|
- Eigener SSL-Konfiguration
|
|
- API-Key Authentifizierung
|
|
- Rate Limiting
|
|
- Input-Validierung
|
|
|
|
**Status:**
|
|
- Port-Mapping in docker-compose.yaml wiederhergestellt
|
|
- Änderung erfordert Docker-Neustart
|
|
|
|
### 2025-01-07 - Rate-Limiting und Brute-Force-Schutz implementiert
|
|
- Umfassender Schutz vor Login-Angriffen mit IP-Sperre
|
|
- Dashboard-Integration für Sicherheitsüberwachung
|
|
|
|
**Implementierte Features:**
|
|
1. **Rate-Limiting System:**
|
|
- 5 Login-Versuche erlaubt, danach 24h IP-Sperre
|
|
- Progressive Fehlermeldungen (zufällig aus 5 lustigen Varianten)
|
|
- CAPTCHA nach 2 Fehlversuchen (Google reCAPTCHA v2 vorbereitet)
|
|
- E-Mail-Benachrichtigung bei Sperrung (vorbereitet, deaktiviert für PoC)
|
|
|
|
2. **Timing-Attack Schutz:**
|
|
- Mindestens 1 Sekunde Antwortzeit bei allen Login-Versuchen
|
|
- Gleiche Antwortzeit bei richtigem/falschem Username
|
|
- Verhindert Username-Enumeration
|
|
|
|
3. **Lustige Fehlermeldungen (zufällig):**
|
|
- "NOPE!"
|
|
- "ACCESS DENIED, TRY HARDER"
|
|
- "WRONG! 🚫"
|
|
- "COMPUTER SAYS NO"
|
|
- "YOU FAILED"
|
|
|
|
4. **Dashboard-Sicherheitswidget:**
|
|
- Sicherheitslevel-Anzeige (NORMAL/ERHÖHT/KRITISCH)
|
|
- Anzahl gesperrter IPs
|
|
- Fehlversuche heute
|
|
- Letzte 5 Sicherheitsereignisse mit Details
|
|
|
|
5. **IP-Verwaltung:**
|
|
- Übersicht aller gesperrten IPs
|
|
- Manuelles Entsperren möglich
|
|
- Login-Versuche zurücksetzen
|
|
- Detaillierte Informationen pro IP
|
|
|
|
6. **Audit-Log Erweiterungen:**
|
|
- LOGIN_SUCCESS - Erfolgreiche Anmeldung
|
|
- LOGIN_FAILED - Fehlgeschlagener Versuch
|
|
- LOGIN_BLOCKED - IP wurde gesperrt
|
|
- UNBLOCK_IP - IP manuell entsperrt
|
|
- CLEAR_ATTEMPTS - Versuche zurückgesetzt
|
|
|
|
**Neue/Geänderte Dateien:**
|
|
- v2_adminpanel/init.sql (login_attempts Tabelle)
|
|
- v2_adminpanel/app.py (Rate-Limiting Logik, neue Routen)
|
|
- v2_adminpanel/templates/login.html (Fehlermeldungs-Styling, CAPTCHA)
|
|
- v2_adminpanel/templates/dashboard.html (Sicherheitswidget)
|
|
- v2_adminpanel/templates/blocked_ips.html (neu - IP-Verwaltung)
|
|
|
|
**Technische Details:**
|
|
- IP-Ermittlung berücksichtigt Proxy-Header (X-Forwarded-For)
|
|
- Fehlermeldungen mit Animation (shake-effect)
|
|
- Farbcodierung: Rot für Fehler, Lila für Sperre, Orange für CAPTCHA
|
|
- Automatische Bereinigung alter Einträge möglich
|
|
|
|
**Sicherheitsverbesserungen:**
|
|
- Schutz vor Brute-Force-Angriffen
|
|
- Timing-Attack-Schutz implementiert
|
|
- IP-basierte Sperrung für 24 Stunden
|
|
- Audit-Trail für alle Sicherheitsereignisse
|
|
|
|
**Hinweis für Produktion:**
|
|
- CAPTCHA-Keys müssen in .env konfiguriert werden
|
|
- E-Mail-Server für Benachrichtigungen einrichten
|
|
- Rate-Limits können über Konstanten angepasst werden
|
|
|
|
### 2025-01-07 - Session-Timeout mit Live-Timer implementiert
|
|
- 5 Minuten Inaktivitäts-Timeout mit visueller Countdown-Anzeige
|
|
- Automatische Session-Verlängerung bei Benutzeraktivität
|
|
|
|
**Implementierte Features:**
|
|
1. **Session-Timeout Backend:**
|
|
- Flask Session-Timeout auf 5 Minuten konfiguriert
|
|
- Heartbeat-Endpoint für Keep-Alive
|
|
- Automatisches Session-Update bei jeder Aktion
|
|
|
|
2. **Live-Timer in der Navbar:**
|
|
- Countdown von 5:00 bis 0:00
|
|
- Position: Zwischen Logo und Username
|
|
- Farbwechsel nach verbleibender Zeit:
|
|
- Grün: > 2 Minuten
|
|
- Gelb: 1-2 Minuten
|
|
- Rot: < 1 Minute
|
|
- Blinkend: < 30 Sekunden
|
|
|
|
3. **Benutzerinteraktion:**
|
|
- Timer wird bei jeder Aktivität zurückgesetzt
|
|
- Tracking von: Klicks, Tastatureingaben, Mausbewegungen
|
|
- Automatischer Heartbeat bei Aktivität
|
|
- Warnung bei < 1 Minute mit "Session verlängern" Button
|
|
|
|
4. **Base-Template System:**
|
|
- Neue base.html als Basis für alle Admin-Seiten
|
|
- Alle Templates (außer login.html) nutzen jetzt base.html
|
|
- Einheitliches Layout und Timer auf allen Seiten
|
|
|
|
**Neue/Geänderte Dateien:**
|
|
- v2_adminpanel/app.py (Session-Konfiguration, Heartbeat-Endpoint)
|
|
- v2_adminpanel/templates/base.html (neu - Base-Template mit Timer)
|
|
- Alle anderen Templates aktualisiert für Template-Vererbung
|
|
|
|
**Technische Details:**
|
|
- JavaScript-basierter Countdown-Timer
|
|
- AJAX-Heartbeat alle 5 Sekunden bei Aktivität
|
|
- LocalStorage für Tab-Synchronisation möglich
|
|
- Automatischer Logout bei 0:00
|
|
- Fetch-Interceptor für automatische Session-Verlängerung
|
|
|
|
**Sicherheitsverbesserung:**
|
|
- Automatischer Logout nach 5 Minuten Inaktivität
|
|
- Verhindert vergessene Sessions
|
|
- Visuelles Feedback für Session-Status
|
|
|
|
### 2025-01-07 - Session-Timeout Bug behoben
|
|
- Problem: Session-Timeout funktionierte nicht korrekt - Session blieb länger als 5 Minuten aktiv
|
|
- Ursache: login_required Decorator aktualisierte last_activity bei JEDEM Request
|
|
|
|
**Durchgeführte Änderungen:**
|
|
1. **login_required Decorator (app.py):**
|
|
- Prüft jetzt ob Session abgelaufen ist (5 Minuten seit last_activity)
|
|
- Aktualisiert last_activity NICHT mehr automatisch
|
|
- Führt AUTO_LOGOUT mit Audit-Log bei Timeout durch
|
|
- Speichert Username vor session.clear() für korrektes Logging
|
|
|
|
2. **Heartbeat-Endpoint (app.py):**
|
|
- Geändert zu POST-only Endpoint
|
|
- Aktualisiert explizit last_activity wenn aufgerufen
|
|
- Wird nur bei aktiver Benutzerinteraktion aufgerufen
|
|
|
|
3. **Frontend Timer (base.html):**
|
|
- Heartbeat wird als POST Request gesendet
|
|
- trackActivity() ruft extendSession() ohne vorheriges resetTimer() auf
|
|
- Timer wird erst nach erfolgreichem Heartbeat zurückgesetzt
|
|
- AJAX Interceptor ignoriert Heartbeat-Requests
|
|
|
|
4. **Audit-Log Erweiterung:**
|
|
- Neue Aktion AUTO_LOGOUT hinzugefügt
|
|
- Orange Farbcodierung (#fd7e14)
|
|
- Zeigt Grund des Timeouts im Audit-Log
|
|
|
|
**Ergebnis:**
|
|
- ✅ Session läuft nach exakt 5 Minuten Inaktivität ab
|
|
- ✅ Benutzeraktivität verlängert Session korrekt
|
|
- ✅ AUTO_LOGOUT wird im Audit-Log protokolliert
|
|
- ✅ Visueller Timer zeigt verbleibende Zeit
|
|
|
|
### 2025-01-07 - Session-Timeout weitere Verbesserungen
|
|
- Zusätzliche Fixes nach Test-Feedback implementiert
|
|
|
|
**Weitere durchgeführte Änderungen:**
|
|
1. **Fehlender Import behoben:**
|
|
- `flash` zu Flask-Imports hinzugefügt für Timeout-Warnmeldungen
|
|
|
|
2. **Session-Cookie-Konfiguration erweitert (app.py):**
|
|
- SESSION_COOKIE_HTTPONLY = True (Sicherheit gegen XSS)
|
|
- SESSION_COOKIE_SECURE = False (intern HTTP, extern HTTPS via Nginx)
|
|
- SESSION_COOKIE_SAMESITE = 'Lax' (CSRF-Schutz)
|
|
- SESSION_COOKIE_NAME = 'admin_session' (eindeutiger Name)
|
|
- SESSION_REFRESH_EACH_REQUEST = False (verhindert automatische Verlängerung)
|
|
|
|
3. **Session-Handling verbessert:**
|
|
- Entfernt: session.permanent = True aus login_required decorator
|
|
- Hinzugefügt: session.modified = True im Heartbeat für explizites Speichern
|
|
- Debug-Logging für Session-Timeout-Prüfung hinzugefügt
|
|
|
|
4. **Nginx-Konfiguration:**
|
|
- Bereits korrekt konfiguriert für Heartbeat-Weiterleitung
|
|
- Proxy-Headers für korrekte IP-Weitergabe
|
|
|
|
**Technische Details:**
|
|
- Flask-Session mit Filesystem-Backend nutzt jetzt korrekte Cookie-Einstellungen
|
|
- Session-Cookie wird nicht mehr automatisch bei jedem Request verlängert
|
|
- Explizite Session-Modifikation nur bei Heartbeat-Requests
|
|
- Debug-Logs zeigen Zeit seit letzter Aktivität für Troubleshooting
|
|
|
|
**Status:**
|
|
- ✅ Session-Timeout-Mechanismus vollständig implementiert
|
|
- ✅ Debug-Logging für Session-Überwachung aktiv
|
|
- ✅ Cookie-Sicherheitseinstellungen optimiert
|
|
|
|
### 2025-01-07 - CAPTCHA Backend-Validierung implementiert
|
|
- Google reCAPTCHA v2 Backend-Verifizierung hinzugefügt
|
|
|
|
**Implementierte Features:**
|
|
1. **verify_recaptcha() Funktion (app.py):**
|
|
- Validiert CAPTCHA-Response mit Google API
|
|
- Fallback: Wenn RECAPTCHA_SECRET_KEY nicht konfiguriert, wird CAPTCHA übersprungen (für PoC)
|
|
- Timeout von 5 Sekunden für API-Request
|
|
- Error-Handling für Netzwerkfehler
|
|
- Logging für Debugging und Fehleranalyse
|
|
|
|
2. **Login-Route Erweiterungen:**
|
|
- CAPTCHA wird nach 2 Fehlversuchen angezeigt
|
|
- Prüfung ob CAPTCHA-Response vorhanden
|
|
- Validierung der CAPTCHA-Response gegen Google API
|
|
- Unterschiedliche Fehlermeldungen für fehlende/ungültige CAPTCHA
|
|
- Site Key wird aus Environment-Variable an Template übergeben
|
|
|
|
3. **Environment-Konfiguration (.env):**
|
|
- RECAPTCHA_SITE_KEY (für Frontend)
|
|
- RECAPTCHA_SECRET_KEY (für Backend-Validierung)
|
|
- Beide auskommentiert für PoC-Phase
|
|
|
|
4. **Dependencies:**
|
|
- requests Library zu requirements.txt hinzugefügt
|
|
|
|
**Sicherheitsaspekte:**
|
|
- CAPTCHA verhindert automatisierte Brute-Force-Angriffe
|
|
- Timing-Attack-Schutz bleibt auch bei CAPTCHA-Prüfung aktiv
|
|
- Bei Netzwerkfehlern wird CAPTCHA als bestanden gewertet (Verfügbarkeit vor Sicherheit)
|
|
- Secret Key wird niemals im Frontend exponiert
|
|
|
|
**Verwendung:**
|
|
1. Google reCAPTCHA v2 Keys erstellen: https://www.google.com/recaptcha/admin
|
|
2. Keys in .env eintragen:
|
|
```
|
|
RECAPTCHA_SITE_KEY=your-site-key
|
|
RECAPTCHA_SECRET_KEY=your-secret-key
|
|
```
|
|
3. Container neu starten
|
|
|
|
**Status:**
|
|
- ✅ CAPTCHA-Frontend bereits vorhanden (login.html)
|
|
- ✅ Backend-Validierung vollständig implementiert
|
|
- ✅ Fallback für PoC-Betrieb ohne Google-Keys
|
|
- ✅ Integration in Rate-Limiting-System
|
|
- ⚠️ CAPTCHA-Keys noch nicht konfiguriert (für PoC deaktiviert)
|
|
|
|
**Anleitung für Google reCAPTCHA Keys:**
|
|
|
|
1. **Registrierung bei Google reCAPTCHA:**
|
|
- Gehe zu: https://www.google.com/recaptcha/admin/create
|
|
- Melde dich mit Google-Konto an
|
|
- Label eingeben: "v2-Docker Admin Panel"
|
|
- Typ wählen: "reCAPTCHA v2" → "Ich bin kein Roboter"-Kästchen
|
|
- Domains hinzufügen:
|
|
```
|
|
admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com
|
|
localhost
|
|
```
|
|
- Nutzungsbedingungen akzeptieren
|
|
- Senden klicken
|
|
|
|
2. **Keys erhalten:**
|
|
- Site Key (öffentlich für Frontend)
|
|
- Secret Key (geheim für Backend-Validierung)
|
|
|
|
3. **Keys in .env eintragen:**
|
|
```bash
|
|
RECAPTCHA_SITE_KEY=6Ld...
|
|
RECAPTCHA_SECRET_KEY=6Ld...
|
|
```
|
|
|
|
4. **Container neu starten:**
|
|
```bash
|
|
docker-compose down
|
|
docker-compose up -d
|
|
```
|
|
|
|
**Kosten:**
|
|
- Kostenlos bis 1 Million Anfragen pro Monat
|
|
- Danach: $1.00 pro 1000 zusätzliche Anfragen
|
|
- Für dieses Projekt reicht die kostenlose Version vollkommen aus
|
|
|
|
**Test-Keys für Entwicklung:**
|
|
- Site Key: `6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI`
|
|
- Secret Key: `6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe`
|
|
- ⚠️ Diese Keys nur für lokale Tests verwenden, niemals produktiv!
|
|
|
|
**Aktueller Status:**
|
|
- Code ist vollständig implementiert und getestet
|
|
- CAPTCHA wird nach 2 Fehlversuchen angezeigt
|
|
- Ohne konfigurierte Keys wird CAPTCHA-Prüfung übersprungen
|
|
- Für Produktion müssen nur die Keys in .env eingetragen werden
|
|
|
|
### 2025-01-07 - License Key Generator implementiert
|
|
- Automatische Generierung von Lizenzschlüsseln mit definiertem Format
|
|
|
|
**Implementiertes Format:**
|
|
`AF-YYYYMMFT-XXXX-YYYY-ZZZZ`
|
|
- **AF** = Account Factory (feste Produktkennung)
|
|
- **YYYY** = Jahr (z.B. 2025)
|
|
- **MM** = Monat (z.B. 06)
|
|
- **FT** = Lizenztyp (F=Fullversion, T=Testversion)
|
|
- **XXXX-YYYY-ZZZZ** = Zufällige alphanumerische Zeichen (ohne verwirrende wie 0/O, 1/I/l)
|
|
|
|
**Beispiele:**
|
|
- Vollversion: `AF-202506F-A7K9-M3P2-X8R4`
|
|
- Testversion: `AF-202512T-B2N5-K8L3-Q9W7`
|
|
|
|
**Implementierte Features:**
|
|
|
|
1. **Backend-Funktionen (app.py):**
|
|
- `generate_license_key()` - Generiert Keys mit kryptografisch sicherem Zufallsgenerator
|
|
- `validate_license_key()` - Validiert das Key-Format mit Regex
|
|
- Verwendet `secrets` statt `random` für Sicherheit
|
|
- Erlaubte Zeichen: ABCDEFGHJKLMNPQRSTUVWXYZ23456789 (ohne verwirrende)
|
|
|
|
2. **API-Endpoint:**
|
|
- POST `/api/generate-license-key` - JSON API für Key-Generierung
|
|
- Prüft auf Duplikate in der Datenbank (max. 10 Versuche)
|
|
- Audit-Log-Eintrag bei jeder Generierung
|
|
- Login-Required geschützt
|
|
|
|
3. **Frontend-Verbesserungen (index.html):**
|
|
- Generate-Button neben License Key Input
|
|
- Placeholder und Pattern-Attribut für Format-Hinweis
|
|
- Auto-Uppercase bei manueller Eingabe
|
|
- Visuelles Feedback bei erfolgreicher Generierung
|
|
- Format-Hinweis unter dem Eingabefeld
|
|
|
|
4. **JavaScript-Features:**
|
|
- AJAX-basierte Key-Generierung ohne Seiten-Reload
|
|
- Automatische Prüfung bei Lizenztyp-Änderung
|
|
- Ladeindikator während der Generierung
|
|
- Fehlerbehandlung mit Benutzer-Feedback
|
|
- Standard-Datum-Einstellungen (heute + 1 Jahr)
|
|
|
|
5. **Validierung:**
|
|
- Server-seitige Format-Validierung beim Speichern
|
|
- Flash-Message bei ungültigem Format
|
|
- Automatische Großschreibung des Keys
|
|
- Pattern-Validierung im HTML-Formular
|
|
|
|
6. **Weitere Fixes:**
|
|
- Form Action von "/" auf "/create" korrigiert
|
|
- Flash-Messages mit Bootstrap Toasts implementiert
|
|
- GENERATE_KEY Aktion zum Audit-Log hinzugefügt (Farbe: #20c997)
|
|
|
|
**Technische Details:**
|
|
- Keine vorhersagbaren Muster durch `secrets.choice()`
|
|
- Datum im Key zeigt Erstellungszeitpunkt
|
|
- Lizenztyp direkt im Key erkennbar
|
|
- Kollisionsprüfung gegen Datenbank
|
|
|
|
**Status:**
|
|
- ✅ Backend-Generierung vollständig implementiert
|
|
- ✅ Frontend mit Generate-Button und JavaScript
|
|
- ✅ Validierung und Fehlerbehandlung
|
|
- ✅ Audit-Log-Integration
|
|
- ✅ Form-Action-Bug behoben
|
|
|
|
### 2025-01-07 - Batch-Lizenzgenerierung implementiert
|
|
- Mehrere Lizenzen auf einmal für einen Kunden erstellen
|
|
|
|
**Implementierte Features:**
|
|
|
|
1. **Batch-Formular (/batch):**
|
|
- Kunde und E-Mail eingeben
|
|
- Anzahl der Lizenzen (1-100)
|
|
- Lizenztyp (Vollversion/Testversion)
|
|
- Gültigkeitszeitraum für alle Lizenzen
|
|
- Vorschau-Modal zeigt Key-Format
|
|
- Standard-Datum-Einstellungen (heute + 1 Jahr)
|
|
|
|
2. **Backend-Verarbeitung:**
|
|
- Route `/batch` für GET (Formular) und POST (Generierung)
|
|
- Generiert die angegebene Anzahl eindeutiger Keys
|
|
- Speichert alle in einer Transaktion
|
|
- Kunde wird automatisch angelegt (falls nicht vorhanden)
|
|
- ON CONFLICT für existierende Kunden
|
|
- Audit-Log-Eintrag mit CREATE_BATCH Aktion
|
|
|
|
3. **Ergebnis-Seite:**
|
|
- Zeigt alle generierten Lizenzen in Tabellenform
|
|
- Kundeninformationen und Gültigkeitszeitraum
|
|
- Einzelne Keys können kopiert werden (📋 Button)
|
|
- Alle Keys auf einmal kopieren
|
|
- Druckfunktion für physische Ausgabe
|
|
- Link zur Lizenzübersicht mit Kundenfilter
|
|
|
|
4. **Export-Funktionalität:**
|
|
- Route `/batch/export` für CSV-Download
|
|
- Speichert Batch-Daten in Session für Export
|
|
- CSV mit UTF-8 BOM für Excel-Kompatibilität
|
|
- Enthält Kundeninfo, Generierungsdatum und alle Keys
|
|
- Format: Nr;Lizenzschlüssel;Typ
|
|
- Dateiname: batch_licenses_KUNDE_TIMESTAMP.csv
|
|
|
|
5. **Integration:**
|
|
- Batch-Button in Navigation (Dashboard, Einzellizenz-Seite)
|
|
- CREATE_BATCH Aktion im Audit-Log (Farbe: #6610f2)
|
|
- Session-basierte Export-Daten
|
|
- Flash-Messages für Feedback
|
|
|
|
**Sicherheit:**
|
|
- Limit von 100 Lizenzen pro Batch
|
|
- Login-Required für alle Routen
|
|
- Transaktionale Datenbank-Operationen
|
|
- Validierung der Eingaben
|
|
|
|
**Beispiel-Workflow:**
|
|
1. Admin geht zu `/batch`
|
|
2. Gibt Kunde "Firma GmbH", Anzahl "25", Typ "Vollversion" ein
|
|
3. System generiert 25 eindeutige Keys
|
|
4. Ergebnis-Seite zeigt alle Keys
|
|
5. Admin kann CSV exportieren oder Keys kopieren
|
|
6. Kunde erhält die Lizenzen
|
|
|
|
**Status:**
|
|
- ✅ Batch-Formular vollständig implementiert
|
|
- ✅ Backend-Generierung mit Transaktionen
|
|
- ✅ Export als CSV
|
|
- ✅ Copy-to-Clipboard Funktionalität
|
|
- ✅ Audit-Log-Integration
|
|
- ✅ Navigation aktualisiert
|
|
|
|
## 2025-06-06: Implementierung Searchable Dropdown für Kundenauswahl
|
|
|
|
**Problem:**
|
|
- Bei der Lizenzerstellung wurde immer ein neuer Kunde angelegt
|
|
- Keine Möglichkeit, Lizenzen für bestehende Kunden zu erstellen
|
|
- Bei vielen Kunden wäre ein normales Dropdown unübersichtlich
|
|
|
|
**Lösung:**
|
|
1. **Select2 Library** für searchable Dropdown integriert
|
|
2. **API-Endpoint `/api/customers`** für die Kundensuche erstellt
|
|
3. **Frontend angepasst:**
|
|
- Searchable Dropdown mit Live-Suche
|
|
- Option "Neuer Kunde" im Dropdown
|
|
- Eingabefelder erscheinen nur bei "Neuer Kunde"
|
|
4. **Backend-Logik verbessert:**
|
|
- Prüfung ob neuer oder bestehender Kunde
|
|
- E-Mail-Duplikatsprüfung vor Kundenerstellung
|
|
- Separate Audit-Logs für Kunde und Lizenz
|
|
5. **Datenbank:**
|
|
- UNIQUE Constraint auf E-Mail-Spalte hinzugefügt
|
|
|
|
**Änderungen:**
|
|
- `app.py`: Neuer API-Endpoint `/api/customers`, angepasste Routes `/create` und `/batch`
|
|
- `base.html`: Select2 CSS und JS eingebunden
|
|
- `index.html`: Kundenauswahl mit Select2 implementiert
|
|
- `batch_form.html`: Kundenauswahl mit Select2 implementiert
|
|
- `init.sql`: UNIQUE Constraint für E-Mail
|
|
|
|
**Status:**
|
|
- ✅ API-Endpoint funktioniert mit Pagination
|
|
- ✅ Select2 Dropdown mit Suchfunktion
|
|
- ✅ Neue/bestehende Kunden können ausgewählt werden
|
|
- ✅ E-Mail-Duplikate werden verhindert
|
|
- ✅ Sowohl Einzellizenz als auch Batch unterstützt
|
|
|
|
## 2025-06-06: Automatische Ablaufdatum-Berechnung
|
|
|
|
**Problem:**
|
|
- Manuelles Eingeben von Start- und Enddatum war umständlich
|
|
- Fehleranfällig bei der Datumseingabe
|
|
- Nicht intuitiv für Standard-Laufzeiten
|
|
|
|
**Lösung:**
|
|
1. **Frontend-Änderungen:**
|
|
- Startdatum + Laufzeit (Zahl) + Einheit (Tage/Monate/Jahre)
|
|
- Ablaufdatum wird automatisch berechnet und angezeigt (read-only)
|
|
- Standard: 1 Jahr Laufzeit voreingestellt
|
|
2. **Backend-Validierung:**
|
|
- Server-seitige Berechnung zur Sicherheit
|
|
- Verwendung von `python-dateutil` für korrekte Monats-/Jahresberechnungen
|
|
3. **Benutzerfreundlichkeit:**
|
|
- Sofortige Neuberechnung bei Änderungen
|
|
- Visuelle Hervorhebung des berechneten Datums
|
|
|
|
**Änderungen:**
|
|
- `index.html`: Laufzeit-Eingabe statt Ablaufdatum
|
|
- `batch_form.html`: Laufzeit-Eingabe statt Ablaufdatum
|
|
- `app.py`: Datum-Berechnung in `/create` und `/batch` Routes
|
|
- `requirements.txt`: `python-dateutil` hinzugefügt
|
|
|
|
**Status:**
|
|
- ✅ Automatische Berechnung funktioniert
|
|
- ✅ Frontend zeigt berechnetes Datum sofort an
|
|
- ✅ Backend validiert die Berechnung
|
|
- ✅ Standardwert (1 Jahr) voreingestellt
|
|
|
|
## 2025-06-06: Bugfix - created_at für licenses Tabelle
|
|
|
|
**Problem:**
|
|
- Batch-Generierung schlug fehl mit "Fehler bei der Batch-Generierung!"
|
|
- INSERT Statement versuchte `created_at` zu setzen, aber Spalte existierte nicht
|
|
- Inkonsistenz: Einzellizenzen hatten kein created_at, Batch-Lizenzen versuchten es zu setzen
|
|
|
|
**Lösung:**
|
|
1. **Datenbank-Schema erweitert:**
|
|
- `created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP` zur licenses Tabelle hinzugefügt
|
|
- Migration für bestehende Datenbanken implementiert
|
|
- Konsistent mit customers Tabelle
|
|
2. **Code bereinigt:**
|
|
- Explizites `created_at` aus Batch-INSERT entfernt
|
|
- Datenbank setzt nun automatisch den Zeitstempel bei ALLEN Lizenzen
|
|
|
|
**Änderungen:**
|
|
- `init.sql`: created_at Spalte zur licenses Tabelle mit DEFAULT-Wert
|
|
- `init.sql`: Migration für bestehende Datenbanken
|
|
- `app.py`: Entfernt explizites created_at aus batch_licenses()
|
|
|
|
**Status:**
|
|
- ✅ Alle Lizenzen haben nun automatisch einen Erstellungszeitstempel
|
|
- ✅ Batch-Generierung funktioniert wieder
|
|
- ✅ Konsistente Zeitstempel für Audit-Zwecke
|
|
|
|
## 2025-06-06: Status "Deaktiviert" für manuell abgeschaltete Lizenzen
|
|
|
|
**Problem:**
|
|
- Dashboard zeigte nur "aktiv" und "abgelaufen" als Status
|
|
- Manuell deaktivierte Lizenzen (is_active = FALSE) wurden nicht korrekt angezeigt
|
|
- Filter für "inactive" existierte, aber Status wurde nicht richtig berechnet
|
|
|
|
**Lösung:**
|
|
1. **Status-Berechnung erweitert:**
|
|
- CASE-Statement prüft zuerst `is_active = FALSE`
|
|
- Status "deaktiviert" wird vor anderen Status geprüft
|
|
- Reihenfolge: deaktiviert → abgelaufen → läuft bald ab → aktiv
|
|
2. **Dashboard-Statistik erweitert:**
|
|
- Neue Zählung für deaktivierte Lizenzen
|
|
- Variable `inactive_licenses` im stats Dictionary
|
|
|
|
**Änderungen:**
|
|
- `app.py`: Dashboard - Status-Berechnung für letzte 5 Lizenzen
|
|
- `app.py`: Lizenzübersicht - Status-Berechnung in der Hauptabfrage
|
|
- `app.py`: Export - Status-Berechnung für CSV/Excel Export
|
|
- `app.py`: Dashboard - Neue Statistik für deaktivierte Lizenzen
|
|
|
|
**Status:**
|
|
- ✅ "Deaktiviert" wird korrekt als Status angezeigt
|
|
- ✅ Dashboard zeigt Anzahl deaktivierter Lizenzen
|
|
- ✅ Export enthält korrekten Status
|
|
- ✅ Konsistente Status-Anzeige überall
|
|
|
|
## 2025-06-08: SSL-Sicherheit verbessert - Chrome Warnung behoben
|
|
|
|
**Problem:**
|
|
- Chrome zeigte Warnung "Die Verbindung zu dieser Website ist nicht sicher"
|
|
- Nginx erlaubte schwache Cipher Suites (WEAK) ohne Perfect Forward Secrecy
|
|
- Veraltete SSL-Konfiguration mit `ssl_ciphers HIGH:!aNULL:!MD5;`
|
|
|
|
**Lösung:**
|
|
1. **Moderne Cipher Suite Konfiguration:**
|
|
- Nur sichere ECDHE und DHE Cipher Suites
|
|
- Entfernung aller RSA-only Cipher Suites
|
|
- Perfect Forward Secrecy für alle Verbindungen
|
|
2. **SSL-Optimierungen:**
|
|
- Session Cache aktiviert (1 Tag Timeout)
|
|
- OCSP Stapling für bessere Performance
|
|
- DH Parameters (2048 bit) für zusätzliche Sicherheit
|
|
3. **Resolver-Konfiguration:**
|
|
- Google DNS Server für OCSP Stapling
|
|
|
|
**Änderungen:**
|
|
- `v2_nginx/nginx.conf`: Komplett überarbeitete SSL-Konfiguration
|
|
- `v2_nginx/ssl/dhparam.pem`: Neue 2048-bit DH Parameters generiert
|
|
- `v2_nginx/Dockerfile`: COPY Befehl für dhparam.pem hinzugefügt
|
|
|
|
**Status:**
|
|
- ✅ Nur noch sichere Cipher Suites aktiv
|
|
- ✅ Perfect Forward Secrecy gewährleistet
|
|
- ✅ OCSP Stapling aktiviert
|
|
- ✅ Chrome Sicherheitswarnung behoben
|
|
|
|
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
|
|
|
|
## 2025-06-08: CAPTCHA-Login-Bug behoben
|
|
|
|
**Problem:**
|
|
- Nach 2 fehlgeschlagenen Login-Versuchen wurde CAPTCHA angezeigt
|
|
- Da keine CAPTCHA-Keys konfiguriert waren (für PoC), konnte man sich nicht mehr einloggen
|
|
- Selbst mit korrektem Passwort war Login blockiert
|
|
- Fehlermeldung "CAPTCHA ERFORDERLICH!" erschien immer
|
|
|
|
**Lösung:**
|
|
1. **CAPTCHA-Prüfung nur wenn Keys vorhanden:**
|
|
- `recaptcha_site_key` wird vor CAPTCHA-Prüfung geprüft
|
|
- Wenn keine Keys konfiguriert → kein CAPTCHA-Check
|
|
- CAPTCHA wird nur angezeigt wenn Keys existieren
|
|
2. **Template-Anpassungen:**
|
|
- login.html zeigt CAPTCHA nur wenn `recaptcha_site_key` vorhanden
|
|
- Kein Test-Key mehr als Fallback
|
|
3. **Konsistente Logik:**
|
|
- show_captcha prüft jetzt auch ob Keys vorhanden sind
|
|
- Bei GET und POST Requests gleiche Logik
|
|
|
|
**Änderungen:**
|
|
- `v2_adminpanel/app.py`: CAPTCHA-Check nur wenn `RECAPTCHA_SITE_KEY` existiert
|
|
- `v2_adminpanel/templates/login.html`: CAPTCHA nur anzeigen wenn Keys vorhanden
|
|
|
|
**Status:**
|
|
- ✅ Login funktioniert wieder nach 2+ Fehlversuchen
|
|
- ✅ CAPTCHA wird nur angezeigt wenn Keys konfiguriert sind
|
|
- ✅ Für PoC-Phase ohne CAPTCHA nutzbar
|
|
- ✅ Produktiv-ready wenn CAPTCHA-Keys eingetragen werden
|
|
|
|
### 2025-06-08: Zeitzone auf Europe/Berlin umgestellt
|
|
|
|
**Problem:**
|
|
- Alle Zeitstempel wurden in UTC gespeichert und angezeigt
|
|
- Backup-Dateinamen zeigten UTC-Zeit statt deutsche Zeit
|
|
- Verwirrung bei Zeitangaben im Admin Panel und Logs
|
|
|
|
**Lösung:**
|
|
1. **Docker Container Zeitzone konfiguriert:**
|
|
- Alle Dockerfiles mit `TZ=Europe/Berlin` und tzdata Installation
|
|
- PostgreSQL mit `PGTZ=Europe/Berlin` für Datenbank-Zeitzone
|
|
- Explizite Zeitzone-Dateien in /etc/localtime und /etc/timezone
|
|
|
|
2. **Python Code angepasst:**
|
|
- Import von `zoneinfo.ZoneInfo` für Zeitzonenunterstützung
|
|
- Alle `datetime.now()` Aufrufe mit `ZoneInfo("Europe/Berlin")`
|
|
- `.replace(tzinfo=None)` für Kompatibilität mit timezone-unaware Timestamps
|
|
|
|
3. **PostgreSQL Konfiguration:**
|
|
- `SET timezone = 'Europe/Berlin';` in init.sql
|
|
- Umgebungsvariablen TZ und PGTZ in docker-compose.yaml
|
|
|
|
4. **docker-compose.yaml erweitert:**
|
|
- `TZ: Europe/Berlin` für alle Services
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/Dockerfile`: Zeitzone und tzdata hinzugefügt
|
|
- `v2_postgres/Dockerfile`: Zeitzone und tzdata hinzugefügt
|
|
- `v2_nginx/Dockerfile`: Zeitzone und tzdata hinzugefügt
|
|
- `v2_lizenzserver/Dockerfile`: Zeitzone und tzdata hinzugefügt
|
|
- `v2_adminpanel/app.py`: 14 datetime.now() Aufrufe mit Zeitzone versehen
|
|
- `v2_adminpanel/init.sql`: PostgreSQL Zeitzone gesetzt
|
|
- `v2/docker-compose.yaml`: TZ Environment-Variable für alle Services
|
|
|
|
**Ergebnis:**
|
|
- ✅ Alle neuen Zeitstempel werden in deutscher Zeit (Europe/Berlin) gespeichert
|
|
- ✅ Backup-Dateinamen zeigen korrekte deutsche Zeit
|
|
- ✅ Admin Panel zeigt alle Zeiten in deutscher Zeitzone
|
|
- ✅ Automatische Anpassung bei Sommer-/Winterzeit
|
|
- ✅ Konsistente Zeitangaben über alle Komponenten
|
|
|
|
**Hinweis:** Nach diesen Änderungen müssen die Docker Container neu gebaut werden:
|
|
```bash
|
|
docker-compose down
|
|
docker-compose build
|
|
docker-compose up -d
|
|
```
|
|
|
|
### 2025-06-08: Zeitzone-Fix - PostgreSQL Timestamps
|
|
|
|
**Problem nach erster Implementierung:**
|
|
- Trotz Zeitzoneneinstellung wurden Zeiten immer noch in UTC angezeigt
|
|
- Grund: PostgreSQL Tabellen verwendeten `TIMESTAMP WITHOUT TIME ZONE`
|
|
|
|
**Zusätzliche Lösung:**
|
|
1. **Datenbankschema angepasst:**
|
|
- Alle `TIMESTAMP` Spalten auf `TIMESTAMP WITH TIME ZONE` geändert
|
|
- Betrifft: created_at, timestamp, started_at, ended_at, last_heartbeat, etc.
|
|
- Migration für bestehende Datenbanken berücksichtigt
|
|
|
|
2. **SQL-Abfragen vereinfacht:**
|
|
- `AT TIME ZONE 'Europe/Berlin'` nicht mehr nötig
|
|
- PostgreSQL handhabt Zeitzonenkonvertierung automatisch
|
|
|
|
**Geänderte Datei:**
|
|
- `v2_adminpanel/init.sql`: Alle TIMESTAMP Felder mit WITH TIME ZONE
|
|
|
|
**Wichtig:** Bei bestehenden Installationen muss die Datenbank neu initialisiert oder manuell migriert werden:
|
|
```sql
|
|
ALTER TABLE customers ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE licenses ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE sessions ALTER COLUMN started_at TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE sessions ALTER COLUMN last_heartbeat TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE sessions ALTER COLUMN ended_at TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE audit_log ALTER COLUMN timestamp TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE backup_history ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE login_attempts ALTER COLUMN first_attempt TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE login_attempts ALTER COLUMN last_attempt TYPE TIMESTAMP WITH TIME ZONE;
|
|
ALTER TABLE login_attempts ALTER COLUMN blocked_until TYPE TIMESTAMP WITH TIME ZONE;
|
|
```
|
|
|
|
### 2025-06-08: UI/UX Überarbeitung - Phase 1 (Navigation)
|
|
|
|
**Problem:**
|
|
- Inkonsistente Navigation zwischen verschiedenen Seiten
|
|
- Zu viele Navigationspunkte im Dashboard
|
|
- Verwirrende Benutzerführung
|
|
|
|
**Lösung:**
|
|
1. **Dashboard vereinfacht:**
|
|
- Nur noch 3 Buttons: Neue Lizenz, Batch-Lizenzen, Log
|
|
- Statistik-Karten wurden klickbar gemacht (verlinken zu jeweiligen Seiten)
|
|
- "Audit" wurde zu "Log" umbenannt
|
|
|
|
2. **Navigation konsistent gemacht:**
|
|
- Navbar-Brand "AccountForger - Admin Panel" ist jetzt klickbar und führt zum Dashboard
|
|
- Keine Log-Links mehr in Unterseiten
|
|
- Konsistente "Dashboard" Buttons in allen Unterseiten
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/base.html`: Navbar-Brand klickbar gemacht
|
|
- `v2_adminpanel/templates/dashboard.html`: Navigation reduziert, Karten klickbar
|
|
- `v2_adminpanel/templates/*.html`: Konsistente Dashboard-Links
|
|
|
|
### 2025-06-08: UI/UX Überarbeitung - Phase 2 (Visuelle Verbesserungen)
|
|
|
|
**Implementierte Verbesserungen:**
|
|
1. **Größere Icons in Statistik-Karten:**
|
|
- Icon-Größe auf 3rem erhöht
|
|
- Bessere visuelle Hierarchie
|
|
|
|
2. **Donut-Chart für Lizenzen:**
|
|
- Chart.js Integration für Lizenzstatistik
|
|
- Zeigt Verhältnis Aktiv/Abgelaufen
|
|
- UPDATE: Später wieder entfernt auf Benutzerwunsch
|
|
|
|
3. **Pulse-Effekt für aktive Sessions:**
|
|
- CSS-Animation für aktive Sessions
|
|
- Visueller Indikator für Live-Aktivität
|
|
|
|
4. **Progress-Bar für Backup-Status:**
|
|
- Zeigt visuell den Erfolg des letzten Backups
|
|
- Inkl. Dateigröße und Dauer
|
|
|
|
5. **Konsistente Farbcodierung:**
|
|
- CSS-Variablen für Statusfarben
|
|
- Globale Klassen für konsistente Darstellung
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/base.html`: Globale CSS-Variablen und Statusklassen
|
|
- `v2_adminpanel/templates/dashboard.html`: Visuelle Verbesserungen implementiert
|
|
|
|
### 2025-06-08: UI/UX Überarbeitung - Phase 3 (Tabellen-Optimierungen)
|
|
|
|
**Problem:**
|
|
- Tabellen waren schwer zu navigieren bei vielen Einträgen
|
|
- Keine Möglichkeit für Bulk-Operationen
|
|
- Umständliches Kopieren von Lizenzschlüsseln
|
|
|
|
**Lösung:**
|
|
1. **Sticky Headers:**
|
|
- Tabellenköpfe bleiben beim Scrollen sichtbar
|
|
- CSS-Klasse `.table-sticky` mit `position: sticky`
|
|
|
|
2. **Inline-Actions:**
|
|
- Copy-Button direkt neben Lizenzschlüsseln
|
|
- Toggle-Switches für Aktiv/Inaktiv-Status
|
|
- Visuelles Feedback bei Aktionen
|
|
|
|
3. **Bulk-Actions:**
|
|
- Checkboxen für Mehrfachauswahl
|
|
- "Select All" Funktionalität
|
|
- Bulk-Actions Bar mit Aktivieren/Deaktivieren/Löschen
|
|
- JavaScript für dynamische Anzeige
|
|
|
|
4. **API-Endpoints hinzugefügt:**
|
|
- `/api/license/<id>/toggle` - Toggle einzelner Lizenzstatus
|
|
- `/api/licenses/bulk-activate` - Mehrere Lizenzen aktivieren
|
|
- `/api/licenses/bulk-deactivate` - Mehrere Lizenzen deaktivieren
|
|
- `/api/licenses/bulk-delete` - Mehrere Lizenzen löschen
|
|
|
|
5. **Beispieldaten eingefügt:**
|
|
- 15 Testkunden
|
|
- 18 Lizenzen (verschiedene Status)
|
|
- Sessions, Audit-Logs, Login-Attempts
|
|
- Backup-Historie
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/base.html`: CSS für Sticky-Tables und Bulk-Actions
|
|
- `v2_adminpanel/templates/licenses.html`: Komplette Tabellen-Überarbeitung
|
|
- `v2_adminpanel/app.py`: 4 neue API-Endpoints für Toggle und Bulk-Operationen
|
|
- `v2_adminpanel/sample_data.sql`: Umfangreiche Testdaten erstellt
|
|
|
|
**Bugfix:**
|
|
- API-Endpoints versuchten `updated_at` zu setzen, obwohl die Spalte nicht existiert
|
|
- Entfernt aus allen 3 betroffenen Endpoints
|
|
|
|
**Status:**
|
|
- ✅ Sticky Headers funktionieren
|
|
- ✅ Copy-Buttons mit Clipboard-API
|
|
- ✅ Toggle-Switches ändern Lizenzstatus
|
|
- ✅ Bulk-Operationen vollständig implementiert
|
|
- ✅ Testdaten erfolgreich eingefügt
|
|
|
|
### 2025-06-08: UI/UX Überarbeitung - Phase 4 (Sortierbare Tabellen)
|
|
|
|
**Problem:**
|
|
- Keine Möglichkeit, Tabellen nach verschiedenen Spalten zu sortieren
|
|
- Besonders bei großen Datenmengen schwer zu navigieren
|
|
|
|
**Lösung - Hybrid-Ansatz:**
|
|
1. **Client-seitige Sortierung für kleine Tabellen:**
|
|
- Dashboard (3 kleine Übersichtstabellen)
|
|
- Blocked IPs (typischerweise wenige Einträge)
|
|
- Backups (begrenzte Anzahl)
|
|
- JavaScript-basierte Sortierung ohne Reload
|
|
|
|
2. **Server-seitige Sortierung für große Tabellen:**
|
|
- Licenses (potenziell tausende Einträge)
|
|
- Customers (viele Kunden möglich)
|
|
- Audit Log (wächst kontinuierlich)
|
|
- Sessions (viele aktive/beendete Sessions)
|
|
- URL-Parameter für Sortierung mit SQL ORDER BY
|
|
|
|
**Implementierung:**
|
|
1. **Client-seitige Sortierung:**
|
|
- Generische JavaScript-Funktion in base.html
|
|
- CSS-Klasse `.sortable-table` für betroffene Tabellen
|
|
- Sortier-Indikatoren (↑↓↕) bei Hover/Active
|
|
- Unterstützung für Text, Zahlen und deutsche Datumsformate
|
|
|
|
2. **Server-seitige Sortierung:**
|
|
- Query-Parameter `sort` und `order` in Routes
|
|
- Whitelist für erlaubte Sortierfelder (SQL-Injection-Schutz)
|
|
- Makro-Funktionen für sortierbare Header
|
|
- Sortier-Parameter in Pagination-Links erhalten
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/base.html`: CSS und JavaScript für Sortierung
|
|
- `v2_adminpanel/templates/dashboard.html`: Client-seitige Sortierung
|
|
- `v2_adminpanel/templates/blocked_ips.html`: Client-seitige Sortierung
|
|
- `v2_adminpanel/templates/backups.html`: Client-seitige Sortierung
|
|
- `v2_adminpanel/templates/licenses.html`: Server-seitige Sortierung
|
|
- `v2_adminpanel/templates/customers.html`: Server-seitige Sortierung
|
|
- `v2_adminpanel/templates/audit_log.html`: Server-seitige Sortierung
|
|
- `v2_adminpanel/templates/sessions.html`: Server-seitige Sortierung (2 Tabellen)
|
|
- `v2_adminpanel/app.py`: 4 Routes erweitert für Sortierung
|
|
|
|
**Besonderheiten:**
|
|
- Sessions-Seite hat zwei unabhängige Tabellen mit eigenen Sortierparametern
|
|
- Intelligente Datentyp-Erkennung (numeric, date) für korrekte Sortierung
|
|
- Visuelle Sortier-Indikatoren zeigen aktuelle Sortierung
|
|
- Alle anderen Filter und Suchparameter bleiben bei Sortierung erhalten
|
|
|
|
**Status:**
|
|
- ✅ Client-seitige Sortierung für kleine Tabellen
|
|
- ✅ Server-seitige Sortierung für große Tabellen
|
|
- ✅ Sortier-Indikatoren und visuelle Rückmeldung
|
|
- ✅ SQL-Injection-Schutz durch Whitelisting
|
|
- ✅ Vollständige Integration mit bestehenden Features
|
|
|
|
### 2025-06-08: Bugfix - Sortierlogik korrigiert
|
|
|
|
**Problem:**
|
|
- Sortierung funktionierte nicht korrekt
|
|
- Beim Klick auf Spaltenköpfe wurde immer absteigend sortiert
|
|
- Toggle zwischen ASC/DESC funktionierte nicht
|
|
|
|
**Ursachen:**
|
|
1. **Falsche Bedingungslogik**: Die ursprüngliche Implementierung verwendete eine fehlerhafte Ternär-Bedingung
|
|
2. **Berechnete Felder**: Das 'status' Feld in der Lizenztabelle konnte nicht direkt sortiert werden
|
|
|
|
**Lösung:**
|
|
1. **Sortierlogik korrigiert:**
|
|
- Bei neuer Spalte: Immer aufsteigend (ASC) beginnen
|
|
- Bei gleicher Spalte: Toggle zwischen ASC und DESC
|
|
- Implementiert durch bedingte Links in den Makros
|
|
|
|
2. **Spezialbehandlung für berechnete Felder:**
|
|
- Status-Feld verwendet CASE-Statement in ORDER BY
|
|
- Wiederholt die gleiche Logik wie im SELECT
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/licenses.html`: Sortierlogik korrigiert
|
|
- `v2_adminpanel/templates/customers.html`: Sortierlogik korrigiert
|
|
- `v2_adminpanel/templates/audit_log.html`: Sortierlogik korrigiert
|
|
- `v2_adminpanel/templates/sessions.html`: Sortierlogik für beide Tabellen korrigiert
|
|
- `v2_adminpanel/app.py`: Spezialbehandlung für Status-Feld in licenses Route
|
|
|
|
**Verhalten nach Fix:**
|
|
- ✅ Erster Klick auf Spalte: Aufsteigend sortieren
|
|
- ✅ Zweiter Klick: Absteigend sortieren
|
|
- ✅ Weitere Klicks: Toggle zwischen ASC/DESC
|
|
- ✅ Sortierung funktioniert korrekt mit Pagination und Filtern
|
|
|
|
### 2025-06-09: Port 8443 geschlossen - API nur noch über Nginx
|
|
|
|
**Problem:**
|
|
- Doppelte Verfügbarkeit des License Servers (Port 8443 + Nginx) machte keinen Sinn
|
|
- Inkonsistente Sicherheitskonfiguration (Nginx hatte Security Headers, Port 8443 nicht)
|
|
- Doppelte SSL-Konfiguration nötig
|
|
- Verwirrung welcher Zugangsweg genutzt werden soll
|
|
|
|
**Lösung:**
|
|
- Port-Mapping für License Server in docker-compose.yaml entfernt
|
|
- API nur noch über Nginx erreichbar: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com
|
|
- Interne Kommunikation zwischen Nginx und License Server bleibt bestehen
|
|
|
|
**Vorteile:**
|
|
- ✅ Einheitliche Sicherheitskonfiguration (Security Headers, HSTS)
|
|
- ✅ Zentrale SSL-Verwaltung nur in Nginx
|
|
- ✅ Möglichkeit für Rate Limiting und zentrales Logging
|
|
- ✅ Keine zusätzlichen offenen Ports (nur 80/443)
|
|
- ✅ Professionellere API-URL ohne Port-Angabe
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2/docker-compose.yaml`: Port-Mapping "8443:8443" entfernt
|
|
|
|
**Hinweis für Client-Software:**
|
|
- API-Endpunkte sind weiterhin unter https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com erreichbar
|
|
- Keine Änderung der API-URLs nötig, nur Port 8443 ist nicht mehr direkt zugänglich
|
|
|
|
**Status:**
|
|
- ✅ Port 8443 geschlossen
|
|
- ✅ API nur noch über Nginx Reverse Proxy erreichbar
|
|
- ✅ Sicherheit erhöht durch zentrale Verwaltung
|
|
|
|
### 2025-06-09: Live-Filtering implementiert
|
|
|
|
**Problem:**
|
|
- Benutzer mussten immer auf "Filter anwenden" klicken
|
|
- Umständliche Bedienung, besonders bei mehreren Filterkriterien
|
|
- Nicht zeitgemäße User Experience
|
|
|
|
**Lösung:**
|
|
- JavaScript Event-Listener für automatisches Filtern
|
|
- Text-Eingaben: 300ms Debouncing (verzögerte Suche nach Tipp-Pause)
|
|
- Dropdowns: Sofortiges Filtern bei Änderung
|
|
- "Filter anwenden" Button entfernt, nur "Zurücksetzen" bleibt
|
|
|
|
**Implementierte Live-Filter:**
|
|
1. **Lizenzübersicht** (licenses.html):
|
|
- Suchfeld mit Debouncing
|
|
- Typ-Dropdown (Vollversion/Testversion)
|
|
- Status-Dropdown (Aktiv/Ablaufend/Abgelaufen/Deaktiviert)
|
|
|
|
2. **Kundenübersicht** (customers.html):
|
|
- Suchfeld mit Debouncing
|
|
- "Suchen" Button entfernt
|
|
|
|
3. **Audit-Log** (audit_log.html):
|
|
- Benutzer-Textfeld mit Debouncing
|
|
- Aktion-Dropdown
|
|
- Entität-Dropdown
|
|
|
|
**Technische Details:**
|
|
- `addEventListener('input')` für Textfelder
|
|
- `addEventListener('change')` für Select-Elemente
|
|
- `setTimeout()` mit 300ms für Debouncing
|
|
- Automatisches `form.submit()` bei Änderungen
|
|
|
|
**Vorteile:**
|
|
- ✅ Schnellere und intuitivere Bedienung
|
|
- ✅ Weniger Klicks erforderlich
|
|
- ✅ Moderne User Experience
|
|
- ✅ Besonders hilfreich bei komplexen Filterkriterien
|
|
|
|
**Status:**
|
|
- ✅ Live-Filtering auf allen Hauptseiten implementiert
|
|
- ✅ Debouncing verhindert zu viele Server-Requests
|
|
- ✅ Zurücksetzen-Button bleibt für schnelles Löschen aller Filter
|
|
|
|
### 2025-06-09: Resource Pool System implementiert (Phase 1 & 2)
|
|
|
|
**Ziel:**
|
|
Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder Lizenzerstellung 1-10 Ressourcen pro Typ zugewiesen werden. Ressourcen haben 3 Status: available, allocated, quarantine.
|
|
|
|
**Phase 1 - Datenbank-Schema (✅ Abgeschlossen):**
|
|
1. **Neue Tabellen erstellt:**
|
|
- `resource_pools` - Haupttabelle für alle Ressourcen
|
|
- `resource_history` - Vollständige Historie aller Aktionen
|
|
- `resource_metrics` - Performance-Tracking und ROI-Berechnung
|
|
- `license_resources` - Zuordnung zwischen Lizenzen und Ressourcen
|
|
|
|
2. **Erweiterte licenses Tabelle:**
|
|
- `domain_count`, `ipv4_count`, `phone_count` Spalten hinzugefügt
|
|
- Constraints: 0-10 pro Resource-Typ
|
|
|
|
3. **Indizes für Performance:**
|
|
- Status, Type, Allocated License, Quarantine Date
|
|
|
|
**Phase 2 - Backend-Implementierung (✅ Abgeschlossen):**
|
|
1. **Resource Management Routes:**
|
|
- `/resources` - Hauptübersicht mit Statistiken
|
|
- `/resources/add` - Bulk-Import von Ressourcen
|
|
- `/resources/quarantine/<id>` - Ressourcen sperren
|
|
- `/resources/release` - Quarantäne aufheben
|
|
- `/resources/history/<id>` - Komplette Historie
|
|
- `/resources/metrics` - Performance Dashboard
|
|
- `/resources/report` - Report-Generator
|
|
|
|
2. **API-Endpunkte:**
|
|
- `/api/resources/allocate` - Ressourcen-Zuweisung
|
|
- `/api/resources/check-availability` - Verfügbarkeit prüfen
|
|
|
|
3. **Integration in Lizenzerstellung:**
|
|
- `create_license()` erweitert um Resource-Allocation
|
|
- `batch_licenses()` mit Ressourcen-Prüfung für gesamten Batch
|
|
- Transaktionale Sicherheit bei Zuweisung
|
|
|
|
4. **Dashboard-Integration:**
|
|
- Resource-Statistiken in Dashboard eingebaut
|
|
- Warning-Level basierend auf Verfügbarkeit
|
|
|
|
5. **Navigation erweitert:**
|
|
- Resources-Link in Navbar hinzugefügt
|
|
|
|
**Was noch zu tun ist:**
|
|
|
|
### Phase 3 - UI-Komponenten (🔄 Ausstehend):
|
|
1. **Templates erstellen:**
|
|
- `resources.html` - Hauptübersicht mit Drag&Drop
|
|
- `add_resources.html` - Formular für Bulk-Import
|
|
- `resource_history.html` - Historie-Anzeige
|
|
- `resource_metrics.html` - Performance Dashboard
|
|
|
|
2. **Formulare erweitern:**
|
|
- `index.html` - Resource-Dropdowns hinzufügen
|
|
- `batch_form.html` - Resource-Dropdowns hinzufügen
|
|
|
|
3. **Dashboard-Widget:**
|
|
- Resource Pool Statistik mit Ampelsystem
|
|
- Warnung bei niedrigem Bestand
|
|
|
|
### Phase 4 - Erweiterte Features (🔄 Ausstehend):
|
|
1. **Quarantäne-Workflow:**
|
|
- Gründe: abuse, defect, maintenance, blacklisted, expired
|
|
- Automatische Tests vor Freigabe
|
|
- Genehmigungsprozess
|
|
|
|
2. **Performance-Metrics:**
|
|
- Täglicher Cronjob für Metriken
|
|
- ROI-Berechnung
|
|
- Issue-Tracking
|
|
|
|
3. **Report-Generator:**
|
|
- Auslastungsreport
|
|
- Performance-Report
|
|
- Compliance-Report
|
|
|
|
### Phase 5 - Backup erweitern (🔄 Ausstehend):
|
|
- Neue Tabellen in Backup einbeziehen:
|
|
- resource_pools
|
|
- resource_history
|
|
- resource_metrics
|
|
- license_resources
|
|
|
|
### Phase 6 - Testing & Migration (🔄 Ausstehend):
|
|
1. **Test-Daten generieren:**
|
|
- 500 Test-Domains
|
|
- 200 Test-IPs
|
|
- 100 Test-Telefonnummern
|
|
|
|
2. **Migrations-Script:**
|
|
- Bestehende Lizenzen auf default resource_count setzen
|
|
|
|
### Phase 7 - Dokumentation (🔄 Ausstehend):
|
|
- API-Dokumentation für License Server
|
|
- Admin-Handbuch für Resource Management
|
|
|
|
**Technische Details:**
|
|
- 3-Status-System: available/allocated/quarantine
|
|
- Transaktionale Ressourcen-Zuweisung mit FOR UPDATE Lock
|
|
- Vollständige Historie mit IP-Tracking
|
|
- Drag&Drop UI für Resource-Management geplant
|
|
- Automatische Warnung bei < 50 verfügbaren Ressourcen
|
|
|
|
**Status:**
|
|
- ✅ Datenbank-Schema komplett
|
|
- ✅ Backend-Routen implementiert
|
|
- ✅ Integration in Lizenzerstellung
|
|
- ❌ UI-Templates fehlen noch
|
|
- ❌ Erweiterte Features ausstehend
|
|
- ❌ Testing und Migration offen
|
|
|
|
### 2025-06-09: Resource Pool System UI-Implementierung (Phase 3 & 4)
|
|
|
|
**Phase 3 - UI-Komponenten (✅ Abgeschlossen):**
|
|
|
|
1. **Neue Templates erstellt:**
|
|
- `resources.html` - Hauptübersicht mit Statistiken, Filter, Live-Suche, Pagination
|
|
- `add_resources.html` - Bulk-Import Formular mit Validierung
|
|
- `resource_history.html` - Timeline-Ansicht der Historie mit Details
|
|
- `resource_metrics.html` - Performance Dashboard mit Charts
|
|
- `resource_report.html` - Report-Generator UI
|
|
|
|
2. **Erweiterte Formulare:**
|
|
- `index.html` - Resource-Count Dropdowns (0-10) mit Live-Verfügbarkeitsprüfung
|
|
- `batch_form.html` - Resource-Count mit Batch-Berechnung (zeigt Gesamtbedarf)
|
|
|
|
3. **Dashboard-Widget:**
|
|
- Resource Pool Statistik mit Ampelsystem implementiert
|
|
- Zeigt verfügbare/zugeteilte/quarantäne Ressourcen
|
|
- Warnung bei niedrigem Bestand (<50)
|
|
- Fortschrittsbalken für visuelle Darstellung
|
|
|
|
4. **Backend-Anpassungen:**
|
|
- `resource_history` Route korrigiert für Object-Style Template-Zugriff
|
|
- `resources_metrics` Route vollständig implementiert mit Charts-Daten
|
|
- `resources_report` Route erweitert für Template-Anzeige und Downloads
|
|
- Dashboard erweitert um Resource-Statistiken
|
|
|
|
**Phase 4 - Erweiterte Features (✅ Teilweise):**
|
|
1. **Report-Generator:**
|
|
- Template für Report-Auswahl erstellt
|
|
- 4 Report-Typen: Usage, Performance, Compliance, Inventory
|
|
- Export als Excel, CSV oder PDF-Vorschau
|
|
- Zeitraum-Auswahl mit Validierung
|
|
|
|
**Technische Details der Implementierung:**
|
|
- Live-Filtering ohne Reload durch JavaScript
|
|
- AJAX-basierte Verfügbarkeitsprüfung
|
|
- Bootstrap 5 für konsistentes Design
|
|
- Chart.js für Metriken-Visualisierung
|
|
- Responsives Design für alle Templates
|
|
- Copy-to-Clipboard für Resource-Werte
|
|
- Modal-Dialoge für Quarantäne-Aktionen
|
|
|
|
**Was noch fehlt:**
|
|
|
|
### Phase 5 - Backup erweitern (🔄 Ausstehend):
|
|
- Resource-Tabellen in pg_dump einbeziehen:
|
|
- resource_pools
|
|
- resource_history
|
|
- resource_metrics
|
|
- license_resources
|
|
|
|
### Phase 6 - Testing & Migration (🔄 Ausstehend):
|
|
1. **Test-Daten generieren:**
|
|
- Script für 500 Test-Domains
|
|
- 200 Test-IPv4-Adressen
|
|
- 100 Test-Telefonnummern
|
|
- Realistische Verteilung über Status
|
|
|
|
2. **Migrations-Script:**
|
|
- Bestehende Lizenzen auf Default resource_count setzen
|
|
- UPDATE licenses SET domain_count=1, ipv4_count=1, phone_count=1 WHERE ...
|
|
|
|
### Phase 7 - Dokumentation (🔄 Ausstehend):
|
|
- API-Dokumentation für Resource-Endpunkte
|
|
- Admin-Handbuch für Resource Management
|
|
- Troubleshooting-Guide
|
|
|
|
**Offene Punkte für Produktion:**
|
|
1. Drag&Drop für Resource-Verwaltung (Nice-to-have)
|
|
2. Automatische Quarantäne-Aufhebung nach Zeitablauf
|
|
3. E-Mail-Benachrichtigungen bei niedrigem Bestand
|
|
4. API für externe Resource-Prüfung
|
|
5. Bulk-Delete für Ressourcen
|
|
6. Resource-Import aus CSV/Excel
|
|
|
|
### 2025-06-09: Resource Pool System finalisiert
|
|
|
|
**Problem:**
|
|
- Resource Pool System war nur teilweise implementiert
|
|
- UI-Templates waren vorhanden, aber nicht dokumentiert
|
|
- Test-Daten und Migration fehlten
|
|
- Backup-Integration unklar
|
|
|
|
**Analyse und Lösung:**
|
|
1. **Status-Überprüfung durchgeführt:**
|
|
- Alle 5 UI-Templates existierten bereits (resources.html, add_resources.html, etc.)
|
|
- Resource-Dropdowns waren bereits in index.html und batch_form.html integriert
|
|
- Dashboard-Widget war bereits implementiert
|
|
- Backup-System inkludiert bereits alle Tabellen (pg_dump ohne -t Parameter)
|
|
|
|
2. **Fehlende Komponenten erstellt:**
|
|
- Test-Daten Script: `test_data_resources.sql`
|
|
- 500 Test-Domains (400 verfügbar, 50 zugeteilt, 50 in Quarantäne)
|
|
- 200 Test-IPv4-Adressen (150 verfügbar, 30 zugeteilt, 20 in Quarantäne)
|
|
- 100 Test-Telefonnummern (70 verfügbar, 20 zugeteilt, 10 in Quarantäne)
|
|
- Resource History und Metrics für realistische Daten
|
|
|
|
- Migration Script: `migrate_existing_licenses.sql`
|
|
- Setzt Default Resource Counts (Vollversion: 2, Testversion: 1, Inaktiv: 0)
|
|
- Weist automatisch verfügbare Ressourcen zu
|
|
- Erstellt Audit-Log Einträge
|
|
- Gibt detaillierten Migrationsbericht aus
|
|
|
|
**Hinweis:**
|
|
- Test-Daten und Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht
|
|
|
|
**Status:**
|
|
- ✅ Resource Pool System vollständig implementiert und dokumentiert
|
|
- ✅ Alle UI-Komponenten vorhanden und funktionsfähig
|
|
- ✅ Integration in Lizenz-Formulare abgeschlossen
|
|
- ✅ Dashboard-Widget zeigt Resource-Statistiken
|
|
- ✅ Backup-System inkludiert Resource-Tabellen
|
|
- ✅ Test-Daten und Migration bereitgestellt
|
|
|
|
**Nächste Schritte:**
|
|
1. License Server API implementieren (Hauptaufgabe)
|
|
|
|
### 2025-06-09: Bugfix - Resource Pool Tabellen fehlten
|
|
|
|
**Problem:**
|
|
- Admin Panel zeigte "Internal Server Error"
|
|
- Dashboard Route versuchte auf `resource_pools` Tabelle zuzugreifen
|
|
- Tabelle existierte nicht in der Datenbank
|
|
|
|
**Ursache:**
|
|
- Bei bereits existierender Datenbank wird init.sql nicht erneut ausgeführt
|
|
- Resource Pool Tabellen wurden erst später zum init.sql hinzugefügt
|
|
- Docker Container verwendeten noch die alte Datenbankstruktur
|
|
|
|
**Lösung:**
|
|
1. Separates Script erstellt und manuell in der Datenbank ausgeführt
|
|
2. Alle 4 Resource-Tabellen erfolgreich erstellt:
|
|
- resource_pools
|
|
- resource_history
|
|
- resource_metrics
|
|
- license_resources
|
|
|
|
**Status:**
|
|
- ✅ Admin Panel funktioniert wieder
|
|
- ✅ Dashboard zeigt Resource Pool Statistiken
|
|
- ✅ Alle Resource-Funktionen verfügbar
|
|
|
|
**Empfehlung für Neuinstallationen:**
|
|
- Bei frischer Installation funktioniert alles automatisch
|
|
- Bei bestehenden Installationen: Resource-Tabellen manuell hinzufügen
|
|
|
|
### 2025-06-09: Navigation vereinfacht
|
|
|
|
**Änderung:**
|
|
- Navigationspunkte aus der schwarzen Navbar entfernt
|
|
- Links zu Lizenzen, Kunden, Ressourcen, Sessions, Backups und Log entfernt
|
|
|
|
**Grund:**
|
|
- Cleaner Look mit nur Logo, Timer und Logout
|
|
- Alle Funktionen sind weiterhin über das Dashboard erreichbar
|
|
- Bessere Übersichtlichkeit und weniger Ablenkung
|
|
|
|
**Geänderte Datei:**
|
|
- `v2_adminpanel/templates/base.html` - Navbar-Links auskommentiert
|
|
|
|
**Status:**
|
|
- ✅ Navbar zeigt nur noch Logo, Session-Timer und Logout
|
|
- ✅ Navigation erfolgt über Dashboard und Buttons auf den jeweiligen Seiten
|
|
- ✅ Alle Funktionen bleiben erreichbar
|
|
|
|
### 2025-06-09: Bugfix - Resource Report Einrückungsfehler
|
|
|
|
**Problem:**
|
|
- Resource Report Route zeigte "Internal Server Error"
|
|
- UnboundLocalError: `report_type` wurde verwendet bevor es definiert war
|
|
|
|
**Ursache:**
|
|
- Fehlerhafte Einrückung in der `resources_report()` Funktion
|
|
- `elif` und `else` Blöcke waren falsch eingerückt
|
|
- Variablen wurden außerhalb ihres Gültigkeitsbereichs verwendet
|
|
|
|
**Lösung:**
|
|
- Korrekte Einrückung für alle Conditional-Blöcke wiederhergestellt
|
|
- Alle Report-Typen (usage, performance, compliance, inventory) richtig strukturiert
|
|
- Excel und CSV Export-Code korrekt eingerückt
|
|
|
|
**Geänderte Datei:**
|
|
- `v2_adminpanel/app.py` - resources_report() Funktion korrigiert
|
|
|
|
**Status:**
|
|
- ✅ Resource Report funktioniert wieder
|
|
- ✅ Alle 4 Report-Typen verfügbar
|
|
- ✅ Export als Excel und CSV möglich
|
|
|
|
---
|
|
|
|
## Zusammenfassung der heutigen Arbeiten (2025-06-09)
|
|
|
|
### 1. Resource Pool System Finalisierung
|
|
- **Ausgangslage**: Resource Pool war nur teilweise dokumentiert
|
|
- **Überraschung**: UI-Templates waren bereits vorhanden (nicht dokumentiert)
|
|
- **Ergänzt**:
|
|
- Test-Daten Script (`test_data_resources.sql`)
|
|
- Migration Script (`migrate_existing_licenses.sql`)
|
|
- **Status**: ✅ Vollständig implementiert
|
|
|
|
### 2. Database Migration Bug
|
|
- **Problem**: Admin Panel zeigte "Internal Server Error"
|
|
- **Ursache**: Resource Pool Tabellen fehlten in bestehender DB
|
|
- **Lösung**: Separates Script `create_resource_tables.sql` erstellt
|
|
- **Status**: ✅ Behoben
|
|
|
|
### 3. UI Cleanup
|
|
- **Änderung**: Navigation aus Navbar entfernt
|
|
- **Effekt**: Cleaner Look, Navigation nur über Dashboard
|
|
- **Status**: ✅ Implementiert
|
|
|
|
### 4. Resource Report Bug
|
|
- **Problem**: Einrückungsfehler in `resources_report()` Funktion
|
|
- **Lösung**: Korrekte Einrückung wiederhergestellt
|
|
- **Status**: ✅ Behoben
|
|
|
|
### Hinweis:
|
|
- Test-Daten-Scripts wurden nach erfolgreicher Anwendung gelöscht
|
|
|
|
### 2025-06-09: Bugfix - Resource Quarantäne Modal
|
|
|
|
**Problem:**
|
|
- Quarantäne-Button funktionierte nicht
|
|
- Modal öffnete sich nicht beim Klick
|
|
|
|
**Ursache:**
|
|
- Bootstrap 5 vs Bootstrap 4 API-Inkompatibilität
|
|
- Modal wurde mit Bootstrap 4 Syntax (`modal.modal('show')`) aufgerufen
|
|
- jQuery wurde nach Bootstrap geladen
|
|
|
|
**Lösung:**
|
|
1. **JavaScript angepasst:**
|
|
- Von jQuery Modal-API zu nativer Bootstrap 5 Modal-API gewechselt
|
|
- `new bootstrap.Modal(element).show()` statt `$(element).modal('show')`
|
|
|
|
2. **HTML-Struktur aktualisiert:**
|
|
- Modal-Close-Button: `data-bs-dismiss="modal"` statt `data-dismiss="modal"`
|
|
- `btn-close` Klasse statt custom close button
|
|
- Form-Klassen: `mb-3` statt `form-group`, `form-select` statt `form-control` für Select
|
|
|
|
3. **Script-Reihenfolge korrigiert:**
|
|
- jQuery vor Bootstrap laden für korrekte Initialisierung
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/resources.html`
|
|
- `v2_adminpanel/templates/base.html`
|
|
|
|
**Status:** ✅ Behoben
|
|
|
|
### 2025-06-09: Resource Pool UI Redesign
|
|
|
|
**Ziel:**
|
|
- Komplettes Redesign des Resource Pool Managements für bessere Benutzerfreundlichkeit
|
|
- Konsistentes Design mit dem Rest der Anwendung
|
|
|
|
**Durchgeführte Änderungen:**
|
|
|
|
1. **resources.html - Hauptübersicht:**
|
|
- Moderne Statistik-Karten mit Hover-Effekten
|
|
- Farbcodierte Progress-Bars mit Tooltips
|
|
- Verbesserte Tabelle mit Icons und Status-Badges
|
|
- Live-Filter mit sofortiger Suche
|
|
- Überarbeitete Quarantäne-Modal für Bootstrap 5
|
|
- Responsive Design mit Grid-Layout
|
|
|
|
2. **add_resources.html - Ressourcen hinzufügen:**
|
|
- 3-Schritt Wizard-ähnliches Interface
|
|
- Visueller Ressourcentyp-Selector mit Icons
|
|
- Live-Validierung mit Echtzeit-Feedback
|
|
- Statistik-Anzeige (Gültig/Duplikate/Ungültig)
|
|
- Formatierte Beispiele mit Erklärungen
|
|
- Verbesserte Fehlerbehandlung
|
|
|
|
3. **resource_history.html - Historie:**
|
|
- Zentrierte Resource-Anzeige mit großen Icons
|
|
- Info-Grid Layout für Details
|
|
- Modernisierte Timeline mit Hover-Effekten
|
|
- Farbcodierte Action-Icons
|
|
- Verbesserte Darstellung von Details
|
|
|
|
4. **resource_metrics.html - Metriken:**
|
|
- Dashboard-Style Metrik-Karten mit Icon-Badges
|
|
- Modernisierte Charts mit besseren Farben
|
|
- Performance-Tabellen mit Progress-Bars
|
|
- Trend-Indikatoren für Performance
|
|
- Responsives Grid-Layout
|
|
|
|
**Design-Verbesserungen:**
|
|
- Konsistente Emoji-Icons für bessere visuelle Kommunikation
|
|
- Einheitliche Farbgebung (Blau/Lila/Grün für Ressourcentypen)
|
|
- Card-basiertes Layout mit Schatten und Hover-Effekten
|
|
- Bootstrap 5 kompatible Komponenten
|
|
- Verbesserte Typografie und Spacing
|
|
|
|
**Technische Details:**
|
|
- Bootstrap 5 Modal-API statt jQuery
|
|
- CSS Grid für responsive Layouts
|
|
- Moderne Chart.js Konfiguration
|
|
- Optimierte JavaScript-Validierung
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/resources.html`
|
|
- `v2_adminpanel/templates/add_resources.html`
|
|
- `v2_adminpanel/templates/resource_history.html`
|
|
- `v2_adminpanel/templates/resource_metrics.html`
|
|
|
|
**Status:** ✅ Abgeschlossen
|
|
|
|
### 2025-06-09: Zusammenfassung der heutigen Arbeiten
|
|
|
|
**Durchgeführte Aufgaben:**
|
|
|
|
1. **Quarantäne-Funktion repariert:**
|
|
- Bootstrap 5 Modal-API implementiert
|
|
- data-bs-dismiss statt data-dismiss
|
|
- jQuery vor Bootstrap laden
|
|
|
|
2. **Resource Pool UI komplett überarbeitet:**
|
|
- Alle 4 Templates modernisiert (resources, add_resources, resource_history, resource_metrics)
|
|
- Konsistentes Design mit Emoji-Icons
|
|
- Einheitliche Farbgebung (Blau/Lila/Grün)
|
|
- Bootstrap 5 kompatible Komponenten
|
|
- Responsive Grid-Layouts
|
|
|
|
**Aktuelle Projekt-Status:**
|
|
- ✅ Admin Panel voll funktionsfähig
|
|
- ✅ Resource Pool Management mit modernem UI
|
|
- ✅ PostgreSQL mit allen Tabellen
|
|
- ✅ Nginx Reverse Proxy mit SSL
|
|
- ❌ Lizenzserver noch nicht implementiert (nur Platzhalter)
|
|
|
|
**Nächste Schritte:**
|
|
- Lizenzserver implementieren
|
|
- API-Endpunkte für Lizenzvalidierung
|
|
- Heartbeat-System für Sessions
|
|
- Versionsprüfung implementieren
|
|
1. `v2_adminpanel/templates/base.html` - Navigation entfernt
|
|
2. `v2_adminpanel/app.py` - Resource Report Einrückung korrigiert
|
|
3. `JOURNAL.md` - Alle Änderungen dokumentiert
|
|
|
|
### Offene Hauptaufgabe:
|
|
- **License Server API** - Noch komplett zu implementieren
|
|
- `/api/version` - Versionscheck
|
|
- `/api/validate` - Lizenzvalidierung
|
|
- `/api/heartbeat` - Session-Management
|
|
|
|
### 2025-06-09: Resource Pool Internal Error behoben
|
|
|
|
**Problem:**
|
|
- Internal Server Error beim Zugriff auf `/resources`
|
|
- NameError: name 'datetime' is not defined in Template
|
|
|
|
**Ursache:**
|
|
- Fehlende `datetime` und `timedelta` Objekte im Template-Kontext
|
|
- Falsche Array-Indizes in resources.html für activity-Daten
|
|
|
|
**Lösung:**
|
|
1. **app.py (Zeile 2797-2798):**
|
|
- `datetime=datetime` und `timedelta=timedelta` zu render_template hinzugefügt
|
|
|
|
2. **resources.html (Zeile 484-490):**
|
|
- Array-Indizes korrigiert:
|
|
- activity[0] = action
|
|
- activity[1] = action_by
|
|
- activity[2] = action_at
|
|
- activity[3] = resource_type
|
|
- activity[4] = resource_value
|
|
- activity[5] = details
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py`
|
|
- `v2_adminpanel/templates/resources.html`
|
|
|
|
**Status:** ✅ Behoben - Resource Pool funktioniert wieder einwandfrei
|
|
|
|
### 2025-06-09: Passwort-Änderung und 2FA implementiert
|
|
|
|
**Ziel:**
|
|
- Benutzer können ihr Passwort ändern
|
|
- Zwei-Faktor-Authentifizierung (2FA) mit TOTP
|
|
- Komplett kostenlose Lösung ohne externe Services
|
|
|
|
**Implementierte Features:**
|
|
|
|
1. **Datenbank-Erweiterung:**
|
|
- Neue `users` Tabelle mit Passwort-Hash und 2FA-Feldern
|
|
- Unterstützung für TOTP-Secrets und Backup-Codes
|
|
- Migration von Environment-Variablen zu Datenbank
|
|
|
|
2. **Passwort-Management:**
|
|
- Sichere Passwort-Hashes mit bcrypt
|
|
- Passwort-Änderung mit Verifikation des alten Passworts
|
|
- Passwort-Stärke-Indikator im Frontend
|
|
|
|
3. **2FA-Implementation:**
|
|
- TOTP-basierte 2FA (Google Authenticator, Authy kompatibel)
|
|
- QR-Code-Generierung für einfaches Setup
|
|
- 8 Backup-Codes für Notfallzugriff
|
|
- Backup-Codes als Textdatei downloadbar
|
|
|
|
4. **Neue Routen:**
|
|
- `/profile` - Benutzerprofil mit Passwort und 2FA-Verwaltung
|
|
- `/verify-2fa` - 2FA-Verifizierung beim Login
|
|
- `/profile/setup-2fa` - 2FA-Einrichtung mit QR-Code
|
|
- `/profile/enable-2fa` - 2FA-Aktivierung
|
|
- `/profile/disable-2fa` - 2FA-Deaktivierung
|
|
- `/profile/change-password` - Passwort ändern
|
|
|
|
5. **Sicherheits-Features:**
|
|
- Fallback zu Environment-Variablen für Rückwärtskompatibilität
|
|
- Session-Management für 2FA-Verifizierung
|
|
- Fehlgeschlagene 2FA-Versuche werden protokolliert
|
|
- Verwendete Backup-Codes werden entfernt
|
|
|
|
**Verwendete Libraries (alle kostenlos):**
|
|
- `bcrypt` - Passwort-Hashing
|
|
- `pyotp` - TOTP-Generierung und Verifizierung
|
|
- `qrcode[pil]` - QR-Code-Generierung
|
|
|
|
**Migration:**
|
|
- Migrations-Script für existierende Benutzer erstellt und angewendet
|
|
- Erhält bestehende Credentials aus Environment-Variablen
|
|
- Erstellt Datenbank-Einträge mit gehashten Passwörtern
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/init.sql` - Users-Tabelle hinzugefügt
|
|
- `v2_adminpanel/requirements.txt` - Neue Dependencies
|
|
- `v2_adminpanel/app.py` - Auth-Funktionen und neue Routen
|
|
- `v2_adminpanel/templates/base.html` - Profil-Link hinzugefügt
|
|
- `v2_adminpanel/templates/profile.html` - Profil-Seite (neu)
|
|
- `v2_adminpanel/templates/verify_2fa.html` - 2FA-Verifizierung (neu)
|
|
- `v2_adminpanel/templates/setup_2fa.html` - 2FA-Setup (neu)
|
|
- `v2_adminpanel/templates/backup_codes.html` - Backup-Codes Anzeige (neu)
|
|
|
|
**Status:** ✅ Vollständig implementiert
|
|
|
|
### 2025-06-09: Internal Server Error behoben und UI-Design angepasst
|
|
|
|
### 2025-06-09: Journal-Bereinigung und Projekt-Cleanup
|
|
|
|
**Durchgeführte Aufgaben:**
|
|
|
|
1. **Überflüssige SQL-Dateien gelöscht:**
|
|
- Migrations-Scripts - Waren nur für einmalige Anwendung nötig
|
|
- Test-Daten-Scripts - Nach Anwendung nicht mehr benötigt
|
|
|
|
2. **Journal aktualisiert:**
|
|
- Veraltete Todo-Liste korrigiert (viele Features bereits implementiert)
|
|
- Passwörter aus Zugangsdaten entfernt (Sicherheit)
|
|
- "Bekannte Probleme" auf aktuellen Stand gebracht
|
|
- Neuer Abschnitt "Best Practices für Produktiv-Migration" hinzugefügt
|
|
|
|
3. **Status-Klärungen:**
|
|
- Alle Daten sind Testdaten (PoC-Phase)
|
|
- 2FA ist implementiert und funktionsfähig
|
|
- Resource Pool System ist vollständig implementiert
|
|
- Port 8443 ist geschlossen (nur über Nginx erreichbar)
|
|
|
|
**Noch zu erledigen:**
|
|
- Nginx Config anpassen (proxy_pass von https:// auf http://)
|
|
- License Server API implementieren (Hauptaufgabe)
|
|
|
|
**Problem:**
|
|
- Internal Server Error nach Login wegen fehlender `users` Tabelle
|
|
- UI-Design der neuen 2FA-Seiten passte nicht zum Rest der Anwendung
|
|
|
|
**Lösung:**
|
|
|
|
1. **Datenbank-Fix:**
|
|
- Users-Tabelle wurde nicht automatisch erstellt
|
|
- Manuell mit SQL-Script nachgeholt
|
|
- Migration erfolgreich durchgeführt
|
|
- Beide Admin-User (rac00n, w@rh@mm3r) migriert
|
|
|
|
2. **UI-Design Überarbeitung:**
|
|
- Profile-Seite im Dashboard-Stil mit Cards und Hover-Effekten
|
|
- 2FA-Setup mit nummerierten Schritten und modernem Card-Design
|
|
- Backup-Codes Seite mit Animation und verbessertem Layout
|
|
- Konsistente Farbgebung und Icons
|
|
- Verbesserte Benutzerführung mit visuellen Hinweisen
|
|
|
|
**Design-Features:**
|
|
- Card-basiertes Layout mit Schatten-Effekten
|
|
- Hover-Animationen für bessere Interaktivität
|
|
- Farbcodierte Sicherheitsstatus-Anzeigen
|
|
- Passwort-Stärke-Indikator mit visueller Rückmeldung
|
|
- Responsive Design für alle Bildschirmgrößen
|
|
- Print-optimiertes Layout für Backup-Codes
|
|
|
|
**Hinweis:**
|
|
- Users-Tabelle wurde manuell erstellt (Script danach gelöscht)
|
|
|
|
### 2025-06-09: Journal-Bereinigung
|
|
|
|
**Durchgeführte Änderungen:**
|
|
- Todo-Listen und Status-Informationen entfernt
|
|
- Fokus auf chronologische Dokumentation der Änderungen
|
|
- Veraltete Dateien und Scripts dokumentiert als gelöscht
|
|
|
|
### 2025-06-09: Nginx Config angepasst
|
|
|
|
**Änderung:**
|
|
- proxy_pass für License Server von `https://license-server:8443` auf `http://license-server:8443` geändert
|
|
- `proxy_ssl_verify off` entfernt (nicht mehr nötig bei HTTP)
|
|
- WebSocket-Support hinzugefügt (für zukünftige Features)
|
|
|
|
**Grund:**
|
|
- License Server läuft intern auf HTTP (wie Admin Panel)
|
|
- SSL-Termination erfolgt nur am Nginx
|
|
- Vereinfachte Konfiguration ohne doppelte SSL-Verschlüsselung
|
|
|
|
**Hinweis:**
|
|
Docker-Container müssen neu gestartet werden, damit die Änderung wirksam wird:
|
|
```bash
|
|
docker-compose down
|
|
docker-compose up -d
|
|
```
|
|
- `v2_adminpanel/templates/profile.html` - Komplett überarbeitet
|
|
- `v2_adminpanel/templates/setup_2fa.html` - Neues Step-by-Step Design
|
|
- `v2_adminpanel/templates/backup_codes.html` - Modernisiertes Layout
|
|
|
|
**Status:** ✅ Abgeschlossen - Login funktioniert, UI im konsistenten Design
|
|
|
|
### 2025-06-09: Lizenzschlüssel-Format geändert
|
|
|
|
**Änderung:**
|
|
- Altes Format: `AF-YYYYMMFT-XXXX-YYYY-ZZZZ` (z.B. AF-202506F-V55Y-9DWE-GL5G)
|
|
- Neues Format: `AF-F-YYYYMM-XXXX-YYYY-ZZZZ` (z.B. AF-F-202506-V55Y-9DWE-GL5G)
|
|
|
|
**Vorteile:**
|
|
- Klarere Struktur mit separatem Typ-Indikator
|
|
- Einfacher zu lesen und zu verstehen
|
|
- Typ (F/T) sofort im zweiten Block erkennbar
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py`:
|
|
- `generate_license_key()` - Generiert Keys im neuen Format
|
|
- `validate_license_key()` - Validiert Keys mit neuem Regex-Pattern
|
|
- `v2_adminpanel/templates/index.html`:
|
|
- Placeholder und Pattern für Input-Feld angepasst
|
|
- JavaScript charAt() Position für Typ-Prüfung korrigiert
|
|
- `v2_adminpanel/templates/batch_form.html`:
|
|
- Vorschau-Format für Batch-Generierung angepasst
|
|
|
|
**Hinweis:** Alte Keys im bisherigen Format bleiben ungültig. Bei Bedarf könnte eine Migration oder Dual-Support implementiert werden.
|
|
|
|
**Status:** ✅ Implementiert
|
|
|
|
### 2025-06-09: Datenbank-Migration der Lizenzschlüssel
|
|
|
|
**Durchgeführt:**
|
|
- Alle bestehenden Lizenzschlüssel in der Datenbank auf das neue Format migriert
|
|
- 18 Lizenzschlüssel erfolgreich konvertiert (16 Full, 2 Test)
|
|
|
|
**Migration:**
|
|
- Von: `AF-YYYYMMFT-XXXX-YYYY-ZZZZ`
|
|
- Nach: `AF-F-YYYYMM-XXXX-YYYY-ZZZZ`
|
|
|
|
**Beispiele:**
|
|
- Alt: `AF-202506F-V55Y-9DWE-GL5G`
|
|
- Neu: `AF-F-202506-V55Y-9DWE-GL5G`
|
|
|
|
**Hinweis:**
|
|
- Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht
|
|
|
|
**Status:** ✅ Alle Lizenzschlüssel erfolgreich migriert
|
|
|
|
### 2025-06-09: Kombinierte Kunden-Lizenz-Ansicht implementiert
|
|
|
|
**Problem:**
|
|
- Umständliche Navigation zwischen Kunden- und Lizenzseiten
|
|
- Viel Hin-und-Her-Springen bei der Verwaltung
|
|
- Kontext-Verlust beim Wechseln zwischen Ansichten
|
|
|
|
**Lösung:**
|
|
Master-Detail View mit 2-Spalten Layout implementiert
|
|
|
|
**Phase 1-3 abgeschlossen:**
|
|
1. **Backend-Implementierung:**
|
|
- Neue Route `/customers-licenses` für kombinierte Ansicht
|
|
- API-Endpoints für AJAX: `/api/customer/<id>/licenses`, `/api/customer/<id>/quick-stats`
|
|
- API-Endpoint `/api/license/<id>/quick-edit` für Inline-Bearbeitung
|
|
- Optimierte SQL-Queries mit JOIN für Performance
|
|
|
|
2. **Template-Erstellung:**
|
|
- Neues Template `customers_licenses.html` mit Master-Detail Layout
|
|
- Links: Kundenliste (30%) mit Suchfeld
|
|
- Rechts: Lizenzen des ausgewählten Kunden (70%)
|
|
- Responsive Design (Mobile: untereinander)
|
|
- JavaScript für dynamisches Laden ohne Seitenreload
|
|
- Keyboard-Navigation (↑↓ für Kundenwechsel)
|
|
|
|
3. **Integration:**
|
|
- Dashboard: Neuer Button "Kunden & Lizenzen"
|
|
- Customers-Seite: Link zur kombinierten Ansicht
|
|
- Licenses-Seite: Link zur kombinierten Ansicht
|
|
- Lizenz-Erstellung: Unterstützung für vorausgewählten Kunden
|
|
- API /api/customers erweitert für Einzelabruf per ID
|
|
|
|
**Features:**
|
|
- Live-Suche in Kundenliste
|
|
- Quick-Actions: Copy License Key, Toggle Status
|
|
- Modal für neue Lizenz direkt aus Kundenansicht
|
|
- URL-Update ohne Reload für Bookmarking
|
|
- Loading-States während AJAX-Calls
|
|
- Visuelles Feedback (aktiver Kunde hervorgehoben)
|
|
|
|
**Noch ausstehend:**
|
|
- Phase 4: Inline-Edit für Lizenzdetails
|
|
- Phase 5: Erweiterte Error-Handling und Polish
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py` - Neue Routen und API-Endpoints
|
|
- `v2_adminpanel/templates/customers_licenses.html` - Neues Template
|
|
- `v2_adminpanel/templates/dashboard.html` - Neuer Button
|
|
- `v2_adminpanel/templates/customers.html` - Link zur kombinierten Ansicht
|
|
- `v2_adminpanel/templates/licenses.html` - Link zur kombinierten Ansicht
|
|
- `v2_adminpanel/templates/index.html` - Unterstützung für preselected_customer_id
|
|
|
|
**Status:** ✅ Grundfunktionalität implementiert und funktionsfähig
|
|
|
|
### 2025-06-09: Kombinierte Ansicht - Fertigstellung
|
|
|
|
**Abgeschlossen:**
|
|
- Phase 1-3 der kombinierten Kunden-Lizenz-Ansicht vollständig implementiert
|
|
- Master-Detail Layout funktioniert einwandfrei
|
|
- AJAX-basiertes Laden ohne Seitenreload
|
|
- Keyboard-Navigation mit Pfeiltasten
|
|
- Quick-Actions für Copy und Toggle Status
|
|
- Integration in alle relevanten Seiten
|
|
|
|
**Verbesserung gegenüber vorher:**
|
|
- Kein Hin-und-Her-Springen mehr zwischen Seiten
|
|
- Kontext bleibt erhalten beim Arbeiten mit Kunden
|
|
- Schnellere Navigation und bessere Übersicht
|
|
- Deutlich verbesserte User Experience
|
|
|
|
**Optional für später (Phase 4-5):**
|
|
- Inline-Edit für weitere Felder
|
|
- Erweiterte Quick-Actions
|
|
- Session-basierte Filter-Persistenz
|
|
|
|
Die Hauptproblematik der umständlichen Navigation ist damit gelöst!
|
|
|
|
### 2025-06-09: Test-Flag für Lizenzen implementiert
|
|
|
|
**Ziel:**
|
|
- Klare Trennung zwischen Testdaten und echten Produktivdaten
|
|
- Testdaten sollen von der Software ignoriert werden können
|
|
- Bessere Übersicht im Admin Panel
|
|
|
|
**Durchgeführte Änderungen:**
|
|
|
|
1. **Datenbank-Schema (init.sql):**
|
|
- Neue Spalte `is_test BOOLEAN DEFAULT FALSE` zur `licenses` Tabelle hinzugefügt
|
|
- Migration für bestehende Daten: Alle werden als `is_test = TRUE` markiert
|
|
- Index `idx_licenses_is_test` für bessere Performance
|
|
|
|
2. **Backend (app.py):**
|
|
- Dashboard-Queries filtern Testdaten mit `WHERE is_test = FALSE` aus
|
|
- Lizenz-Erstellung: Neues Checkbox-Feld für Test-Markierung
|
|
- Lizenz-Bearbeitung: Test-Status kann geändert werden
|
|
- Export: Optional mit/ohne Testdaten (`?include_test=true`)
|
|
- Bulk-Operationen: Nur auf Live-Daten anwendbar
|
|
- Neue Filter in Lizenzliste: "🧪 Testdaten" und "🚀 Live-Daten"
|
|
|
|
3. **Frontend Templates:**
|
|
- **index.html**: Checkbox "Als Testdaten markieren" bei Lizenzerstellung
|
|
- **edit_license.html**: Checkbox zum Ändern des Test-Status
|
|
- **licenses.html**: Badge 🧪 für Testdaten, neue Filteroptionen
|
|
- **dashboard.html**: Info-Box zeigt Anzahl der Testdaten
|
|
- **batch_form.html**: Option für Batch-Test-Lizenzen
|
|
|
|
4. **Audit-Log Integration:**
|
|
- `is_test` Feld wird bei CREATE/UPDATE geloggt
|
|
- Nachvollziehbarkeit von Test/Live-Status-Änderungen
|
|
|
|
**Technische Details:**
|
|
- Testdaten werden in allen Statistiken ausgefiltert
|
|
- License Server API wird Lizenzen mit `is_test = TRUE` ignorieren
|
|
- Resource Pool bleibt unverändert (kann Test- und Live-Ressourcen verwalten)
|
|
|
|
**Migration der bestehenden Daten:**
|
|
```sql
|
|
UPDATE licenses SET is_test = TRUE; -- Alle aktuellen Daten sind Testdaten
|
|
```
|
|
|
|
**Status:** ✅ Implementiert
|
|
|
|
### 2025-06-09: Test-Flag für Kunden und Resource Pools erweitert
|
|
|
|
**Ziel:**
|
|
- Konsistentes Test-Daten-Management über alle Entitäten
|
|
- Kunden und Resource Pools können ebenfalls als Testdaten markiert werden
|
|
- Automatische Verknüpfung: Test-Kunde → Test-Lizenzen → Test-Ressourcen
|
|
|
|
**Durchgeführte Änderungen:**
|
|
|
|
1. **Datenbank-Schema erweitert:**
|
|
- `customers.is_test BOOLEAN DEFAULT FALSE` hinzugefügt
|
|
- `resource_pools.is_test BOOLEAN DEFAULT FALSE` hinzugefügt
|
|
- Indizes für bessere Performance erstellt
|
|
- Migrations in init.sql integriert
|
|
|
|
2. **Backend (app.py) - Erweiterte Logik:**
|
|
- Dashboard: Separate Zähler für Test-Kunden und Test-Ressourcen
|
|
- Kunde-Erstellung: Erbt Test-Status von Lizenz
|
|
- Test-Kunde erzwingt Test-Lizenzen
|
|
- Resource-Zuweisung: Test-Lizenzen bekommen nur Test-Ressourcen
|
|
- Customer-Management mit is_test Filter
|
|
|
|
3. **Frontend Updates:**
|
|
- **customers.html**: 🧪 Badge für Test-Kunden
|
|
- **edit_customer.html**: Checkbox für Test-Status
|
|
- **dashboard.html**: Erweiterte Test-Statistik (Lizenzen, Kunden, Ressourcen)
|
|
|
|
4. **Geschäftslogik:**
|
|
- Wenn neuer Kunde bei Test-Lizenz erstellt wird → automatisch Test-Kunde
|
|
- Wenn Test-Kunde gewählt wird → Lizenz automatisch als Test markiert
|
|
- Resource Pool Allocation prüft Test-Status für korrekte Zuweisung
|
|
|
|
**Migration der bestehenden Daten:**
|
|
```sql
|
|
UPDATE customers SET is_test = TRUE; -- 5 Kunden
|
|
UPDATE resource_pools SET is_test = TRUE; -- 20 Ressourcen
|
|
```
|
|
|
|
**Technische Details:**
|
|
- Konsistente Test/Live-Trennung über alle Ebenen
|
|
- Dashboard-Statistiken zeigen nur Live-Daten
|
|
- Test-Ressourcen werden nur Test-Lizenzen zugewiesen
|
|
- Alle bestehenden Daten sind jetzt als Test markiert
|
|
|
|
**Status:** ✅ Vollständig implementiert
|
|
|
|
### 2025-06-09 (17:20 - 18:13): Kunden-Lizenz-Verwaltung konsolidiert
|
|
|
|
**Problem:**
|
|
- Kombinierte Ansicht `/customers-licenses` hatte Formatierungs- und Funktionsprobleme
|
|
- Kunden wurden nicht angezeigt
|
|
- Bootstrap Icons fehlten
|
|
- JavaScript-Fehler beim Modal
|
|
- Inkonsistentes Design im Vergleich zu anderen Seiten
|
|
- Testkunden-Filter wurde beim Navigieren nicht beibehalten
|
|
|
|
**Durchgeführte Änderungen:**
|
|
|
|
1. **Frontend-Fixes (base.html):**
|
|
- Bootstrap Icons CSS hinzugefügt: `bootstrap-icons@1.11.3/font/bootstrap-icons.min.css`
|
|
- Bootstrap JavaScript Bundle bereits vorhanden, Reihenfolge optimiert
|
|
|
|
2. **customers_licenses.html komplett überarbeitet:**
|
|
- Container-Klasse von `container-fluid` auf `container py-5` geändert
|
|
- Emojis und Button-Styling vereinheitlicht (👥 Kunden & Lizenzen)
|
|
- Export-Dropdown wie in anderen Ansichten implementiert
|
|
- Card-Styling mit Schatten für einheitliches Design
|
|
- Checkbox "Testkunden anzeigen" mit Status-Beibehaltung
|
|
- JavaScript-Funktionen korrigiert:
|
|
- copyToClipboard mit event.currentTarget
|
|
- showNewLicenseModal mit Bootstrap Modal
|
|
- Header-Update beim AJAX-Kundenwechsel
|
|
- URL-Parameter `show_test` wird überall beibehalten
|
|
|
|
3. **Backend-Anpassungen (app.py):**
|
|
- customers_licenses Route: Optional Testkunden anzeigen mit `show_test` Parameter
|
|
- Redirects von `/customers` und `/licenses` auf `/customers-licenses` implementiert
|
|
- Alte Route-Funktionen entfernt (kein toter Code mehr)
|
|
- edit_license und edit_customer: Redirects behalten show_test Parameter bei
|
|
- Dashboard-Links zeigen jetzt auf kombinierte Ansicht
|
|
|
|
4. **Navigation optimiert:**
|
|
- Dashboard: Klick auf Kunden/Lizenzen-Statistik führt zur kombinierten Ansicht
|
|
- Alle Edit-Links behalten den show_test Parameter bei
|
|
- Konsistente User Experience beim Navigieren
|
|
|
|
**Technische Details:**
|
|
- AJAX-Loading für dynamisches Laden der Lizenzen
|
|
- Keyboard-Navigation (↑↓) für Kundenliste
|
|
- Responsive Design mit Bootstrap Grid
|
|
- Modal-Dialoge für Bestätigungen
|
|
- Live-Suche in der Kundenliste
|
|
|
|
**Resultat:**
|
|
- ✅ Einheitliches Design mit anderen Admin-Panel-Seiten
|
|
- ✅ Alle Funktionen arbeiten korrekt
|
|
- ✅ Testkunden-Filter bleibt erhalten
|
|
- ✅ Keine redundanten Views mehr
|
|
- ✅ Zentrale Verwaltung für Kunden und Lizenzen
|
|
|
|
**Status:** ✅ Vollständig implementiert
|
|
|
|
### 2025-06-09: Test-Daten Checkbox Persistenz implementiert
|
|
|
|
**Problem:**
|
|
- Die "Testkunden anzeigen" Checkbox in `/customers-licenses` verlor ihren Status beim Navigieren zwischen Seiten
|
|
- Wenn Benutzer zu anderen Seiten (Resources, Audit Log, etc.) wechselten und zurückkehrten, war die Checkbox wieder deaktiviert
|
|
- Benutzer mussten die Checkbox jedes Mal neu aktivieren, was umständlich war
|
|
|
|
**Lösung:**
|
|
- Globale JavaScript-Funktion `preserveShowTestParameter()` in base.html implementiert
|
|
- Die Funktion prüft beim Laden jeder Seite, ob `show_test=true` in der URL ist
|
|
- Wenn ja, wird dieser Parameter automatisch an alle internen Links angehängt
|
|
- Backend-Route `/create` wurde angepasst, um den Parameter bei Redirects beizubehalten
|
|
|
|
**Technische Details:**
|
|
1. **base.html** - JavaScript-Funktion hinzugefügt:
|
|
- Läuft beim `DOMContentLoaded` Event
|
|
- Findet alle Links die mit "/" beginnen
|
|
- Fügt `show_test=true` Parameter hinzu wenn nicht bereits vorhanden
|
|
- Überspringt Fragment-Links (#) und Links die bereits den Parameter haben
|
|
|
|
2. **app.py** - Route-Anpassung:
|
|
- `/create` Route behält jetzt `show_test` Parameter bei Redirects bei
|
|
- Andere Routen (edit_license, edit_customer) behalten Parameter bereits bei
|
|
|
|
**Vorteile:**
|
|
- ✅ Konsistente User Experience beim Navigieren
|
|
- ✅ Keine manuelle Anpassung aller Links nötig
|
|
- ✅ Funktioniert automatisch für alle zukünftigen Links
|
|
- ✅ Minimaler Code-Overhead
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/base.html`
|
|
- `v2_adminpanel/app.py`
|
|
|
|
**Status:** ✅ Vollständig implementiert
|
|
|
|
### 2025-06-09: Bearbeiten-Button Fehler behoben
|
|
|
|
**Problem:**
|
|
- Der "Bearbeiten" Button neben dem Kundennamen in der `/customers-licenses` Ansicht verursachte einen Internal Server Error
|
|
- Die URL-Konstruktion war fehlerhaft wenn kein `show_test` Parameter vorhanden war
|
|
- Die edit_customer.html Template hatte falsche Array-Indizes und veraltete Links
|
|
|
|
**Ursache:**
|
|
1. Die href-Attribute wurden falsch konstruiert:
|
|
- Alt: `/customer/edit/ID{% if show_test %}?ref=customers-licenses&show_test=true{% endif %}`
|
|
- Problem: Ohne show_test fehlte das `?ref=customers-licenses` komplett
|
|
|
|
2. Die SQL-Abfrage in edit_customer() holte nur 4 Felder, aber das Template erwartete 5:
|
|
- Query: `SELECT id, name, email, is_test`
|
|
- Template erwartete: `customer[3]` = created_at und `customer[4]` = is_test
|
|
|
|
3. Veraltete Links zu `/customers` statt `/customers-licenses`
|
|
|
|
**Lösung:**
|
|
1. URL-Konstruktion korrigiert in beiden Fällen:
|
|
- Neu: `/customer/edit/ID?ref=customers-licenses{% if show_test %}&show_test=true{% endif %}`
|
|
|
|
2. SQL-Query erweitert um created_at:
|
|
- Neu: `SELECT id, name, email, created_at, is_test`
|
|
|
|
3. Template-Indizes korrigiert:
|
|
- is_test Checkbox nutzt jetzt `customer[4]`
|
|
|
|
4. Navigation-Links aktualisiert:
|
|
- Alle Links zeigen jetzt auf `/customers-licenses` mit show_test Parameter
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/customers_licenses.html` (Zeilen 103 und 295)
|
|
- `v2_adminpanel/app.py` (edit_customer Route)
|
|
- `v2_adminpanel/templates/edit_customer.html`
|
|
|
|
**Status:** ✅ Behoben
|
|
|
|
### 2025-06-09: Unnötigen Lizenz-Erstellungs-Popup entfernt
|
|
|
|
**Änderung:**
|
|
- Der Bestätigungs-Popup "Möchten Sie eine neue Lizenz für KUNDENNAME erstellen?" wurde entfernt
|
|
- Klick auf "Neue Lizenz" Button führt jetzt direkt zur Lizenzerstellung
|
|
|
|
**Technische Details:**
|
|
- Modal-HTML komplett entfernt
|
|
- `showNewLicenseModal()` Funktion vereinfacht - navigiert jetzt direkt zu `/create?customer_id=X`
|
|
- URL-Parameter (wie `show_test`) werden dabei beibehalten
|
|
|
|
**Vorteile:**
|
|
- ✅ Ein Klick weniger für Benutzer
|
|
- ✅ Schnellerer Workflow
|
|
- ✅ Weniger Code zu warten
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/customers_licenses.html`
|
|
|
|
**Status:** ✅ Implementiert
|
|
|
|
### 2025-06-09: Testkunden-Checkbox bleibt jetzt bei Lizenz/Kunden-Bearbeitung erhalten
|
|
|
|
**Problem:**
|
|
- Bei "Lizenz bearbeiten" ging der "Testkunden anzeigen" Haken verloren beim Zurückkehren
|
|
- Die Navigation-Links in edit_license.html zeigten auf `/licenses` statt `/customers-licenses`
|
|
- Der show_test Parameter wurde nur über den unsicheren Referrer übertragen
|
|
|
|
**Lösung:**
|
|
1. **Navigation-Links korrigiert**:
|
|
- Alle Links zeigen jetzt auf `/customers-licenses` mit show_test Parameter
|
|
- Betrifft: "Zurück zur Übersicht" und "Abbrechen" Buttons
|
|
|
|
2. **Hidden Form Field hinzugefügt**:
|
|
- Sowohl in edit_license.html als auch edit_customer.html
|
|
- Überträgt den show_test Parameter sicher beim POST
|
|
|
|
3. **Route-Logik verbessert**:
|
|
- Parameter wird aus Form-Daten ODER GET-Parametern gelesen
|
|
- Nicht mehr auf unsicheren Referrer angewiesen
|
|
- Funktioniert sowohl bei Speichern als auch Abbrechen
|
|
|
|
**Technische Details:**
|
|
- Templates prüfen `request.args.get('show_test')` für Navigation
|
|
- Hidden Input: `<input type="hidden" name="show_test" value="true">`
|
|
- Routes: `show_test = request.form.get('show_test') or request.args.get('show_test')`
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/templates/edit_license.html`
|
|
- `v2_adminpanel/templates/edit_customer.html`
|
|
- `v2_adminpanel/app.py` (edit_license und edit_customer Routen)
|
|
|
|
**Status:** ✅ Vollständig implementiert
|
|
|
|
### 2025-06-09 22:02: Konsistente Sortierung bei Status-Toggle
|
|
|
|
**Problem:**
|
|
- Beim Klicken auf den An/Aus-Knopf (Status-Toggle) in der Kunden & Lizenzen Ansicht änderte sich die Reihenfolge der Lizenzen
|
|
- Dies war verwirrend für Benutzer, da die Position der gerade bearbeiteten Lizenz springen konnte
|
|
|
|
**Ursache:**
|
|
- Die Sortierung `ORDER BY l.created_at DESC` war nicht stabil genug
|
|
- Bei gleichem Erstellungszeitpunkt konnte die Datenbank die Reihenfolge inkonsistent zurückgeben
|
|
|
|
**Lösung:**
|
|
- Sekundäres Sortierkriterium hinzugefügt: `ORDER BY l.created_at DESC, l.id DESC`
|
|
- Dies stellt sicher, dass bei gleichem Erstellungsdatum nach ID sortiert wird
|
|
- Die Reihenfolge bleibt jetzt konsistent, auch nach Status-Änderungen
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py`:
|
|
- Zeile 2278: `/customers-licenses` Route
|
|
- Zeile 2319: `/api/customer/<int:customer_id>/licenses` API-Route
|
|
|
|
### 2025-06-10 00:01: Verbesserte Integration zwischen Kunden & Lizenzen und Resource Pool
|
|
|
|
**Problem:**
|
|
- Umständliche Navigation zwischen Kunden & Lizenzen und Resource Pool Bereichen
|
|
- Keine direkte Verbindung zwischen beiden Ansichten
|
|
- Benutzer mussten ständig zwischen verschiedenen Seiten hin- und herspringen
|
|
|
|
**Implementierte Lösung - 5 Phasen:**
|
|
|
|
1. **Phase 1: Ressourcen-Details in Kunden & Lizenzen Ansicht**
|
|
- API `/api/customer/{id}/licenses` erweitert um konkrete Ressourcen-Informationen
|
|
- Neue API `/api/license/{id}/resources` für detaillierte Ressourcen einer Lizenz
|
|
- Anzeige der zugewiesenen Ressourcen mit Info-Buttons und Modal-Dialogen
|
|
- Klickbare Links zu Ressourcen-Details im Resource Pool
|
|
|
|
2. **Phase 2: Quick-Actions für Ressourcenverwaltung**
|
|
- "Ressourcen verwalten" Button (Zahnrad-Icon) bei jeder Lizenz
|
|
- Modal mit Übersicht aller zugewiesenen Ressourcen
|
|
- Vorbereitung für Quarantäne-Funktionen und Ressourcen-Austausch
|
|
|
|
3. **Phase 3: Ressourcen-Preview bei Lizenzerstellung**
|
|
- Live-Anzeige verfügbarer Ressourcen beim Ändern der Anzahl
|
|
- Erweiterte Verfügbarkeitsanzeige mit Badges (OK/Niedrig/Kritisch)
|
|
- Warnungen bei niedrigem Bestand mit visuellen Hinweisen
|
|
- Fortschrittsbalken zur Visualisierung der Verfügbarkeit
|
|
|
|
4. **Phase 4: Dashboard-Integration**
|
|
- Resource Pool Widget mit erweiterten Links
|
|
- Kritische Warnungen bei < 50 Ressourcen mit "Auffüllen" Button
|
|
- Direkte Navigation zu gefilterten Ansichten (nach Typ/Status)
|
|
- Verbesserte visuelle Darstellung mit Tooltips
|
|
|
|
5. **Phase 5: Bidirektionale Navigation**
|
|
- Von Resource Pool: Links zu Kunden/Lizenzen bei zugewiesenen Ressourcen
|
|
- "Zurück zu Kunden" Button wenn von Kunden & Lizenzen kommend
|
|
- Navigation-Links im Dashboard für schnellen Zugriff
|
|
- SQL-Query erweitert um customer_id für direkte Verlinkung
|
|
|
|
**Technische Details:**
|
|
- JavaScript-Funktionen für Modal-Dialoge und Ressourcen-Details
|
|
- Erweiterte SQL-Queries mit JOINs für Ressourcen-Informationen
|
|
- Bootstrap 5 Tooltips und Modals für bessere UX
|
|
- Globale Variable `currentLicenses` für Caching der Lizenzdaten
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py` - Neue APIs und erweiterte Queries
|
|
- `v2_adminpanel/templates/customers_licenses.html` - Ressourcen-Details und Modals
|
|
- `v2_adminpanel/templates/index.html` - Erweiterte Verfügbarkeitsanzeige
|
|
- `v2_adminpanel/templates/dashboard.html` - Verbesserte Resource Pool Integration
|
|
- `v2_adminpanel/templates/resources.html` - Bidirektionale Navigation
|
|
|
|
**Status:** ✅ Alle 5 Phasen erfolgreich implementiert
|
|
|
|
### 2025-06-10 00:15: IP-Adressen-Erfassung hinter Reverse Proxy korrigiert
|
|
|
|
**Problem:**
|
|
- Flask-App erfasste nur die Docker-interne IP-Adresse von Nginx (172.19.0.5)
|
|
- Echte Client-IPs wurden nicht in Audit-Logs und Login-Attempts gespeichert
|
|
- Nginx setzte die Header korrekt, aber Flask las sie nicht aus
|
|
|
|
**Ursache:**
|
|
- Flask verwendet standardmäßig nur `request.remote_addr`
|
|
- Dies gibt bei einem Reverse Proxy nur die Proxy-IP zurück
|
|
- Die Header `X-Real-IP` und `X-Forwarded-For` wurden ignoriert
|
|
|
|
**Lösung:**
|
|
1. **ProxyFix Middleware** hinzugefügt für korrekte Header-Verarbeitung
|
|
2. **get_client_ip() Funktion** angepasst:
|
|
- Prüft zuerst `X-Real-IP` Header
|
|
- Dann `X-Forwarded-For` Header (nimmt erste IP bei mehreren)
|
|
- Fallback auf `request.remote_addr`
|
|
3. **Debug-Logging** für IP-Erfassung hinzugefügt
|
|
4. **Alle `request.remote_addr` Aufrufe** durch `get_client_ip()` ersetzt
|
|
|
|
**Technische Details:**
|
|
```python
|
|
# ProxyFix für korrekte IP-Adressen
|
|
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)
|
|
|
|
# Verbesserte IP-Erfassung
|
|
def get_client_ip():
|
|
if request.headers.get('X-Real-IP'):
|
|
return request.headers.get('X-Real-IP')
|
|
elif request.headers.get('X-Forwarded-For'):
|
|
return request.headers.get('X-Forwarded-For').split(',')[0].strip()
|
|
else:
|
|
return request.remote_addr
|
|
```
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_adminpanel/app.py` - ProxyFix und verbesserte IP-Erfassung
|
|
|
|
**Status:** ✅ Implementiert - Neue Aktionen erfassen jetzt echte Client-IPs
|
|
|
|
### 2025-06-10 00:30: Docker ENV Legacy-Format Warnungen behoben
|
|
|
|
**Problem:**
|
|
- Docker Build zeigte Warnungen: "LegacyKeyValueFormat: ENV key=value should be used"
|
|
- Veraltetes Format `ENV KEY VALUE` wurde in Dockerfiles verwendet
|
|
|
|
**Lösung:**
|
|
- Alle ENV-Anweisungen auf neues Format `ENV KEY=VALUE` umgestellt
|
|
- Betraf hauptsächlich v2_postgres/Dockerfile mit 3 ENV-Zeilen
|
|
|
|
**Geänderte Dateien:**
|
|
- `v2_postgres/Dockerfile` - ENV-Format modernisiert
|
|
|
|
**Beispiel der Änderung:**
|
|
```dockerfile
|
|
# Alt (Legacy):
|
|
ENV LANG de_DE.UTF-8
|
|
ENV LANGUAGE de_DE:de
|
|
|
|
# Neu (Modern):
|
|
ENV LANG=de_DE.UTF-8
|
|
ENV LANGUAGE=de_DE:de
|
|
```
|
|
|
|
**Status:** ✅ Alle Dockerfiles verwenden jetzt das moderne ENV-Format
|
|
|
|
**Status:** ✅ Behoben |