120 KiB
v2-Docker Projekt Journal
Letzte Änderungen (22.06.2025 - 18:30 Uhr)
Export-Funktionen komplett repariert ✅
Probleme gefunden und behoben:
- Parameter-Mismatch: Templates übergaben
include_test, Routes erwartetenshow_fake - Bootstrap Dropdowns funktionierten nicht: JavaScript-Konflikt verhinderte Dropdown-Öffnung
- Excel Timezone-Fehler: "Excel does not support datetimes with timezones"
Implementierte Lösungen:
-
Nur echte Daten beim Export:
- Alle Export-Queries filtern jetzt mit
WHERE is_fake = false - Keine Test/Fake-Daten mehr in Exporten
- Alle Export-Queries filtern jetzt mit
-
Dropdown durch direkte Buttons ersetzt:
- Statt problematischer Dropdowns: Einzelne Export-Buttons
- Funktioniert ohne JavaScript, zuverlässiger
- Übersichtlicher: alle Optionen sofort sichtbar
-
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 Dropdowntemplates/audit_log.html- Export-Buttons statt Dropdowntemplates/sessions.html- Export-Buttons statt Dropdownroutes/export_routes.py- Datetime-Formatierung für alle Exportsutils/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:
- Excel-Exporte funktionieren für: Lizenzen, Kunden, Sessions, Audit Logs, Ressourcen
- Export-Routes in
export_routes.pyprüfen nie denformat=csvParameter - Nur
create_excel_export()existiert, keine CSV-Generierung implementiert - Monitoring-Exporte haben nur JavaScript-Platzhalter ohne Backend
- Lead Management hat keine Export-Funktionalität
Lösungsplan (YAGNI & Strukturiert):
-
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
-
Monitoring Export (Priorität 2)
- Neue Route
/export/monitoringnach bestehendem Muster - Daten von existierenden Monitoring-Endpoints nutzen
- Excel und CSV Format unterstützen
- Neue Route
-
Lead Export (Priorität 3)
- Route
/leads/exportzum Lead Blueprint hinzufügen - Institutionen mit Kontakt-Anzahl exportieren
- Gleiches Muster wie andere Exporte verwenden
- Route
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:
-
CSV Export Support hinzugefügt:
- Neue Funktion
create_csv_export()inutils/export.py - Alle Export-Routes prüfen jetzt den
formatParameter - CSV-Dateien mit UTF-8 BOM für Excel-Kompatibilität
- Neue Funktion
-
Monitoring Export implementiert:
- Neue Route
/export/monitoringinexport_routes.py - Exportiert Heartbeats und optional Anomalien
- JavaScript-Funktionen in Templates aktualisiert
- Neue Route
-
Lead Export hinzugefügt:
- Neue Route
/leads/exportinleads/routes.py - Exportiert Institutionen mit Kontakt-Statistiken
- Export-Buttons zu Institutions-Template hinzugefügt
- Neue Route
Geänderte Dateien:
utils/export.py- CSV-Export-Funktion hinzugefügtroutes/export_routes.py- Format-Parameter-Prüfung für alle Routesroutes/export_routes.py- Monitoring-Export hinzugefügtleads/routes.py- Lead-Export-Route hinzugefügttemplates/monitoring/analytics.html- Export-Funktionen aktualisierttemplates/monitoring/live_dashboard.html- Export-Funktionen aktualisiertleads/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)
- Aktiv =
- Lizenzen laufen nach Ablauf weiter bis zur manuellen Deaktivierung
Geänderte Dateien:
templates/licenses.html- Komplettes Filter-UI überarbeitetroutes/license_routes.py- Filter-Logik angepasstv2_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_keySpalte ausclient_configszu lesen
Lösung:
- SELECT Statement in
admin_routes.pykorrigiert (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_keyTabelle: Globaler System API Keyclient_configsTabelle: 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_keySpalte ausclient_configsentfernt- 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 Anzeigemigrations/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_keyTabelle 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:
-
Single-Session Enforcement:
- Nur eine aktive Sitzung pro Lizenz erlaubt
- Deutsche Fehlermeldung bei Mehrfach-Login-Versuch
- Session-Token basiertes System mit UUID
-
Heartbeat System:
- 30-Sekunden Heartbeat-Intervall
- Automatische Session-Bereinigung nach 60 Sekunden Inaktivität
- Background Job für Session-Cleanup
-
Session Management Endpoints:
POST /api/license/session/start- Session initialisierungPOST /api/license/session/heartbeat- Keep-alivePOST /api/license/session/end- Sauberes Session-Ende- Vollständige Session-Historie in
session_historyTabelle
-
Admin Panel Integration:
- Lizenzserver Administration mit API-Key Management
- Live Session Monitor mit Auto-Refresh
- Session-Terminierung durch Admins
- Version Management (Current/Minimum)
-
Datenbank-Schema:
client_configs- Zentrale Konfigurationlicense_sessions- Aktive Sessions (UNIQUE per license_id)session_history- Audit Trail mit end_reasonsystem_api_key- Globaler API Key
Status: ✅ Vollständig implementiert und produktionsbereit
Dokumentation vollständig aktualisiert
Aktualisierte Dateien:
-
OPERATIONS_GUIDE.md:
- Korrekte Container-Namen (v2_*)
- Aktuelle Service-Konfigurationen
- Neue Features dokumentiert (Leads, Resources, Monitoring)
- Health-Check Befehle aktualisiert
-
CLAUDE.md:
- Vollständige Projektstruktur mit allen Modulen
- Alle Datenbank-Tabellen dokumentiert
- Session Management Patterns
- Erweiterte Common Issues Liste
-
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_heartbeatsTabelle existiert noch nicht (wird mit License Server implementiert)anomaly_detectionsTabelle existiert noch nicht- Zu komplexe Subqueries führten zu Datenbankfehlern
-
Lösung implementiert:
- SQL-Abfrage in
api_customer_licensesvereinfacht - Entfernt: Alle Referenzen zu noch nicht existierenden Tabellen
- Platzhalter-Werte (0) für License Server Statistiken eingefügt
- Bessere Fehlerbehandlung mit detaillierten Fehlermeldungen
- SQL-Abfrage in
-
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
leadsModul ohne Navbar-Eintrag - Zugang über "Leads" Button auf Kunden & Lizenzen Seite
- Vollständig getrennt vom bestehenden Kundensystem
- Separates
-
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 erforderlichlead_contacts: Kontaktpersonen mit Institutionlead_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
- SQL-Script:
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_heartbeatsTabelle 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_personentfernt) - Alle Referenzen nutzen jetzt korrekt
c.name as company_name
- Datenbankabfrage korrigiert (falsche Spaltenreferenz
-
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_limitinlicensesTabelle (Standard: 3, Range: 1-10) - Neue Tabelle
device_registrationsfür Hardware-ID Tracking - Indizes für Performance-Optimierung hinzugefügt
- Neue Spalte
-
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 LizenzPOST /api/license/<id>/register-device- Registriert ein neues GerätPOST /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:
-
Environment Variables erstellen:
# .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. -
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)
-
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
-
Wichtige Checkliste:
.envin.gitignoreaufnehmen- 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
/licensesfü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:
-
Entfernte Dateien:
- v2_adminpanel/templates/.env (Duplikat der Haupt-.env)
- v2_postgreSQL/ (leeres Verzeichnis)
- SSL-Zertifikate aus Root-Verzeichnis (7 Dateien)
- Ungenutzer
jsonImport aus app.py
-
Organisatorische Verbesserungen:
- PowerShell-Scripts in neuen
scripts/Ordner verschoben - SSL-Zertifikate nur noch in v2_nginx/ssl/
- Keine Konfigurationsdateien mehr in Template-Verzeichnissen
- PowerShell-Scripts in neuen
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:
-
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:5000statt HTTPS
-
Dockerfile Anpassung (v2_adminpanel/Dockerfile):
- EXPOSE Port von 443 auf 5000 geändert
- Container exponiert jetzt HTTP statt HTTPS
-
Nginx Konfiguration (nginx.conf):
- proxy_pass von
https://admin-panel:443aufhttp://admin-panel:5000geändert proxy_ssl_verify offentfernt (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
- proxy_pass von
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:
- Credentials im Klartext in .env Datei
- SSL-Zertifikate im Repository gespeichert
- 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:
-
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)
-
Timing-Attack Schutz:
- Mindestens 1 Sekunde Antwortzeit bei allen Login-Versuchen
- Gleiche Antwortzeit bei richtigem/falschem Username
- Verhindert Username-Enumeration
-
Lustige Fehlermeldungen (zufällig):
- "NOPE!"
- "ACCESS DENIED, TRY HARDER"
- "WRONG! 🚫"
- "COMPUTER SAYS NO"
- "YOU FAILED"
-
Dashboard-Sicherheitswidget:
- Sicherheitslevel-Anzeige (NORMAL/ERHÖHT/KRITISCH)
- Anzahl gesperrter IPs
- Fehlversuche heute
- Letzte 5 Sicherheitsereignisse mit Details
-
IP-Verwaltung:
- Übersicht aller gesperrten IPs
- Manuelles Entsperren möglich
- Login-Versuche zurücksetzen
- Detaillierte Informationen pro IP
-
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:
-
Session-Timeout Backend:
- Flask Session-Timeout auf 5 Minuten konfiguriert
- Heartbeat-Endpoint für Keep-Alive
- Automatisches Session-Update bei jeder Aktion
-
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
-
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
-
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:
-
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
-
Heartbeat-Endpoint (app.py):
- Geändert zu POST-only Endpoint
- Aktualisiert explizit last_activity wenn aufgerufen
- Wird nur bei aktiver Benutzerinteraktion aufgerufen
-
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
-
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:
-
Fehlender Import behoben:
flashzu Flask-Imports hinzugefügt für Timeout-Warnmeldungen
-
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)
-
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
-
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:
-
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
-
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
-
Environment-Konfiguration (.env):
- RECAPTCHA_SITE_KEY (für Frontend)
- RECAPTCHA_SECRET_KEY (für Backend-Validierung)
- Beide auskommentiert für PoC-Phase
-
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:
- Google reCAPTCHA v2 Keys erstellen: https://www.google.com/recaptcha/admin
- Keys in .env eintragen:
RECAPTCHA_SITE_KEY=your-site-key RECAPTCHA_SECRET_KEY=your-secret-key - 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:
-
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
-
Keys erhalten:
- Site Key (öffentlich für Frontend)
- Secret Key (geheim für Backend-Validierung)
-
Keys in .env eintragen:
RECAPTCHA_SITE_KEY=6Ld... RECAPTCHA_SECRET_KEY=6Ld... -
Container neu starten:
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:
-
Backend-Funktionen (app.py):
generate_license_key()- Generiert Keys mit kryptografisch sicherem Zufallsgeneratorvalidate_license_key()- Validiert das Key-Format mit Regex- Verwendet
secretsstattrandomfür Sicherheit - Erlaubte Zeichen: ABCDEFGHJKLMNPQRSTUVWXYZ23456789 (ohne verwirrende)
-
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
- POST
-
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
-
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)
-
Validierung:
- Server-seitige Format-Validierung beim Speichern
- Flash-Message bei ungültigem Format
- Automatische Großschreibung des Keys
- Pattern-Validierung im HTML-Formular
-
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:
-
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)
-
Backend-Verarbeitung:
- Route
/batchfü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
- Route
-
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
-
Export-Funktionalität:
- Route
/batch/exportfü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
- Route
-
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:
- Admin geht zu
/batch - Gibt Kunde "Firma GmbH", Anzahl "25", Typ "Vollversion" ein
- System generiert 25 eindeutige Keys
- Ergebnis-Seite zeigt alle Keys
- Admin kann CSV exportieren oder Keys kopieren
- 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:
- Select2 Library für searchable Dropdown integriert
- API-Endpoint
/api/customersfür die Kundensuche erstellt - Frontend angepasst:
- Searchable Dropdown mit Live-Suche
- Option "Neuer Kunde" im Dropdown
- Eingabefelder erscheinen nur bei "Neuer Kunde"
- Backend-Logik verbessert:
- Prüfung ob neuer oder bestehender Kunde
- E-Mail-Duplikatsprüfung vor Kundenerstellung
- Separate Audit-Logs für Kunde und Lizenz
- Datenbank:
- UNIQUE Constraint auf E-Mail-Spalte hinzugefügt
Änderungen:
app.py: Neuer API-Endpoint/api/customers, angepasste Routes/createund/batchbase.html: Select2 CSS und JS eingebundenindex.html: Kundenauswahl mit Select2 implementiertbatch_form.html: Kundenauswahl mit Select2 implementiertinit.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:
- Frontend-Änderungen:
- Startdatum + Laufzeit (Zahl) + Einheit (Tage/Monate/Jahre)
- Ablaufdatum wird automatisch berechnet und angezeigt (read-only)
- Standard: 1 Jahr Laufzeit voreingestellt
- Backend-Validierung:
- Server-seitige Berechnung zur Sicherheit
- Verwendung von
python-dateutilfür korrekte Monats-/Jahresberechnungen
- Benutzerfreundlichkeit:
- Sofortige Neuberechnung bei Änderungen
- Visuelle Hervorhebung des berechneten Datums
Änderungen:
index.html: Laufzeit-Eingabe statt Ablaufdatumbatch_form.html: Laufzeit-Eingabe statt Ablaufdatumapp.py: Datum-Berechnung in/createund/batchRoutesrequirements.txt:python-dateutilhinzugefü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_atzu setzen, aber Spalte existierte nicht - Inkonsistenz: Einzellizenzen hatten kein created_at, Batch-Lizenzen versuchten es zu setzen
Lösung:
- Datenbank-Schema erweitert:
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMPzur licenses Tabelle hinzugefügt- Migration für bestehende Datenbanken implementiert
- Konsistent mit customers Tabelle
- Code bereinigt:
- Explizites
created_ataus Batch-INSERT entfernt - Datenbank setzt nun automatisch den Zeitstempel bei ALLEN Lizenzen
- Explizites
Änderungen:
init.sql: created_at Spalte zur licenses Tabelle mit DEFAULT-Wertinit.sql: Migration für bestehende Datenbankenapp.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:
- 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
- CASE-Statement prüft zuerst
- Dashboard-Statistik erweitert:
- Neue Zählung für deaktivierte Lizenzen
- Variable
inactive_licensesim stats Dictionary
Änderungen:
app.py: Dashboard - Status-Berechnung für letzte 5 Lizenzenapp.py: Lizenzübersicht - Status-Berechnung in der Hauptabfrageapp.py: Export - Status-Berechnung für CSV/Excel Exportapp.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:
- Moderne Cipher Suite Konfiguration:
- Nur sichere ECDHE und DHE Cipher Suites
- Entfernung aller RSA-only Cipher Suites
- Perfect Forward Secrecy für alle Verbindungen
- SSL-Optimierungen:
- Session Cache aktiviert (1 Tag Timeout)
- OCSP Stapling für bessere Performance
- DH Parameters (2048 bit) für zusätzliche Sicherheit
- Resolver-Konfiguration:
- Google DNS Server für OCSP Stapling
Änderungen:
v2_nginx/nginx.conf: Komplett überarbeitete SSL-Konfigurationv2_nginx/ssl/dhparam.pem: Neue 2048-bit DH Parameters generiertv2_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:
- CAPTCHA-Prüfung nur wenn Keys vorhanden:
recaptcha_site_keywird vor CAPTCHA-Prüfung geprüft- Wenn keine Keys konfiguriert → kein CAPTCHA-Check
- CAPTCHA wird nur angezeigt wenn Keys existieren
- Template-Anpassungen:
- login.html zeigt CAPTCHA nur wenn
recaptcha_site_keyvorhanden - Kein Test-Key mehr als Fallback
- login.html zeigt CAPTCHA nur wenn
- 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 wennRECAPTCHA_SITE_KEYexistiertv2_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:
-
Docker Container Zeitzone konfiguriert:
- Alle Dockerfiles mit
TZ=Europe/Berlinund tzdata Installation - PostgreSQL mit
PGTZ=Europe/Berlinfür Datenbank-Zeitzone - Explizite Zeitzone-Dateien in /etc/localtime und /etc/timezone
- Alle Dockerfiles mit
-
Python Code angepasst:
- Import von
zoneinfo.ZoneInfofür Zeitzonenunterstützung - Alle
datetime.now()Aufrufe mitZoneInfo("Europe/Berlin") .replace(tzinfo=None)für Kompatibilität mit timezone-unaware Timestamps
- Import von
-
PostgreSQL Konfiguration:
SET timezone = 'Europe/Berlin';in init.sql- Umgebungsvariablen TZ und PGTZ in docker-compose.yaml
-
docker-compose.yaml erweitert:
TZ: Europe/Berlinfür alle Services
Geänderte Dateien:
v2_adminpanel/Dockerfile: Zeitzone und tzdata hinzugefügtv2_postgres/Dockerfile: Zeitzone und tzdata hinzugefügtv2_nginx/Dockerfile: Zeitzone und tzdata hinzugefügtv2_lizenzserver/Dockerfile: Zeitzone und tzdata hinzugefügtv2_adminpanel/app.py: 14 datetime.now() Aufrufe mit Zeitzone versehenv2_adminpanel/init.sql: PostgreSQL Zeitzone gesetztv2/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:
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:
-
Datenbankschema angepasst:
- Alle
TIMESTAMPSpalten aufTIMESTAMP WITH TIME ZONEgeändert - Betrifft: created_at, timestamp, started_at, ended_at, last_heartbeat, etc.
- Migration für bestehende Datenbanken berücksichtigt
- Alle
-
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:
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:
-
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
-
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 gemachtv2_adminpanel/templates/dashboard.html: Navigation reduziert, Karten klickbarv2_adminpanel/templates/*.html: Konsistente Dashboard-Links
2025-06-08: UI/UX Überarbeitung - Phase 2 (Visuelle Verbesserungen)
Implementierte Verbesserungen:
-
Größere Icons in Statistik-Karten:
- Icon-Größe auf 3rem erhöht
- Bessere visuelle Hierarchie
-
Donut-Chart für Lizenzen:
- Chart.js Integration für Lizenzstatistik
- Zeigt Verhältnis Aktiv/Abgelaufen
- UPDATE: Später wieder entfernt auf Benutzerwunsch
-
Pulse-Effekt für aktive Sessions:
- CSS-Animation für aktive Sessions
- Visueller Indikator für Live-Aktivität
-
Progress-Bar für Backup-Status:
- Zeigt visuell den Erfolg des letzten Backups
- Inkl. Dateigröße und Dauer
-
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 Statusklassenv2_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:
-
Sticky Headers:
- Tabellenköpfe bleiben beim Scrollen sichtbar
- CSS-Klasse
.table-stickymitposition: sticky
-
Inline-Actions:
- Copy-Button direkt neben Lizenzschlüsseln
- Toggle-Switches für Aktiv/Inaktiv-Status
- Visuelles Feedback bei Aktionen
-
Bulk-Actions:
- Checkboxen für Mehrfachauswahl
- "Select All" Funktionalität
- Bulk-Actions Bar mit Aktivieren/Deaktivieren/Löschen
- JavaScript für dynamische Anzeige
-
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
-
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-Actionsv2_adminpanel/templates/licenses.html: Komplette Tabellen-Überarbeitungv2_adminpanel/app.py: 4 neue API-Endpoints für Toggle und Bulk-Operationenv2_adminpanel/sample_data.sql: Umfangreiche Testdaten erstellt
Bugfix:
- API-Endpoints versuchten
updated_atzu 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:
-
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
-
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:
-
Client-seitige Sortierung:
- Generische JavaScript-Funktion in base.html
- CSS-Klasse
.sortable-tablefür betroffene Tabellen - Sortier-Indikatoren (↑↓↕) bei Hover/Active
- Unterstützung für Text, Zahlen und deutsche Datumsformate
-
Server-seitige Sortierung:
- Query-Parameter
sortundorderin Routes - Whitelist für erlaubte Sortierfelder (SQL-Injection-Schutz)
- Makro-Funktionen für sortierbare Header
- Sortier-Parameter in Pagination-Links erhalten
- Query-Parameter
Geänderte Dateien:
v2_adminpanel/templates/base.html: CSS und JavaScript für Sortierungv2_adminpanel/templates/dashboard.html: Client-seitige Sortierungv2_adminpanel/templates/blocked_ips.html: Client-seitige Sortierungv2_adminpanel/templates/backups.html: Client-seitige Sortierungv2_adminpanel/templates/licenses.html: Server-seitige Sortierungv2_adminpanel/templates/customers.html: Server-seitige Sortierungv2_adminpanel/templates/audit_log.html: Server-seitige Sortierungv2_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:
- Falsche Bedingungslogik: Die ursprüngliche Implementierung verwendete eine fehlerhafte Ternär-Bedingung
- Berechnete Felder: Das 'status' Feld in der Lizenztabelle konnte nicht direkt sortiert werden
Lösung:
-
Sortierlogik korrigiert:
- Bei neuer Spalte: Immer aufsteigend (ASC) beginnen
- Bei gleicher Spalte: Toggle zwischen ASC und DESC
- Implementiert durch bedingte Links in den Makros
-
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 korrigiertv2_adminpanel/templates/customers.html: Sortierlogik korrigiertv2_adminpanel/templates/audit_log.html: Sortierlogik korrigiertv2_adminpanel/templates/sessions.html: Sortierlogik für beide Tabellen korrigiertv2_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:
-
Lizenzübersicht (licenses.html):
- Suchfeld mit Debouncing
- Typ-Dropdown (Vollversion/Testversion)
- Status-Dropdown (Aktiv/Ablaufend/Abgelaufen/Deaktiviert)
-
Kundenübersicht (customers.html):
- Suchfeld mit Debouncing
- "Suchen" Button entfernt
-
Audit-Log (audit_log.html):
- Benutzer-Textfeld mit Debouncing
- Aktion-Dropdown
- Entität-Dropdown
Technische Details:
addEventListener('input')für TextfelderaddEventListener('change')für Select-ElementesetTimeout()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):
-
Neue Tabellen erstellt:
resource_pools- Haupttabelle für alle Ressourcenresource_history- Vollständige Historie aller Aktionenresource_metrics- Performance-Tracking und ROI-Berechnunglicense_resources- Zuordnung zwischen Lizenzen und Ressourcen
-
Erweiterte licenses Tabelle:
domain_count,ipv4_count,phone_countSpalten hinzugefügt- Constraints: 0-10 pro Resource-Typ
-
Indizes für Performance:
- Status, Type, Allocated License, Quarantine Date
Phase 2 - Backend-Implementierung (✅ Abgeschlossen):
-
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
-
API-Endpunkte:
/api/resources/allocate- Ressourcen-Zuweisung/api/resources/check-availability- Verfügbarkeit prüfen
-
Integration in Lizenzerstellung:
create_license()erweitert um Resource-Allocationbatch_licenses()mit Ressourcen-Prüfung für gesamten Batch- Transaktionale Sicherheit bei Zuweisung
-
Dashboard-Integration:
- Resource-Statistiken in Dashboard eingebaut
- Warning-Level basierend auf Verfügbarkeit
-
Navigation erweitert:
- Resources-Link in Navbar hinzugefügt
Was noch zu tun ist:
Phase 3 - UI-Komponenten (🔄 Ausstehend):
-
Templates erstellen:
resources.html- Hauptübersicht mit Drag&Dropadd_resources.html- Formular für Bulk-Importresource_history.html- Historie-Anzeigeresource_metrics.html- Performance Dashboard
-
Formulare erweitern:
index.html- Resource-Dropdowns hinzufügenbatch_form.html- Resource-Dropdowns hinzufügen
-
Dashboard-Widget:
- Resource Pool Statistik mit Ampelsystem
- Warnung bei niedrigem Bestand
Phase 4 - Erweiterte Features (🔄 Ausstehend):
-
Quarantäne-Workflow:
- Gründe: abuse, defect, maintenance, blacklisted, expired
- Automatische Tests vor Freigabe
- Genehmigungsprozess
-
Performance-Metrics:
- Täglicher Cronjob für Metriken
- ROI-Berechnung
- Issue-Tracking
-
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):
-
Test-Daten generieren:
- 500 Test-Domains
- 200 Test-IPs
- 100 Test-Telefonnummern
-
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):
-
Neue Templates erstellt:
resources.html- Hauptübersicht mit Statistiken, Filter, Live-Suche, Paginationadd_resources.html- Bulk-Import Formular mit Validierungresource_history.html- Timeline-Ansicht der Historie mit Detailsresource_metrics.html- Performance Dashboard mit Chartsresource_report.html- Report-Generator UI
-
Erweiterte Formulare:
index.html- Resource-Count Dropdowns (0-10) mit Live-Verfügbarkeitsprüfungbatch_form.html- Resource-Count mit Batch-Berechnung (zeigt Gesamtbedarf)
-
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
-
Backend-Anpassungen:
resource_historyRoute korrigiert für Object-Style Template-Zugriffresources_metricsRoute vollständig implementiert mit Charts-Datenresources_reportRoute erweitert für Template-Anzeige und Downloads- Dashboard erweitert um Resource-Statistiken
Phase 4 - Erweiterte Features (✅ Teilweise):
- 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):
-
Test-Daten generieren:
- Script für 500 Test-Domains
- 200 Test-IPv4-Adressen
- 100 Test-Telefonnummern
- Realistische Verteilung über Status
-
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:
- Drag&Drop für Resource-Verwaltung (Nice-to-have)
- Automatische Quarantäne-Aufhebung nach Zeitablauf
- E-Mail-Benachrichtigungen bei niedrigem Bestand
- API für externe Resource-Prüfung
- Bulk-Delete für Ressourcen
- 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:
-
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)
-
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:
- 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_poolsTabelle 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:
- Separates Script erstellt und manuell in der Datenbank ausgeführt
- 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_typewurde verwendet bevor es definiert war
Ursache:
- Fehlerhafte Einrückung in der
resources_report()Funktion elifundelseBlö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)
- Test-Daten Script (
- 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.sqlerstellt - 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:
-
JavaScript angepasst:
- Von jQuery Modal-API zu nativer Bootstrap 5 Modal-API gewechselt
new bootstrap.Modal(element).show()statt$(element).modal('show')
-
HTML-Struktur aktualisiert:
- Modal-Close-Button:
data-bs-dismiss="modal"stattdata-dismiss="modal" btn-closeKlasse statt custom close button- Form-Klassen:
mb-3stattform-group,form-selectstattform-controlfür Select
- Modal-Close-Button:
-
Script-Reihenfolge korrigiert:
- jQuery vor Bootstrap laden für korrekte Initialisierung
Geänderte Dateien:
v2_adminpanel/templates/resources.htmlv2_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:
-
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
-
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
-
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
-
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.htmlv2_adminpanel/templates/add_resources.htmlv2_adminpanel/templates/resource_history.htmlv2_adminpanel/templates/resource_metrics.html
Status: ✅ Abgeschlossen
2025-06-09: Zusammenfassung der heutigen Arbeiten
Durchgeführte Aufgaben:
-
Quarantäne-Funktion repariert:
- Bootstrap 5 Modal-API implementiert
- data-bs-dismiss statt data-dismiss
- jQuery vor Bootstrap laden
-
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
v2_adminpanel/templates/base.html- Navigation entferntv2_adminpanel/app.py- Resource Report Einrückung korrigiertJOURNAL.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
datetimeundtimedeltaObjekte im Template-Kontext - Falsche Array-Indizes in resources.html für activity-Daten
Lösung:
-
app.py (Zeile 2797-2798):
datetime=datetimeundtimedelta=timedeltazu render_template hinzugefügt
-
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
- Array-Indizes korrigiert:
Geänderte Dateien:
v2_adminpanel/app.pyv2_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:
-
Datenbank-Erweiterung:
- Neue
usersTabelle mit Passwort-Hash und 2FA-Feldern - Unterstützung für TOTP-Secrets und Backup-Codes
- Migration von Environment-Variablen zu Datenbank
- Neue
-
Passwort-Management:
- Sichere Passwort-Hashes mit bcrypt
- Passwort-Änderung mit Verifikation des alten Passworts
- Passwort-Stärke-Indikator im Frontend
-
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
-
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
-
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-Hashingpyotp- TOTP-Generierung und Verifizierungqrcode[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ügtv2_adminpanel/requirements.txt- Neue Dependenciesv2_adminpanel/app.py- Auth-Funktionen und neue Routenv2_adminpanel/templates/base.html- Profil-Link hinzugefügtv2_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:
-
Ü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
-
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
-
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
usersTabelle - UI-Design der neuen 2FA-Seiten passte nicht zum Rest der Anwendung
Lösung:
-
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
-
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:8443aufhttp://license-server:8443geändert proxy_ssl_verify offentfernt (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:
docker-compose down
docker-compose up -d
v2_adminpanel/templates/profile.html- Komplett überarbeitetv2_adminpanel/templates/setup_2fa.html- Neues Step-by-Step Designv2_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 Formatvalidate_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:
-
Backend-Implementierung:
- Neue Route
/customers-licensesfür kombinierte Ansicht - API-Endpoints für AJAX:
/api/customer/<id>/licenses,/api/customer/<id>/quick-stats - API-Endpoint
/api/license/<id>/quick-editfür Inline-Bearbeitung - Optimierte SQL-Queries mit JOIN für Performance
- Neue Route
-
Template-Erstellung:
- Neues Template
customers_licenses.htmlmit 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)
- Neues Template
-
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-Endpointsv2_adminpanel/templates/customers_licenses.html- Neues Templatev2_adminpanel/templates/dashboard.html- Neuer Buttonv2_adminpanel/templates/customers.html- Link zur kombinierten Ansichtv2_adminpanel/templates/licenses.html- Link zur kombinierten Ansichtv2_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:
-
Datenbank-Schema (init.sql):
- Neue Spalte
is_test BOOLEAN DEFAULT FALSEzurlicensesTabelle hinzugefügt - Migration für bestehende Daten: Alle werden als
is_test = TRUEmarkiert - Index
idx_licenses_is_testfür bessere Performance
- Neue Spalte
-
Backend (app.py):
- Dashboard-Queries filtern Testdaten mit
WHERE is_test = FALSEaus - 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"
- Dashboard-Queries filtern Testdaten mit
-
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
-
Audit-Log Integration:
is_testFeld 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 = TRUEignorieren - Resource Pool bleibt unverändert (kann Test- und Live-Ressourcen verwalten)
Migration der bestehenden Daten:
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:
-
Datenbank-Schema erweitert:
customers.is_test BOOLEAN DEFAULT FALSEhinzugefügtresource_pools.is_test BOOLEAN DEFAULT FALSEhinzugefügt- Indizes für bessere Performance erstellt
- Migrations in init.sql integriert
-
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
-
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)
-
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:
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-licenseshatte 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:
-
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
- Bootstrap Icons CSS hinzugefügt:
-
customers_licenses.html komplett überarbeitet:
- Container-Klasse von
container-fluidaufcontainer py-5geä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_testwird überall beibehalten
- Container-Klasse von
-
Backend-Anpassungen (app.py):
- customers_licenses Route: Optional Testkunden anzeigen mit
show_testParameter - Redirects von
/customersund/licensesauf/customers-licensesimplementiert - 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
- customers_licenses Route: Optional Testkunden anzeigen mit
-
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-licensesverlor 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=truein der URL ist - Wenn ja, wird dieser Parameter automatisch an alle internen Links angehängt
- Backend-Route
/createwurde angepasst, um den Parameter bei Redirects beizubehalten
Technische Details:
-
base.html - JavaScript-Funktion hinzugefügt:
- Läuft beim
DOMContentLoadedEvent - Findet alle Links die mit "/" beginnen
- Fügt
show_test=trueParameter hinzu wenn nicht bereits vorhanden - Überspringt Fragment-Links (#) und Links die bereits den Parameter haben
- Läuft beim
-
app.py - Route-Anpassung:
/createRoute behält jetztshow_testParameter 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.htmlv2_adminpanel/app.py
Status: ✅ Vollständig implementiert
2025-06-09: Bearbeiten-Button Fehler behoben
Problem:
- Der "Bearbeiten" Button neben dem Kundennamen in der
/customers-licensesAnsicht verursachte einen Internal Server Error - Die URL-Konstruktion war fehlerhaft wenn kein
show_testParameter vorhanden war - Die edit_customer.html Template hatte falsche Array-Indizes und veraltete Links
Ursache:
-
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-licenseskomplett
- Alt:
-
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 undcustomer[4]= is_test
- Query:
-
Veraltete Links zu
/customersstatt/customers-licenses
Lösung:
-
URL-Konstruktion korrigiert in beiden Fällen:
- Neu:
/customer/edit/ID?ref=customers-licenses{% if show_test %}&show_test=true{% endif %}
- Neu:
-
SQL-Query erweitert um created_at:
- Neu:
SELECT id, name, email, created_at, is_test
- Neu:
-
Template-Indizes korrigiert:
- is_test Checkbox nutzt jetzt
customer[4]
- is_test Checkbox nutzt jetzt
-
Navigation-Links aktualisiert:
- Alle Links zeigen jetzt auf
/customers-licensesmit show_test Parameter
- Alle Links zeigen jetzt auf
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
/licensesstatt/customers-licenses - Der show_test Parameter wurde nur über den unsicheren Referrer übertragen
Lösung:
-
Navigation-Links korrigiert:
- Alle Links zeigen jetzt auf
/customers-licensesmit show_test Parameter - Betrifft: "Zurück zur Übersicht" und "Abbrechen" Buttons
- Alle Links zeigen jetzt auf
-
Hidden Form Field hinzugefügt:
- Sowohl in edit_license.html als auch edit_customer.html
- Überträgt den show_test Parameter sicher beim POST
-
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.htmlv2_adminpanel/templates/edit_customer.htmlv2_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 DESCwar 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-licensesRoute - Zeile 2319:
/api/customer/<int:customer_id>/licensesAPI-Route
- Zeile 2278:
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:
-
Phase 1: Ressourcen-Details in Kunden & Lizenzen Ansicht
- API
/api/customer/{id}/licenseserweitert um konkrete Ressourcen-Informationen - Neue API
/api/license/{id}/resourcesfür detaillierte Ressourcen einer Lizenz - Anzeige der zugewiesenen Ressourcen mit Info-Buttons und Modal-Dialogen
- Klickbare Links zu Ressourcen-Details im Resource Pool
- API
-
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
-
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
-
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
-
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
currentLicensesfür Caching der Lizenzdaten
Geänderte Dateien:
v2_adminpanel/app.py- Neue APIs und erweiterte Queriesv2_adminpanel/templates/customers_licenses.html- Ressourcen-Details und Modalsv2_adminpanel/templates/index.html- Erweiterte Verfügbarkeitsanzeigev2_adminpanel/templates/dashboard.html- Verbesserte Resource Pool Integrationv2_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-IPundX-Forwarded-Forwurden ignoriert
Lösung:
- ProxyFix Middleware hinzugefügt für korrekte Header-Verarbeitung
- get_client_ip() Funktion angepasst:
- Prüft zuerst
X-Real-IPHeader - Dann
X-Forwarded-ForHeader (nimmt erste IP bei mehreren) - Fallback auf
request.remote_addr
- Prüft zuerst
- Debug-Logging für IP-Erfassung hinzugefügt
- Alle
request.remote_addrAufrufe durchget_client_ip()ersetzt
Technische Details:
# 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 VALUEwurde in Dockerfiles verwendet
Lösung:
- Alle ENV-Anweisungen auf neues Format
ENV KEY=VALUEumgestellt - Betraf hauptsächlich v2_postgres/Dockerfile mit 3 ENV-Zeilen
Geänderte Dateien:
v2_postgres/Dockerfile- ENV-Format modernisiert
Beispiel der Änderung:
# 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