Files
v2-Docker/JOURNAL.md
Claude Project Manager 0d7d888502 Initial commit
2025-07-05 17:51:16 +02:00

120 KiB

v2-Docker Projekt Journal

Letzte Änderungen (22.06.2025 - 18:30 Uhr)

Export-Funktionen komplett repariert

Probleme gefunden und behoben:

  1. Parameter-Mismatch: Templates übergaben include_test, Routes erwarteten show_fake
  2. Bootstrap Dropdowns funktionierten nicht: JavaScript-Konflikt verhinderte Dropdown-Öffnung
  3. Excel Timezone-Fehler: "Excel does not support datetimes with timezones"

Implementierte Lösungen:

  1. Nur echte Daten beim Export:

    • Alle Export-Queries filtern jetzt mit WHERE is_fake = false
    • Keine Test/Fake-Daten mehr in Exporten
  2. Dropdown durch direkte Buttons ersetzt:

    • Statt problematischer Dropdowns: Einzelne Export-Buttons
    • Funktioniert ohne JavaScript, zuverlässiger
    • Übersichtlicher: alle Optionen sofort sichtbar
  3. Datetime-Formatierung für Excel-Kompatibilität:

    • format_datetime_for_export() entfernt Zeitzonen-Info
    • Alle Datetime-Felder werden vor Export formatiert
    • Einheitliches Format: YYYY-MM-DD HH:MM:SS

Geänderte Dateien:

  • templates/customers_licenses.html - Export-Buttons statt Dropdown
  • templates/audit_log.html - Export-Buttons statt Dropdown
  • templates/sessions.html - Export-Buttons statt Dropdown
  • routes/export_routes.py - Datetime-Formatierung für alle Exports
  • utils/export.py - Timezone-Entfernung in format_datetime_for_export()

Status: Alle Export-Funktionen (Excel & CSV) funktionieren einwandfrei!


Letzte Änderungen (22.06.2025 - 16:49 Uhr)

Export-Funktionen Analyse und Lösungsplan

Problem:

  • CSV Export Buttons vorhanden, aber Backend liefert immer Excel-Dateien
  • Monitoring Export zeigt nur Platzhalter-Alerts ("Export-Funktion wird implementiert")
  • Leads/CRM Module hat keine Export-Funktionalität
  • Format-Parameter wird in Export-Routes ignoriert

Analyse-Ergebnisse:

  1. Excel-Exporte funktionieren für: Lizenzen, Kunden, Sessions, Audit Logs, Ressourcen
  2. Export-Routes in export_routes.py prüfen nie den format=csv Parameter
  3. Nur create_excel_export() existiert, keine CSV-Generierung implementiert
  4. Monitoring-Exporte haben nur JavaScript-Platzhalter ohne Backend
  5. Lead Management hat keine Export-Funktionalität

Lösungsplan (YAGNI & Strukturiert):

  1. CSV Export Fix (Priorität 1)

    • Format-Parameter in bestehenden Export-Routes prüfen
    • CSV als Alternative zu Excel hinzufügen (Excel bleibt Default)
    • Python's eingebautes csv-Modul nutzen, keine neuen Dependencies
    • Minimale Änderung: ~10 Zeilen pro Route
  2. Monitoring Export (Priorität 2)

    • Neue Route /export/monitoring nach bestehendem Muster
    • Daten von existierenden Monitoring-Endpoints nutzen
    • Excel und CSV Format unterstützen
  3. Lead Export (Priorität 3)

    • Route /leads/export zum Lead Blueprint hinzufügen
    • Institutionen mit Kontakt-Anzahl exportieren
    • Gleiches Muster wie andere Exporte verwenden

Vorteile dieser Lösung:

  • Keine Refaktorierung nötig
  • Bestehende Excel-Exporte bleiben unverändert
  • Konsistentes URL-Muster mit format-Parameter
  • Rückwärtskompatibel (Excel als Standard)
  • Einfach erweiterbar für zukünftige Formate

Implementierung abgeschlossen:

  1. CSV Export Support hinzugefügt:

    • Neue Funktion create_csv_export() in utils/export.py
    • Alle Export-Routes prüfen jetzt den format Parameter
    • CSV-Dateien mit UTF-8 BOM für Excel-Kompatibilität
  2. Monitoring Export implementiert:

    • Neue Route /export/monitoring in export_routes.py
    • Exportiert Heartbeats und optional Anomalien
    • JavaScript-Funktionen in Templates aktualisiert
  3. Lead Export hinzugefügt:

    • Neue Route /leads/export in leads/routes.py
    • Exportiert Institutionen mit Kontakt-Statistiken
    • Export-Buttons zu Institutions-Template hinzugefügt

Geänderte Dateien:

  • utils/export.py - CSV-Export-Funktion hinzugefügt
  • routes/export_routes.py - Format-Parameter-Prüfung für alle Routes
  • routes/export_routes.py - Monitoring-Export hinzugefügt
  • leads/routes.py - Lead-Export-Route hinzugefügt
  • templates/monitoring/analytics.html - Export-Funktionen aktualisiert
  • templates/monitoring/live_dashboard.html - Export-Funktionen aktualisiert
  • leads/templates/leads/institutions.html - Export-Buttons hinzugefügt

Testing abgeschlossen:

  • Alle Export-Routes sind verfügbar und funktionieren
  • CSV-Export generiert korrekte CSV-Dateien mit UTF-8 BOM
  • Excel bleibt der Standard wenn kein format-Parameter angegeben
  • Container wurde neu gebaut und deployed
  • Alle 7 Export-Endpoints unterstützen beide Formate:
    • /export/licenses
    • /export/customers
    • /export/sessions
    • /export/audit
    • /export/resources
    • /export/monitoring
    • /leads/export

Letzte Änderungen (22.06.2025 - 16:35 Uhr)

Lizenzfilter System komplett überarbeitet

Problem:

  • Checkbox-basiertes Filtersystem war unübersichtlich und fummelig
  • "Fake-Daten anzeigen" Checkbox funktionierte nicht richtig
  • "Läuft bald ab" Status machte keinen Sinn (inaktive Lizenzen können nicht ablaufen)

Lösung 1 - Neues Dropdown-System:

  • Checkbox-Filter ersetzt durch 3 klare Dropdowns:
    • Datenquelle: Echte Lizenzen / 🧪 Fake-Daten / Alle Daten
    • Lizenztyp: Alle Typen / Vollversion / Testversion
    • Status: Alle Status / Aktiv / ⚠️ Abgelaufen / Deaktiviert
  • Auto-Submit bei Änderung
  • Übersichtlicher "Filter zurücksetzen" Button

Lösung 2 - API Bug Fix:

  • SQLAlchemy Fehler behoben: text() Wrapper für Raw SQL Queries hinzugefügt
  • License Server API funktioniert jetzt korrekt

Lösung 3 - Status-Logik korrigiert:

  • "Läuft bald ab" komplett entfernt (gehört nur ins Dashboard als Hinweis)
  • Klare Trennung der 3 Status:
    • Aktiv = is_active=true (egal ob abgelaufen)
    • Abgelaufen = valid_until <= heute (läuft aber weiter bis manuell deaktiviert)
    • Deaktiviert = is_active=false (manuell gestoppt)
  • Lizenzen laufen nach Ablauf weiter bis zur manuellen Deaktivierung

Geänderte Dateien:

  • templates/licenses.html - Komplettes Filter-UI überarbeitet
  • routes/license_routes.py - Filter-Logik angepasst
  • v2_lizenzserver/app/core/api_key_auth.py - SQL Bug behoben

Letzte Änderungen (22.06.2025 - 13:27 Uhr)

Bug Fix: API Key Anzeige in Administration

Problem:

  • "Kein System API Key gefunden!" wurde angezeigt obwohl Key existierte
  • Query versuchte noch die gelöschte api_key Spalte aus client_configs zu lesen

Lösung:

  • SELECT Statement in admin_routes.py korrigiert (api_key entfernt)
  • Template Indizes angepasst (current_version: [5]→[4], minimum_version: [6]→[5])
  • Admin Panel neu gestartet

Status: API Key wird jetzt korrekt angezeigt


Letzte Änderungen (22.06.2025 - 13:07 Uhr)

Doppeltes API Key System entfernt

Problem:

  • Zwei verschiedene API Keys wurden angezeigt:
    • system_api_key Tabelle: Globaler System API Key
    • client_configs Tabelle: Account Forger spezifischer API Key
  • Verwirrung welcher Key verwendet werden soll

Lösung:

  • Da Admin Panel exklusiv für Account Forger ist, nur noch ein API Key System
  • api_key Spalte aus client_configs entfernt
  • UI zeigt nur noch den System API Key als "API Key für Account Forger"
  • License Server validiert bereits gegen system_api_key

Geänderte Dateien:

  • templates/license_config.html - Entfernt doppelte API Key Anzeige
  • migrations/remove_duplicate_api_key.sql - Migration erstellt
  • Datenbank aktualisiert

Orphaned API Tabellen entfernt

Entfernte Tabellen:

  • api_keys - Ungenutzte API Key Tabelle (war leer)
  • api_clients - Alternative API Client Verwaltung (war leer)
  • rate_limits - Abhängige Tabelle (war leer)
  • license_events - Abhängige Tabelle (war leer)

Resultat:

  • Nur noch system_api_key Tabelle existiert
  • Keine verwirrenden Duplikate mehr
  • Saubere, eindeutige API Key Verwaltung

Letzte Änderungen (22.06.2025 - 12:18 Uhr)

Lizenzserver Session Management - Vollständig implementiert

Implementierte Features:

  1. Single-Session Enforcement:

    • Nur eine aktive Sitzung pro Lizenz erlaubt
    • Deutsche Fehlermeldung bei Mehrfach-Login-Versuch
    • Session-Token basiertes System mit UUID
  2. Heartbeat System:

    • 30-Sekunden Heartbeat-Intervall
    • Automatische Session-Bereinigung nach 60 Sekunden Inaktivität
    • Background Job für Session-Cleanup
  3. Session Management Endpoints:

    • POST /api/license/session/start - Session initialisierung
    • POST /api/license/session/heartbeat - Keep-alive
    • POST /api/license/session/end - Sauberes Session-Ende
    • Vollständige Session-Historie in session_history Tabelle
  4. Admin Panel Integration:

    • Lizenzserver Administration mit API-Key Management
    • Live Session Monitor mit Auto-Refresh
    • Session-Terminierung durch Admins
    • Version Management (Current/Minimum)
  5. Datenbank-Schema:

    • client_configs - Zentrale Konfiguration
    • license_sessions - Aktive Sessions (UNIQUE per license_id)
    • session_history - Audit Trail mit end_reason
    • system_api_key - Globaler API Key

Status: Vollständig implementiert und produktionsbereit

Dokumentation vollständig aktualisiert

Aktualisierte Dateien:

  1. OPERATIONS_GUIDE.md:

    • Korrekte Container-Namen (v2_*)
    • Aktuelle Service-Konfigurationen
    • Neue Features dokumentiert (Leads, Resources, Monitoring)
    • Health-Check Befehle aktualisiert
  2. CLAUDE.md:

    • Vollständige Projektstruktur mit allen Modulen
    • Alle Datenbank-Tabellen dokumentiert
    • Session Management Patterns
    • Erweiterte Common Issues Liste
  3. TODO_LIZENZSERVER_CONFIG.md:

    • Als abgeschlossen markiert
    • Kann archiviert/gelöscht werden

Alle Dokumentationen aktualisiert:

  • SYSTEM_DOCUMENTATION.md Vollständig aktualisiert
  • API_REFERENCE.md Alle Endpoints dokumentiert
  • TODO_LIZENZSERVER_CONFIG.md Gelöscht (da abgeschlossen)

Dokumentation bereinigt und komprimiert

Reduzierte Dateigröße:

  • OPERATIONS_GUIDE.md: Von 501 auf 409 Zeilen (-18%)
  • CLAUDE.md: Von ~250 auf 142 Zeilen (-43%)
  • SYSTEM_DOCUMENTATION.md: Von ~350 auf 243 Zeilen (-31%)
  • API_REFERENCE.md: Von ~1057 auf 815 Zeilen (-23%)

Entfernt:

  • Redundante YAML-Konfigurationen (verweisen auf docker-compose.yaml)
  • Verbose Code-Beispiele (durch kompakte Referenzen ersetzt)
  • Zukünftige/nicht implementierte Features
  • Duplizierte Informationen zwischen Dateien
  • Übermäßig detaillierte JSON-Beispiele

Fokus auf:

  • Tatsächlich implementierte Features
  • Praktische Operational-Informationen
  • Kompakte API-Referenzen
  • Verweise auf Source-Dateien statt Duplikation

Letzte Änderungen (19.06.2025 - 20:30 Uhr)

Dokumentation aktualisiert und mit Realität abgeglichen

  • API_REFERENCE.md komplett überarbeitet:

    • Tatsächliche Lizenzserver-Endpunkte dokumentiert (nicht mehr v1)
    • Korrekte Ports und URLs eingetragen
    • Admin Panel API vollständig dokumentiert
    • Nicht implementierte Endpunkte entfernt
  • SYSTEM_DOCUMENTATION.md aktualisiert:

    • Microservices-Status korrigiert (nur License Server & Admin Panel aktiv)
    • Analytics, Admin API und Auth Service als "geplant" markiert
    • Implementierungsstatus auf aktuellen Stand gebracht
    • Lead Management als "vollständig implementiert" dokumentiert
  • OPERATIONS_GUIDE.md korrigiert:

    • Echte Docker-Container-Namen verwendet
    • Korrekte Ports und Netzwerk-Konfiguration
    • Aktuelle Monitoring-Stack-Services dokumentiert
    • Troubleshooting-Befehle an echte Container angepasst

Status:

Dokumentation spiegelt nun den tatsächlichen Projektzustand wider Keine falschen oder veralteten Informationen mehr Alle drei Haupt-Dokumentationen sind aktuell


Letzte Änderungen (19.06.2025 - 19:20 Uhr)

Bugfix: Kunden & Lizenzen API-Fehler behoben

  • Problem: 500 Fehler beim Klicken auf Kunden in der "Kunden & Lizenzen" Ansicht

  • Ursache: SQL-Abfrage versuchte auf nicht-existierende Tabellen und Spalten zuzugreifen:

    • license_heartbeats Tabelle existiert noch nicht (wird mit License Server implementiert)
    • anomaly_detections Tabelle existiert noch nicht
    • Zu komplexe Subqueries führten zu Datenbankfehlern
  • Lösung implementiert:

    • SQL-Abfrage in api_customer_licenses vereinfacht
    • Entfernt: Alle Referenzen zu noch nicht existierenden Tabellen
    • Platzhalter-Werte (0) für License Server Statistiken eingefügt
    • Bessere Fehlerbehandlung mit detaillierten Fehlermeldungen
  • Geänderte Dateien:

    • v2_adminpanel/routes/customer_routes.py - Vereinfachte SQL-Abfrage ohne Subqueries

Status:

Kunden & Lizenzen Ansicht funktioniert wieder einwandfrei API gibt korrekte Daten zurück Keine Abhängigkeit von noch nicht implementierten Tabellen


Letzte Änderungen (19.06.2025 - 15:07 Uhr)

Lead-Management System implementiert

  • Komplett neues CRM-Modul für potentielle Kunden:

    • Separates leads Modul ohne Navbar-Eintrag
    • Zugang über "Leads" Button auf Kunden & Lizenzen Seite
    • Vollständig getrennt vom bestehenden Kundensystem
  • Refactoring-freie Architektur von Anfang an:

    • Service Layer Pattern für Business Logic
    • Repository Pattern für Datenbankzugriffe
    • RESTful API Design
    • JSONB Felder für zukünftige Erweiterungen ohne Schema-Änderungen
    • Event-System vorbereitet für spätere Integrationen
  • Datenmodell (vereinfacht aber erweiterbar):

    • lead_institutions: Nur Name erforderlich
    • lead_contacts: Kontaktpersonen mit Institution
    • lead_contact_details: Flexible Telefon/E-Mail Verwaltung (beliebig viele)
    • lead_notes: Versionierte Notizen mit vollständiger Historie
  • Features:

    • Institutionen-Verwaltung mit Kontakt-Zähler
    • Kontaktpersonen mit Position (Freitext)
    • Mehrere Telefonnummern/E-Mails pro Person mit Labels
    • Notiz-Historie mit Zeitstempel und Benutzer-Tracking
    • Notizen können bearbeitet werden (neue Version wird erstellt)
    • Vollständige Audit-Trail Integration
  • Migration bereitgestellt:

    • SQL-Script: migrations/create_lead_tables.sql
    • Python-Script: apply_lead_migration.py
    • Anwendung: docker exec -it v2_adminpanel python apply_lead_migration.py

Status:

Lead-Management vollständig implementiert Refactoring-freie Architektur umgesetzt Keine Breaking Changes möglich durch Design Bereit für produktiven Einsatz


Letzte Änderungen (19.06.2025 - 13:15 Uhr)

License Heartbeats Tabelle und Dashboard-Konsolidierung

  • Fehlende license_heartbeats Tabelle erstellt:

    • Migration-Script für partitionierte Tabellenstruktur (monatliche Partitionen)
    • Automatische Partition-Erstellung für aktuellen und nächsten Monat
    • Performance-optimierte Indizes und Foreign Keys
    • Anwendbar via: docker exec -it v2_adminpanel python apply_license_heartbeats_migration.py
  • Live Dashboard & Analytics zusammengeführt:

    • Alle Analytics-Funktionen ins Live Dashboard integriert
    • 3-Tab-Struktur: Übersicht, Sessions, Analytics
    • Echtzeit-Monitoring + historische Daten an einem Ort
    • Export-Funktionen beibehalten
  • Navigation weiter optimiert:

    • "Analytics" aus Navigation entfernt (in Live Dashboard integriert)
    • Redundanten "Live Dashboard & Analytics" Menüpunkt entfernt
    • Monitoring führt direkt zum kombinierten Dashboard

Status:

License Heartbeats Infrastruktur implementiert Dashboard-Konsolidierung abgeschlossen Navigation maximal vereinfacht Alle Monitoring-Features an einem zentralen Ort


Letzte Änderungen (19.06.2025 - 12:46 Uhr)

Navigation komplett überarbeitet

  • 500 Fehler auf /live-dashboard behoben:

    • Datenbankabfrage korrigiert (falsche Spaltenreferenz c.contact_person entfernt)
    • Alle Referenzen nutzen jetzt korrekt c.name as company_name
  • Navigation aufgeräumt und reorganisiert:

    • "Admin Sessions" komplett entfernt (nicht benötigt)
    • "Alerts & Anomalien" entfernt (redundant zu "Lizenz-Anomalien")
    • "Lizenzserver Status" und "Analytics" zu einer Seite zusammengeführt
    • "Live Dashboard" aus Submenu entfernt (Monitoring führt direkt dorthin)
    • Neuer "Administration" Bereich erstellt (führt zu Lizenzserver Config)
  • Neue Navigationsstruktur:

    📊 Monitoring → (Live Dashboard)
      ├── System Status
      ├── Lizenz-Anomalien
      └── Analytics (kombiniert)
    
    🔧 Administration → (Lizenzserver Config)
      ├── Audit-Log
      ├── Backups
      └── Gesperrte IPs
    
  • Weitere Verbesserungen:

    • Grafana-Link aus System Status entfernt
    • Session-Route-Fehler behoben (admin.sessionssessions.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: activeis_active, device_idhardware_id
    • Sessions-Tabelle: Alle Zeit-Felder vereinheitlicht (login_timestarted_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.customerscustomers.customers_licenses)
  • Technische Details:

    • Alle Python-Abhängigkeiten funktionieren korrekt
    • Datenbank-Foreign Keys alle intakt
    • Blueprint-Registrierung erfolgreich
    • Keine zirkulären Imports mehr

Status:

Anwendung vollständig funktionsfähig Alle bekannten Bugs behoben Code-Qualität deutlich verbessert Wartbarkeit erhöht durch konsistente Namensgebung


Vorherige Änderungen (06.01.2025)

Gerätelimit-Feature implementiert

  • Datenbank-Schema erweitert:

    • Neue Spalte device_limit in licenses Tabelle (Standard: 3, Range: 1-10)
    • Neue Tabelle device_registrations für Hardware-ID Tracking
    • Indizes für Performance-Optimierung hinzugefügt
  • UI-Anpassungen:

    • Einzellizenz-Formular: Dropdown für Gerätelimit (1-10 Geräte)
    • Batch-Formular: Gerätelimit pro Lizenz auswählbar
    • Lizenz-Bearbeitung: Gerätelimit änderbar
    • Lizenz-Anzeige: Zeigt aktive Geräte (z.B. "💻 2/3")
  • Backend-Änderungen:

    • Lizenz-Erstellung speichert device_limit
    • Batch-Erstellung berücksichtigt device_limit
    • Lizenz-Update kann device_limit ändern
    • API-Endpoints liefern Geräteinformationen
  • Migration:

    • Device-Limit wird automatisch bei neuen Lizenzen gesetzt
    • Standard device_limit = 3 für alle Lizenzen

Vollständig implementiert:

Device Management UI (Geräte pro Lizenz anzeigen/verwalten) Device Validation Logic (Prüfung bei Geräte-Registrierung) API-Endpoints für Geräte-Registrierung/Deregistrierung

API-Endpoints:

  • GET /api/license/<id>/devices - Listet alle Geräte einer Lizenz
  • POST /api/license/<id>/register-device - Registriert ein neues Gerät
  • POST /api/license/<id>/deactivate-device/<device_id> - Deaktiviert ein Gerät

Features:

  • Geräte-Registrierung mit Hardware-ID Validierung
  • Automatische Prüfung des Gerätelimits
  • Reaktivierung deaktivierter Geräte möglich
  • Geräte-Verwaltung UI mit Modal-Dialog
  • Anzeige von Gerätename, OS, IP, Registrierungsdatum
  • Admin kann Geräte manuell deaktivieren

Projektübersicht

Lizenzmanagement-System für Social Media Account-Erstellungssoftware mit Docker-basierter Architektur.

Technische Anforderungen


Best Practices für Produktiv-Migration

Passwort-Management

Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werden:

  1. Environment Variables erstellen:

    # .env.example (ins Git Repository)
    POSTGRES_USER=changeme
    POSTGRES_PASSWORD=changeme
    POSTGRES_DB=changeme
    SECRET_KEY=generate-a-secure-key
    ADMIN_USER_1=changeme
    ADMIN_PASS_1=changeme
    ADMIN_USER_2=changeme
    ADMIN_PASS_2=changeme
    
    # .env (NICHT ins Git, auf Server erstellen)
    POSTGRES_USER=produktiv_user
    POSTGRES_PASSWORD=sicheres_passwort_min_20_zeichen
    POSTGRES_DB=v2docker_prod
    SECRET_KEY=generierter_64_zeichen_key
    # etc.
    
  2. Sichere Passwörter generieren:

    • Mindestens 20 Zeichen
    • Mix aus Groß-/Kleinbuchstaben, Zahlen, Sonderzeichen
    • Verschiedene Passwörter für Dev/Staging/Prod
    • Password-Generator verwenden (z.B. openssl rand -base64 32)
  3. Erweiterte Sicherheit (Optional):

    • HashiCorp Vault für zentrale Secret-Verwaltung
    • Docker Secrets (für Docker Swarm)
    • Cloud-Lösungen: AWS Secrets Manager, Azure Key Vault
  4. Wichtige Checkliste:

    • .env in .gitignore aufnehmen
    • Neue Credentials für Produktion generieren
    • Backup der Credentials an sicherem Ort
    • Regelmäßige Passwort-Rotation planen
    • Keine Default-Passwörter verwenden

Änderungsprotokoll

2025-01-06 - Journal erstellt

  • Initialer Projektstand dokumentiert
  • Aufgabenliste priorisiert
  • Technische Anforderungen festgehalten

2025-01-06 - UTF-8 Support implementiert

  • Flask App Konfiguration für UTF-8 hinzugefügt (JSON_AS_ASCII=False)
  • PostgreSQL Verbindung mit UTF-8 client_encoding
  • HTML Forms mit accept-charset="UTF-8"
  • Dockerfile mit deutschen Locale-Einstellungen (de_DE.UTF-8)
  • PostgreSQL Container mit UTF-8 Initialisierung
  • init.sql mit SET client_encoding = 'UTF8'

Geänderte Dateien:

  • v2_adminpanel/app.py
  • v2_adminpanel/templates/index.html
  • v2_adminpanel/init.sql
  • v2_adminpanel/Dockerfile
  • v2/docker-compose.yaml

Nächster Test:

  • Container neu bauen und starten
  • Kundennamen mit Umlauten testen (z.B. "Müller GmbH", "Björn Schäfer")
  • Email mit Umlauten testen

2025-01-06 - Lizenzübersicht implementiert

  • Neue Route /licenses für Lizenzübersicht
  • SQL-Query mit JOIN zwischen licenses und customers
  • Status-Berechnung (aktiv, läuft bald ab, abgelaufen)
  • Farbcodierung für verschiedene Status
  • Navigation zwischen Lizenz erstellen und Übersicht

Neue Features:

  • Anzeige aller Lizenzen mit Kundeninformationen
  • Status-Anzeige basierend auf Ablaufdatum
  • Unterscheidung zwischen Voll- und Testversion
  • Responsive Tabelle mit Bootstrap
  • Link von Dashboard zur Übersicht und zurück

Geänderte/Neue Dateien:

  • v2_adminpanel/app.py (neue Route hinzugefügt)
  • v2_adminpanel/templates/licenses.html (neu erstellt)
  • v2_adminpanel/templates/index.html (Navigation ergänzt)

Nächster Test:

  • Container neu starten
  • Mehrere Lizenzen mit verschiedenen Ablaufdaten erstellen
  • Lizenzübersicht unter /licenses aufrufen

2025-01-06 - Lizenz bearbeiten/löschen implementiert

  • Neue Routen für Bearbeiten und Löschen von Lizenzen
  • Bearbeitungsformular mit vorausgefüllten Werten
  • Aktiv/Inaktiv-Status kann geändert werden
  • Lösch-Bestätigung per JavaScript confirm()
  • Kunde kann nicht geändert werden (nur Lizenzdetails)

Neue Features:

  • /license/edit/<id> - Bearbeitungsformular
  • /license/delete/<id> - Lizenz löschen (POST)
  • Aktionen-Spalte in der Lizenzübersicht
  • Buttons für Bearbeiten und Löschen
  • Checkbox für Aktiv-Status

Geänderte/Neue Dateien:

  • v2_adminpanel/app.py (edit_license und delete_license Routen)
  • v2_adminpanel/templates/licenses.html (Aktionen-Spalte hinzugefügt)
  • v2_adminpanel/templates/edit_license.html (neu erstellt)

Sicherheit:

  • Login-Required für alle Aktionen
  • POST-only für Löschvorgänge
  • Bestätigungsdialog vor dem Löschen

2025-01-06 - Kundenverwaltung implementiert

  • Komplette CRUD-Funktionalität für Kunden
  • Übersicht zeigt Anzahl aktiver/gesamter Lizenzen pro Kunde
  • Kunden können nur gelöscht werden, wenn sie keine Lizenzen haben
  • Bearbeitungsseite zeigt alle Lizenzen des Kunden

Neue Features:

  • /customers - Kundenübersicht mit Statistiken
  • /customer/edit/<id> - Kunde bearbeiten (Name, E-Mail)
  • /customer/delete/<id> - Kunde löschen (nur ohne Lizenzen)
  • Navigation zwischen allen drei Hauptbereichen
  • Anzeige der Kundenlizenzen beim Bearbeiten

Geänderte/Neue Dateien:

  • v2_adminpanel/app.py (customers, edit_customer, delete_customer Routen)
  • v2_adminpanel/templates/customers.html (neu erstellt)
  • v2_adminpanel/templates/edit_customer.html (neu erstellt)
  • v2_adminpanel/templates/index.html (Navigation erweitert)
  • v2_adminpanel/templates/licenses.html (Navigation erweitert)

Besonderheiten:

  • Lösch-Button ist deaktiviert, wenn Kunde Lizenzen hat
  • Aktive Lizenzen werden separat gezählt (nicht abgelaufen + aktiv)
  • UTF-8 Support für Kundennamen mit Umlauten

2025-01-06 - Dashboard mit Statistiken implementiert

  • Übersichtliches Dashboard als neue Startseite
  • Statistik-Karten mit wichtigen Kennzahlen
  • Listen für bald ablaufende und zuletzt erstellte Lizenzen
  • Routing angepasst: Dashboard (/) und Lizenz erstellen (/create)

Neue Features:

  • Statistik-Karten: Kunden, Lizenzen gesamt, Aktive, Ablaufende
  • Aufteilung nach Lizenztypen (Vollversion/Testversion)
  • Aufteilung nach Status (Aktiv/Abgelaufen)
  • Top 10 bald ablaufende Lizenzen mit Restlaufzeit
  • Letzte 5 erstellte Lizenzen mit Status
  • Hover-Effekt auf Statistik-Karten
  • Einheitliche Navigation mit Dashboard-Link

Geänderte/Neue Dateien:

  • v2_adminpanel/app.py (dashboard() komplett überarbeitet, create_license() Route)
  • v2_adminpanel/templates/dashboard.html (neu erstellt)
  • v2_adminpanel/templates/index.html (Navigation erweitert)
  • v2_adminpanel/templates/licenses.html (Navigation angepasst)
  • v2_adminpanel/templates/customers.html (Navigation angepasst)

Dashboard-Inhalte:

  • 4 Hauptstatistiken als Karten
  • Lizenztyp-Verteilung
  • Status-Verteilung
  • Warnung für bald ablaufende Lizenzen
  • Übersicht der neuesten Aktivitäten

2025-01-06 - Suchfunktion implementiert

  • Volltextsuche für Lizenzen und Kunden
  • Case-insensitive Suche mit LIKE-Operator
  • Suchergebnisse mit Hervorhebung des Suchbegriffs
  • Suche zurücksetzen Button

Neue Features:

  • Lizenzsuche: Sucht in Lizenzschlüssel, Kundenname und E-Mail
  • Kundensuche: Sucht in Kundenname und E-Mail
  • Suchformular mit autofocus für schnelle Eingabe
  • Anzeige des aktiven Suchbegriffs
  • Unterschiedliche Meldungen für leere Ergebnisse

Geänderte Dateien:

  • v2_adminpanel/app.py (licenses() und customers() mit Suchlogik erweitert)
  • v2_adminpanel/templates/licenses.html (Suchformular hinzugefügt)
  • v2_adminpanel/templates/customers.html (Suchformular hinzugefügt)

Technische Details:

  • GET-Parameter für Suche
  • SQL LIKE mit LOWER() für Case-Insensitive Suche
  • Wildcards (%) für Teilstring-Suche
  • UTF-8 kompatibel für deutsche Umlaute

2025-01-06 - Filter und Pagination implementiert

  • Erweiterte Filteroptionen für Lizenzübersicht
  • Pagination für große Datenmengen (20 Einträge pro Seite)
  • Filter bleiben bei Seitenwechsel erhalten

Neue Features für Lizenzen:

  • Filter nach Typ: Alle, Vollversion, Testversion
  • Filter nach Status: Alle, Aktiv, Läuft bald ab, Abgelaufen, Deaktiviert
  • Kombinierbar mit Suche: Filter und Suche funktionieren zusammen
  • Pagination: Navigation durch mehrere Seiten
  • Ergebnisanzeige: Zeigt Anzahl gefilterter Ergebnisse

Neue Features für Kunden:

  • Pagination: 20 Kunden pro Seite
  • Seitennavigation: Erste, Letzte, Vor, Zurück
  • Kombiniert mit Suche: Suchparameter bleiben erhalten

Geänderte Dateien:

  • v2_adminpanel/app.py (licenses() und customers() mit Filter/Pagination erweitert)
  • v2_adminpanel/templates/licenses.html (Filter-Formular und Pagination hinzugefügt)
  • v2_adminpanel/templates/customers.html (Pagination hinzugefügt)

Technische Details:

  • SQL WHERE-Klauseln für Filter
  • LIMIT/OFFSET für Pagination
  • URL-Parameter bleiben bei Navigation erhalten
  • Responsive Bootstrap-Komponenten

2025-01-06 - Session-Tracking implementiert

  • Neue Tabelle für Session-Verwaltung
  • Anzeige aktiver und beendeter Sessions
  • Manuelles Beenden von Sessions möglich
  • Dashboard zeigt Anzahl aktiver Sessions

Neue Features:

  • Sessions-Tabelle: Speichert Session-ID, IP, User-Agent, Zeitstempel
  • Aktive Sessions: Zeigt alle laufenden Sessions mit Inaktivitätszeit
  • Session-Historie: Letzte 24 Stunden beendeter Sessions
  • Session beenden: Admins können Sessions manuell beenden
  • Farbcodierung: Grün (aktiv), Gelb (>5 Min inaktiv), Rot (lange inaktiv)

Geänderte/Neue Dateien:

  • v2_adminpanel/init.sql (sessions Tabelle hinzugefügt)
  • v2_adminpanel/app.py (sessions() und end_session() Routen)
  • v2_adminpanel/templates/sessions.html (neu erstellt)
  • v2_adminpanel/templates/dashboard.html (Session-Statistik)
  • Alle Templates (Session-Navigation hinzugefügt)

Technische Details:

  • Heartbeat-basiertes Tracking (last_heartbeat)
  • Automatische Inaktivitätsberechnung
  • Session-Dauer Berechnung
  • Responsive Tabellen mit Bootstrap

Hinweis: Die Session-Daten werden erst gefüllt, wenn der License Server API implementiert ist und Clients sich verbinden.

2025-01-06 - Export-Funktion implementiert

  • CSV und Excel Export für Lizenzen und Kunden
  • Formatierte Ausgabe mit deutschen Datumsformaten
  • UTF-8 Unterstützung für Sonderzeichen

Neue Features:

  • Lizenz-Export: Alle Lizenzen mit Kundeninformationen
  • Kunden-Export: Alle Kunden mit Lizenzstatistiken
  • Format-Optionen: Excel (.xlsx) und CSV (.csv)
  • Deutsche Formatierung: Datum als dd.mm.yyyy, Status auf Deutsch
  • UTF-8 Export: Korrekte Kodierung für Umlaute
  • Export-Buttons: Dropdown-Menüs in Lizenz- und Kundenübersicht

Geänderte Dateien:

  • v2_adminpanel/app.py (export_licenses() und export_customers() Routen)
  • v2_adminpanel/requirements.txt (pandas und openpyxl hinzugefügt)
  • v2_adminpanel/templates/licenses.html (Export-Dropdown hinzugefügt)
  • v2_adminpanel/templates/customers.html (Export-Dropdown hinzugefügt)

Technische Details:

  • Pandas für Datenverarbeitung
  • OpenPyXL für Excel-Export
  • CSV mit Semikolon-Trennung für deutsche Excel-Kompatibilität
  • Automatische Spaltenbreite in Excel
  • BOM für UTF-8 CSV (Excel-Kompatibilität)

2025-01-06 - Audit-Log implementiert

  • Vollständiges Änderungsprotokoll für alle Aktionen
  • Filterbare Übersicht mit Pagination
  • Detaillierte Anzeige von Änderungen

Neue Features:

  • Audit-Log-Tabelle: Speichert alle Änderungen mit Zeitstempel, Benutzer, IP
  • Protokollierte Aktionen: CREATE, UPDATE, DELETE, LOGIN, LOGOUT, EXPORT
  • JSON-Speicherung: Alte und neue Werte als JSONB für flexible Abfragen
  • Filter-Optionen: Nach Benutzer, Aktion und Entität
  • Detail-Anzeige: Aufklappbare Änderungsdetails
  • Navigation: Audit-Link in allen Templates

Geänderte/Neue Dateien:

  • v2_adminpanel/init.sql (audit_log Tabelle mit Indizes)
  • v2_adminpanel/app.py (log_audit() Funktion und audit_log() Route)
  • v2_adminpanel/templates/audit_log.html (neu erstellt)
  • Alle Templates (Audit-Navigation hinzugefügt)

Technische Details:

  • JSONB für strukturierte Datenspeicherung
  • Performance-Indizes auf timestamp, username und entity
  • Farbcodierung für verschiedene Aktionen
  • 50 Einträge pro Seite mit Pagination
  • IP-Adresse und User-Agent Tracking

2025-01-06 - PostgreSQL UTF-8 Locale konfiguriert

  • Eigenes PostgreSQL Dockerfile für deutsche Locale
  • Sicherstellung der UTF-8 Unterstützung auf Datenbankebene

Neue Features:

  • PostgreSQL Dockerfile: Installiert deutsche Locale (de_DE.UTF-8)
  • Locale-Umgebungsvariablen: LANG, LANGUAGE, LC_ALL gesetzt
  • Docker Compose Update: Verwendet jetzt eigenes PostgreSQL-Image

Neue Dateien:

  • v2_postgres/Dockerfile (neu erstellt)

Geänderte Dateien:

  • v2/docker-compose.yaml (postgres Service nutzt jetzt build statt image)

Technische Details:

  • Basis-Image: postgres:14
  • Locale-Installation über apt-get
  • locale-gen für de_DE.UTF-8
  • Vollständige UTF-8 Unterstützung für deutsche Sonderzeichen

2025-01-07 - Backup-Funktionalität implementiert

  • Verschlüsselte Backups mit manueller und automatischer Ausführung
  • Backup-Historie mit Download und Wiederherstellung
  • Dashboard-Integration für Backup-Status

Neue Features:

  • Backup-Erstellung: Manuell und automatisch (täglich 3:00 Uhr)
  • Verschlüsselung: AES-256 mit Fernet, Key aus ENV oder automatisch generiert
  • Komprimierung: GZIP-Komprimierung vor Verschlüsselung
  • Backup-Historie: Vollständige Übersicht aller Backups
  • Wiederherstellung: Mit optionalem Verschlüsselungs-Passwort
  • Download-Funktion: Backups können heruntergeladen werden
  • Dashboard-Widget: Zeigt letztes Backup-Status
  • E-Mail-Vorbereitung: Struktur für Benachrichtigungen (deaktiviert)

Neue/Geänderte Dateien:

  • v2_adminpanel/init.sql (backup_history Tabelle hinzugefügt)
  • v2_adminpanel/requirements.txt (cryptography, apscheduler hinzugefügt)
  • v2_adminpanel/app.py (Backup-Funktionen und Routen)
  • v2_adminpanel/templates/backups.html (neu erstellt)
  • v2_adminpanel/templates/dashboard.html (Backup-Status-Widget)
  • v2_adminpanel/Dockerfile (PostgreSQL-Client installiert)
  • v2/.env (EMAIL_ENABLED und BACKUP_ENCRYPTION_KEY)
  • Alle Templates (Backup-Navigation hinzugefügt)

Technische Details:

  • Speicherort: C:\Users\Administrator\Documents\GitHub\v2-Docker\backups\
  • Dateiformat: backup_v2docker_YYYYMMDD_HHMMSS_encrypted.sql.gz.enc
  • APScheduler für automatische Backups
  • pg_dump/psql für Datenbank-Operationen
  • Audit-Log für alle Backup-Aktionen
  • Sicherheitsabfrage bei Wiederherstellung

2025-01-07 - HTTPS/SSL und Internet-Zugriff implementiert

  • Nginx Reverse Proxy für externe Erreichbarkeit eingerichtet
  • SSL-Zertifikate von IONOS mit vollständiger Certificate Chain integriert
  • Netzwerkkonfiguration für feste IP-Adresse
  • DynDNS und Port-Forwarding konfiguriert

Neue Features:

  • Nginx Reverse Proxy: Leitet HTTPS-Anfragen an Container weiter
  • SSL-Zertifikate: Wildcard-Zertifikat von IONOS für *.z5m7q9dk3ah2v1plx6ju.com
  • Certificate Chain: Server-, Intermediate- und Root-Zertifikate kombiniert
  • Subdomain-Routing: admin-panel-undso und api-software-undso
  • Port-Forwarding: FRITZ!Box 443 → 192.168.178.88
  • Feste IP: Windows-PC auf 192.168.178.88 konfiguriert

Neue/Geänderte Dateien:

  • v2_nginx/nginx.conf (Reverse Proxy Konfiguration)
  • v2_nginx/Dockerfile (Nginx Container mit SSL)
  • v2_nginx/ssl/fullchain.pem (Certificate Chain)
  • v2_nginx/ssl/privkey.pem (Private Key)
  • v2/docker-compose.yaml (nginx Service hinzugefügt)
  • set-static-ip.ps1 (PowerShell Script für feste IP)
  • reset-to-dhcp.ps1 (PowerShell Script für DHCP)

Technische Details:

  • SSL-Termination am Nginx Reverse Proxy
  • Backend-Kommunikation über Docker-internes Netzwerk
  • Admin-Panel nur noch über Nginx erreichbar (Port 443 nicht mehr exposed)
  • License-Server behält externen Port 8443 für direkte API-Zugriffe
  • Intermediate Certificates aus ZIP extrahiert und korrekt verkettet

Zugangsdaten:

Status:

  • Admin-Panel extern erreichbar ohne SSL-Warnungen
  • Reverse Proxy funktioniert
  • SSL-Zertifikate korrekt konfiguriert
  • Netzwerk-Setup abgeschlossen

2025-01-07 - Projekt-Cleanup durchgeführt

  • Redundante und überflüssige Dateien entfernt
  • Projektstruktur verbessert und organisiert

Durchgeführte Änderungen:

  1. Entfernte Dateien:

    • v2_adminpanel/templates/.env (Duplikat der Haupt-.env)
    • v2_postgreSQL/ (leeres Verzeichnis)
    • SSL-Zertifikate aus Root-Verzeichnis (7 Dateien)
    • Ungenutzer json Import aus app.py
  2. Organisatorische Verbesserungen:

    • PowerShell-Scripts in neuen scripts/ Ordner verschoben
    • SSL-Zertifikate nur noch in v2_nginx/ssl/
    • Keine Konfigurationsdateien mehr in Template-Verzeichnissen

Technische Details:

  • Docker-Container wurden gestoppt und nach Cleanup neu gestartet
  • Alle Services laufen wieder normal
  • Keine funktionalen Änderungen, nur Struktur-Verbesserungen

Ergebnis:

  • Verbesserte Projektstruktur
  • Erhöhte Sicherheit (keine SSL-Zertifikate im Root)
  • Klarere Dateiorganisation

2025-01-07 - SSL "Nicht sicher" Problem behoben

  • Chrome-Warnung trotz gültigem Zertifikat analysiert und behoben
  • Ursache: Selbstsigniertes Zertifikat in der Admin Panel Flask-App

Durchgeführte Änderungen:

  1. Admin Panel Konfiguration (app.py):

    • Von HTTPS mit selbstsigniertem Zertifikat auf HTTP Port 5000 umgestellt
    • ssl_context='adhoc' entfernt
    • Flask läuft jetzt auf 0.0.0.0:5000 statt HTTPS
  2. Dockerfile Anpassung (v2_adminpanel/Dockerfile):

    • EXPOSE Port von 443 auf 5000 geändert
    • Container exponiert jetzt HTTP statt HTTPS
  3. Nginx Konfiguration (nginx.conf):

    • proxy_pass von https://admin-panel:443 auf http://admin-panel:5000 geändert
    • proxy_ssl_verify off entfernt (nicht mehr benötigt)
    • Sicherheits-Header für beide Domains hinzugefügt:
      • Strict-Transport-Security (HSTS) - erzwingt HTTPS für 1 Jahr
      • X-Content-Type-Options - verhindert MIME-Type Sniffing
      • X-Frame-Options - Schutz vor Clickjacking
      • X-XSS-Protection - aktiviert XSS-Filter
      • Referrer-Policy - kontrolliert Referrer-Informationen

Technische Details:

  • Externer Traffic nutzt weiterhin HTTPS mit gültigen IONOS-Zertifikaten
  • Interne Kommunikation zwischen Nginx und Admin Panel läuft über HTTP (sicher im Docker-Netzwerk)
  • Kein selbstsigniertes Zertifikat mehr in der Zertifikatskette
  • SSL-Termination erfolgt ausschließlich am Nginx Reverse Proxy

Docker Neustart:

  • Container gestoppt (docker-compose down)
  • Images neu gebaut (docker-compose build)
  • Container neu gestartet (docker-compose up -d)
  • Alle Services laufen normal

Ergebnis:

  • "Nicht sicher" Warnung in Chrome behoben
  • Saubere SSL-Konfiguration ohne Mixed Content
  • Verbesserte Sicherheits-Header implementiert
  • Admin Panel zeigt jetzt grünes Schloss-Symbol

2025-01-07 - Sicherheitslücke geschlossen: License Server Port

  • Direkter Zugriff auf License Server Port 8443 entfernt
  • Sicherheitsanalyse der exponierten Ports durchgeführt

Identifiziertes Problem:

  • License Server war direkt auf Port 8443 von außen erreichbar
  • Umging damit die Nginx-Sicherheitsschicht und Security Headers
  • Besonders kritisch, da nur Platzhalter ohne echte Sicherheit

Durchgeführte Änderung:

  • Port-Mapping für License Server in docker-compose.yaml entfernt
  • Service ist jetzt nur noch über Nginx Reverse Proxy erreichbar
  • Gleiche Sicherheitskonfiguration wie Admin Panel

Aktuelle Port-Exposition:

  • Nginx: Port 80/443 (benötigt für externen Zugriff)
  • PostgreSQL: Keine Ports exponiert (gut)
  • Admin Panel: Nur über Nginx erreichbar
  • License Server: Nur über Nginx erreichbar (vorher direkt auf 8443)

Weitere identifizierte Sicherheitsthemen:

  1. Credentials im Klartext in .env Datei
  2. SSL-Zertifikate im Repository gespeichert
  3. License Server noch nicht implementiert

Empfehlung: Docker-Container neu starten für Änderungsübernahme

2025-01-07 - License Server Port 8443 wieder aktiviert

  • Port 8443 für direkten Zugriff auf License Server wieder geöffnet
  • Notwendig für Client-Software Lizenzprüfung

Begründung:

  • Client-Software benötigt direkten Zugriff für Lizenzprüfung
  • Umgehung von möglichen Firewall-Blockaden auf Port 443
  • Weniger Latenz ohne Nginx-Proxy
  • Flexibilität für verschiedene Client-Implementierungen

Konfiguration:

Sicherheitshinweis:

  • Port 8443 ist wieder direkt exponiert
  • License Server muss vor Produktivbetrieb implementiert werden mit:
    • Eigener SSL-Konfiguration
    • API-Key Authentifizierung
    • Rate Limiting
    • Input-Validierung

Status:

  • Port-Mapping in docker-compose.yaml wiederhergestellt
  • Änderung erfordert Docker-Neustart

2025-01-07 - Rate-Limiting und Brute-Force-Schutz implementiert

  • Umfassender Schutz vor Login-Angriffen mit IP-Sperre
  • Dashboard-Integration für Sicherheitsüberwachung

Implementierte Features:

  1. Rate-Limiting System:

    • 5 Login-Versuche erlaubt, danach 24h IP-Sperre
    • Progressive Fehlermeldungen (zufällig aus 5 lustigen Varianten)
    • CAPTCHA nach 2 Fehlversuchen (Google reCAPTCHA v2 vorbereitet)
    • E-Mail-Benachrichtigung bei Sperrung (vorbereitet, deaktiviert für PoC)
  2. Timing-Attack Schutz:

    • Mindestens 1 Sekunde Antwortzeit bei allen Login-Versuchen
    • Gleiche Antwortzeit bei richtigem/falschem Username
    • Verhindert Username-Enumeration
  3. Lustige Fehlermeldungen (zufällig):

    • "NOPE!"
    • "ACCESS DENIED, TRY HARDER"
    • "WRONG! 🚫"
    • "COMPUTER SAYS NO"
    • "YOU FAILED"
  4. Dashboard-Sicherheitswidget:

    • Sicherheitslevel-Anzeige (NORMAL/ERHÖHT/KRITISCH)
    • Anzahl gesperrter IPs
    • Fehlversuche heute
    • Letzte 5 Sicherheitsereignisse mit Details
  5. IP-Verwaltung:

    • Übersicht aller gesperrten IPs
    • Manuelles Entsperren möglich
    • Login-Versuche zurücksetzen
    • Detaillierte Informationen pro IP
  6. Audit-Log Erweiterungen:

    • LOGIN_SUCCESS - Erfolgreiche Anmeldung
    • LOGIN_FAILED - Fehlgeschlagener Versuch
    • LOGIN_BLOCKED - IP wurde gesperrt
    • UNBLOCK_IP - IP manuell entsperrt
    • CLEAR_ATTEMPTS - Versuche zurückgesetzt

Neue/Geänderte Dateien:

  • v2_adminpanel/init.sql (login_attempts Tabelle)
  • v2_adminpanel/app.py (Rate-Limiting Logik, neue Routen)
  • v2_adminpanel/templates/login.html (Fehlermeldungs-Styling, CAPTCHA)
  • v2_adminpanel/templates/dashboard.html (Sicherheitswidget)
  • v2_adminpanel/templates/blocked_ips.html (neu - IP-Verwaltung)

Technische Details:

  • IP-Ermittlung berücksichtigt Proxy-Header (X-Forwarded-For)
  • Fehlermeldungen mit Animation (shake-effect)
  • Farbcodierung: Rot für Fehler, Lila für Sperre, Orange für CAPTCHA
  • Automatische Bereinigung alter Einträge möglich

Sicherheitsverbesserungen:

  • Schutz vor Brute-Force-Angriffen
  • Timing-Attack-Schutz implementiert
  • IP-basierte Sperrung für 24 Stunden
  • Audit-Trail für alle Sicherheitsereignisse

Hinweis für Produktion:

  • CAPTCHA-Keys müssen in .env konfiguriert werden
  • E-Mail-Server für Benachrichtigungen einrichten
  • Rate-Limits können über Konstanten angepasst werden

2025-01-07 - Session-Timeout mit Live-Timer implementiert

  • 5 Minuten Inaktivitäts-Timeout mit visueller Countdown-Anzeige
  • Automatische Session-Verlängerung bei Benutzeraktivität

Implementierte Features:

  1. Session-Timeout Backend:

    • Flask Session-Timeout auf 5 Minuten konfiguriert
    • Heartbeat-Endpoint für Keep-Alive
    • Automatisches Session-Update bei jeder Aktion
  2. Live-Timer in der Navbar:

    • Countdown von 5:00 bis 0:00
    • Position: Zwischen Logo und Username
    • Farbwechsel nach verbleibender Zeit:
      • Grün: > 2 Minuten
      • Gelb: 1-2 Minuten
      • Rot: < 1 Minute
      • Blinkend: < 30 Sekunden
  3. Benutzerinteraktion:

    • Timer wird bei jeder Aktivität zurückgesetzt
    • Tracking von: Klicks, Tastatureingaben, Mausbewegungen
    • Automatischer Heartbeat bei Aktivität
    • Warnung bei < 1 Minute mit "Session verlängern" Button
  4. Base-Template System:

    • Neue base.html als Basis für alle Admin-Seiten
    • Alle Templates (außer login.html) nutzen jetzt base.html
    • Einheitliches Layout und Timer auf allen Seiten

Neue/Geänderte Dateien:

  • v2_adminpanel/app.py (Session-Konfiguration, Heartbeat-Endpoint)
  • v2_adminpanel/templates/base.html (neu - Base-Template mit Timer)
  • Alle anderen Templates aktualisiert für Template-Vererbung

Technische Details:

  • JavaScript-basierter Countdown-Timer
  • AJAX-Heartbeat alle 5 Sekunden bei Aktivität
  • LocalStorage für Tab-Synchronisation möglich
  • Automatischer Logout bei 0:00
  • Fetch-Interceptor für automatische Session-Verlängerung

Sicherheitsverbesserung:

  • Automatischer Logout nach 5 Minuten Inaktivität
  • Verhindert vergessene Sessions
  • Visuelles Feedback für Session-Status

2025-01-07 - Session-Timeout Bug behoben

  • Problem: Session-Timeout funktionierte nicht korrekt - Session blieb länger als 5 Minuten aktiv
  • Ursache: login_required Decorator aktualisierte last_activity bei JEDEM Request

Durchgeführte Änderungen:

  1. login_required Decorator (app.py):

    • Prüft jetzt ob Session abgelaufen ist (5 Minuten seit last_activity)
    • Aktualisiert last_activity NICHT mehr automatisch
    • Führt AUTO_LOGOUT mit Audit-Log bei Timeout durch
    • Speichert Username vor session.clear() für korrektes Logging
  2. Heartbeat-Endpoint (app.py):

    • Geändert zu POST-only Endpoint
    • Aktualisiert explizit last_activity wenn aufgerufen
    • Wird nur bei aktiver Benutzerinteraktion aufgerufen
  3. Frontend Timer (base.html):

    • Heartbeat wird als POST Request gesendet
    • trackActivity() ruft extendSession() ohne vorheriges resetTimer() auf
    • Timer wird erst nach erfolgreichem Heartbeat zurückgesetzt
    • AJAX Interceptor ignoriert Heartbeat-Requests
  4. Audit-Log Erweiterung:

    • Neue Aktion AUTO_LOGOUT hinzugefügt
    • Orange Farbcodierung (#fd7e14)
    • Zeigt Grund des Timeouts im Audit-Log

Ergebnis:

  • Session läuft nach exakt 5 Minuten Inaktivität ab
  • Benutzeraktivität verlängert Session korrekt
  • AUTO_LOGOUT wird im Audit-Log protokolliert
  • Visueller Timer zeigt verbleibende Zeit

2025-01-07 - Session-Timeout weitere Verbesserungen

  • Zusätzliche Fixes nach Test-Feedback implementiert

Weitere durchgeführte Änderungen:

  1. Fehlender Import behoben:

    • flash zu Flask-Imports hinzugefügt für Timeout-Warnmeldungen
  2. Session-Cookie-Konfiguration erweitert (app.py):

    • SESSION_COOKIE_HTTPONLY = True (Sicherheit gegen XSS)
    • SESSION_COOKIE_SECURE = False (intern HTTP, extern HTTPS via Nginx)
    • SESSION_COOKIE_SAMESITE = 'Lax' (CSRF-Schutz)
    • SESSION_COOKIE_NAME = 'admin_session' (eindeutiger Name)
    • SESSION_REFRESH_EACH_REQUEST = False (verhindert automatische Verlängerung)
  3. Session-Handling verbessert:

    • Entfernt: session.permanent = True aus login_required decorator
    • Hinzugefügt: session.modified = True im Heartbeat für explizites Speichern
    • Debug-Logging für Session-Timeout-Prüfung hinzugefügt
  4. Nginx-Konfiguration:

    • Bereits korrekt konfiguriert für Heartbeat-Weiterleitung
    • Proxy-Headers für korrekte IP-Weitergabe

Technische Details:

  • Flask-Session mit Filesystem-Backend nutzt jetzt korrekte Cookie-Einstellungen
  • Session-Cookie wird nicht mehr automatisch bei jedem Request verlängert
  • Explizite Session-Modifikation nur bei Heartbeat-Requests
  • Debug-Logs zeigen Zeit seit letzter Aktivität für Troubleshooting

Status:

  • Session-Timeout-Mechanismus vollständig implementiert
  • Debug-Logging für Session-Überwachung aktiv
  • Cookie-Sicherheitseinstellungen optimiert

2025-01-07 - CAPTCHA Backend-Validierung implementiert

  • Google reCAPTCHA v2 Backend-Verifizierung hinzugefügt

Implementierte Features:

  1. verify_recaptcha() Funktion (app.py):

    • Validiert CAPTCHA-Response mit Google API
    • Fallback: Wenn RECAPTCHA_SECRET_KEY nicht konfiguriert, wird CAPTCHA übersprungen (für PoC)
    • Timeout von 5 Sekunden für API-Request
    • Error-Handling für Netzwerkfehler
    • Logging für Debugging und Fehleranalyse
  2. Login-Route Erweiterungen:

    • CAPTCHA wird nach 2 Fehlversuchen angezeigt
    • Prüfung ob CAPTCHA-Response vorhanden
    • Validierung der CAPTCHA-Response gegen Google API
    • Unterschiedliche Fehlermeldungen für fehlende/ungültige CAPTCHA
    • Site Key wird aus Environment-Variable an Template übergeben
  3. Environment-Konfiguration (.env):

    • RECAPTCHA_SITE_KEY (für Frontend)
    • RECAPTCHA_SECRET_KEY (für Backend-Validierung)
    • Beide auskommentiert für PoC-Phase
  4. Dependencies:

    • requests Library zu requirements.txt hinzugefügt

Sicherheitsaspekte:

  • CAPTCHA verhindert automatisierte Brute-Force-Angriffe
  • Timing-Attack-Schutz bleibt auch bei CAPTCHA-Prüfung aktiv
  • Bei Netzwerkfehlern wird CAPTCHA als bestanden gewertet (Verfügbarkeit vor Sicherheit)
  • Secret Key wird niemals im Frontend exponiert

Verwendung:

  1. Google reCAPTCHA v2 Keys erstellen: https://www.google.com/recaptcha/admin
  2. Keys in .env eintragen:
    RECAPTCHA_SITE_KEY=your-site-key
    RECAPTCHA_SECRET_KEY=your-secret-key
    
  3. Container neu starten

Status:

  • CAPTCHA-Frontend bereits vorhanden (login.html)
  • Backend-Validierung vollständig implementiert
  • Fallback für PoC-Betrieb ohne Google-Keys
  • Integration in Rate-Limiting-System
  • ⚠️ CAPTCHA-Keys noch nicht konfiguriert (für PoC deaktiviert)

Anleitung für Google reCAPTCHA Keys:

  1. Registrierung bei Google reCAPTCHA:

    • Gehe zu: https://www.google.com/recaptcha/admin/create
    • Melde dich mit Google-Konto an
    • Label eingeben: "v2-Docker Admin Panel"
    • Typ wählen: "reCAPTCHA v2" → "Ich bin kein Roboter"-Kästchen
    • Domains hinzufügen:
      admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com
      localhost
      
    • Nutzungsbedingungen akzeptieren
    • Senden klicken
  2. Keys erhalten:

    • Site Key (öffentlich für Frontend)
    • Secret Key (geheim für Backend-Validierung)
  3. Keys in .env eintragen:

    RECAPTCHA_SITE_KEY=6Ld...
    RECAPTCHA_SECRET_KEY=6Ld...
    
  4. 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:

  1. Backend-Funktionen (app.py):

    • generate_license_key() - Generiert Keys mit kryptografisch sicherem Zufallsgenerator
    • validate_license_key() - Validiert das Key-Format mit Regex
    • Verwendet secrets statt random für Sicherheit
    • Erlaubte Zeichen: ABCDEFGHJKLMNPQRSTUVWXYZ23456789 (ohne verwirrende)
  2. API-Endpoint:

    • POST /api/generate-license-key - JSON API für Key-Generierung
    • Prüft auf Duplikate in der Datenbank (max. 10 Versuche)
    • Audit-Log-Eintrag bei jeder Generierung
    • Login-Required geschützt
  3. Frontend-Verbesserungen (index.html):

    • Generate-Button neben License Key Input
    • Placeholder und Pattern-Attribut für Format-Hinweis
    • Auto-Uppercase bei manueller Eingabe
    • Visuelles Feedback bei erfolgreicher Generierung
    • Format-Hinweis unter dem Eingabefeld
  4. JavaScript-Features:

    • AJAX-basierte Key-Generierung ohne Seiten-Reload
    • Automatische Prüfung bei Lizenztyp-Änderung
    • Ladeindikator während der Generierung
    • Fehlerbehandlung mit Benutzer-Feedback
    • Standard-Datum-Einstellungen (heute + 1 Jahr)
  5. Validierung:

    • Server-seitige Format-Validierung beim Speichern
    • Flash-Message bei ungültigem Format
    • Automatische Großschreibung des Keys
    • Pattern-Validierung im HTML-Formular
  6. Weitere Fixes:

    • Form Action von "/" auf "/create" korrigiert
    • Flash-Messages mit Bootstrap Toasts implementiert
    • GENERATE_KEY Aktion zum Audit-Log hinzugefügt (Farbe: #20c997)

Technische Details:

  • Keine vorhersagbaren Muster durch secrets.choice()
  • Datum im Key zeigt Erstellungszeitpunkt
  • Lizenztyp direkt im Key erkennbar
  • Kollisionsprüfung gegen Datenbank

Status:

  • Backend-Generierung vollständig implementiert
  • Frontend mit Generate-Button und JavaScript
  • Validierung und Fehlerbehandlung
  • Audit-Log-Integration
  • Form-Action-Bug behoben

2025-01-07 - Batch-Lizenzgenerierung implementiert

  • Mehrere Lizenzen auf einmal für einen Kunden erstellen

Implementierte Features:

  1. Batch-Formular (/batch):

    • Kunde und E-Mail eingeben
    • Anzahl der Lizenzen (1-100)
    • Lizenztyp (Vollversion/Testversion)
    • Gültigkeitszeitraum für alle Lizenzen
    • Vorschau-Modal zeigt Key-Format
    • Standard-Datum-Einstellungen (heute + 1 Jahr)
  2. Backend-Verarbeitung:

    • Route /batch für GET (Formular) und POST (Generierung)
    • Generiert die angegebene Anzahl eindeutiger Keys
    • Speichert alle in einer Transaktion
    • Kunde wird automatisch angelegt (falls nicht vorhanden)
    • ON CONFLICT für existierende Kunden
    • Audit-Log-Eintrag mit CREATE_BATCH Aktion
  3. Ergebnis-Seite:

    • Zeigt alle generierten Lizenzen in Tabellenform
    • Kundeninformationen und Gültigkeitszeitraum
    • Einzelne Keys können kopiert werden (📋 Button)
    • Alle Keys auf einmal kopieren
    • Druckfunktion für physische Ausgabe
    • Link zur Lizenzübersicht mit Kundenfilter
  4. Export-Funktionalität:

    • Route /batch/export für CSV-Download
    • Speichert Batch-Daten in Session für Export
    • CSV mit UTF-8 BOM für Excel-Kompatibilität
    • Enthält Kundeninfo, Generierungsdatum und alle Keys
    • Format: Nr;Lizenzschlüssel;Typ
    • Dateiname: batch_licenses_KUNDE_TIMESTAMP.csv
  5. Integration:

    • Batch-Button in Navigation (Dashboard, Einzellizenz-Seite)
    • CREATE_BATCH Aktion im Audit-Log (Farbe: #6610f2)
    • Session-basierte Export-Daten
    • Flash-Messages für Feedback

Sicherheit:

  • Limit von 100 Lizenzen pro Batch
  • Login-Required für alle Routen
  • Transaktionale Datenbank-Operationen
  • Validierung der Eingaben

Beispiel-Workflow:

  1. Admin geht zu /batch
  2. Gibt Kunde "Firma GmbH", Anzahl "25", Typ "Vollversion" ein
  3. System generiert 25 eindeutige Keys
  4. Ergebnis-Seite zeigt alle Keys
  5. Admin kann CSV exportieren oder Keys kopieren
  6. Kunde erhält die Lizenzen

Status:

  • Batch-Formular vollständig implementiert
  • Backend-Generierung mit Transaktionen
  • Export als CSV
  • Copy-to-Clipboard Funktionalität
  • Audit-Log-Integration
  • Navigation aktualisiert

2025-06-06: Implementierung Searchable Dropdown für Kundenauswahl

Problem:

  • Bei der Lizenzerstellung wurde immer ein neuer Kunde angelegt
  • Keine Möglichkeit, Lizenzen für bestehende Kunden zu erstellen
  • Bei vielen Kunden wäre ein normales Dropdown unübersichtlich

Lösung:

  1. Select2 Library für searchable Dropdown integriert
  2. API-Endpoint /api/customers für die Kundensuche erstellt
  3. Frontend angepasst:
    • Searchable Dropdown mit Live-Suche
    • Option "Neuer Kunde" im Dropdown
    • Eingabefelder erscheinen nur bei "Neuer Kunde"
  4. Backend-Logik verbessert:
    • Prüfung ob neuer oder bestehender Kunde
    • E-Mail-Duplikatsprüfung vor Kundenerstellung
    • Separate Audit-Logs für Kunde und Lizenz
  5. Datenbank:
    • UNIQUE Constraint auf E-Mail-Spalte hinzugefügt

Änderungen:

  • app.py: Neuer API-Endpoint /api/customers, angepasste Routes /create und /batch
  • base.html: Select2 CSS und JS eingebunden
  • index.html: Kundenauswahl mit Select2 implementiert
  • batch_form.html: Kundenauswahl mit Select2 implementiert
  • init.sql: UNIQUE Constraint für E-Mail

Status:

  • API-Endpoint funktioniert mit Pagination
  • Select2 Dropdown mit Suchfunktion
  • Neue/bestehende Kunden können ausgewählt werden
  • E-Mail-Duplikate werden verhindert
  • Sowohl Einzellizenz als auch Batch unterstützt

2025-06-06: Automatische Ablaufdatum-Berechnung

Problem:

  • Manuelles Eingeben von Start- und Enddatum war umständlich
  • Fehleranfällig bei der Datumseingabe
  • Nicht intuitiv für Standard-Laufzeiten

Lösung:

  1. Frontend-Änderungen:
    • Startdatum + Laufzeit (Zahl) + Einheit (Tage/Monate/Jahre)
    • Ablaufdatum wird automatisch berechnet und angezeigt (read-only)
    • Standard: 1 Jahr Laufzeit voreingestellt
  2. Backend-Validierung:
    • Server-seitige Berechnung zur Sicherheit
    • Verwendung von python-dateutil für korrekte Monats-/Jahresberechnungen
  3. Benutzerfreundlichkeit:
    • Sofortige Neuberechnung bei Änderungen
    • Visuelle Hervorhebung des berechneten Datums

Änderungen:

  • index.html: Laufzeit-Eingabe statt Ablaufdatum
  • batch_form.html: Laufzeit-Eingabe statt Ablaufdatum
  • app.py: Datum-Berechnung in /create und /batch Routes
  • requirements.txt: python-dateutil hinzugefügt

Status:

  • Automatische Berechnung funktioniert
  • Frontend zeigt berechnetes Datum sofort an
  • Backend validiert die Berechnung
  • Standardwert (1 Jahr) voreingestellt

2025-06-06: Bugfix - created_at für licenses Tabelle

Problem:

  • Batch-Generierung schlug fehl mit "Fehler bei der Batch-Generierung!"
  • INSERT Statement versuchte created_at zu setzen, aber Spalte existierte nicht
  • Inkonsistenz: Einzellizenzen hatten kein created_at, Batch-Lizenzen versuchten es zu setzen

Lösung:

  1. Datenbank-Schema erweitert:
    • created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP zur licenses Tabelle hinzugefügt
    • Migration für bestehende Datenbanken implementiert
    • Konsistent mit customers Tabelle
  2. Code bereinigt:
    • Explizites created_at aus Batch-INSERT entfernt
    • Datenbank setzt nun automatisch den Zeitstempel bei ALLEN Lizenzen

Änderungen:

  • init.sql: created_at Spalte zur licenses Tabelle mit DEFAULT-Wert
  • init.sql: Migration für bestehende Datenbanken
  • app.py: Entfernt explizites created_at aus batch_licenses()

Status:

  • Alle Lizenzen haben nun automatisch einen Erstellungszeitstempel
  • Batch-Generierung funktioniert wieder
  • Konsistente Zeitstempel für Audit-Zwecke

2025-06-06: Status "Deaktiviert" für manuell abgeschaltete Lizenzen

Problem:

  • Dashboard zeigte nur "aktiv" und "abgelaufen" als Status
  • Manuell deaktivierte Lizenzen (is_active = FALSE) wurden nicht korrekt angezeigt
  • Filter für "inactive" existierte, aber Status wurde nicht richtig berechnet

Lösung:

  1. Status-Berechnung erweitert:
    • CASE-Statement prüft zuerst is_active = FALSE
    • Status "deaktiviert" wird vor anderen Status geprüft
    • Reihenfolge: deaktiviert → abgelaufen → läuft bald ab → aktiv
  2. Dashboard-Statistik erweitert:
    • Neue Zählung für deaktivierte Lizenzen
    • Variable inactive_licenses im stats Dictionary

Änderungen:

  • app.py: Dashboard - Status-Berechnung für letzte 5 Lizenzen
  • app.py: Lizenzübersicht - Status-Berechnung in der Hauptabfrage
  • app.py: Export - Status-Berechnung für CSV/Excel Export
  • app.py: Dashboard - Neue Statistik für deaktivierte Lizenzen

Status:

  • "Deaktiviert" wird korrekt als Status angezeigt
  • Dashboard zeigt Anzahl deaktivierter Lizenzen
  • Export enthält korrekten Status
  • Konsistente Status-Anzeige überall

2025-06-08: SSL-Sicherheit verbessert - Chrome Warnung behoben

Problem:

  • Chrome zeigte Warnung "Die Verbindung zu dieser Website ist nicht sicher"
  • Nginx erlaubte schwache Cipher Suites (WEAK) ohne Perfect Forward Secrecy
  • Veraltete SSL-Konfiguration mit ssl_ciphers HIGH:!aNULL:!MD5;

Lösung:

  1. Moderne Cipher Suite Konfiguration:
    • Nur sichere ECDHE und DHE Cipher Suites
    • Entfernung aller RSA-only Cipher Suites
    • Perfect Forward Secrecy für alle Verbindungen
  2. SSL-Optimierungen:
    • Session Cache aktiviert (1 Tag Timeout)
    • OCSP Stapling für bessere Performance
    • DH Parameters (2048 bit) für zusätzliche Sicherheit
  3. Resolver-Konfiguration:
    • Google DNS Server für OCSP Stapling

Änderungen:

  • v2_nginx/nginx.conf: Komplett überarbeitete SSL-Konfiguration
  • v2_nginx/ssl/dhparam.pem: Neue 2048-bit DH Parameters generiert
  • v2_nginx/Dockerfile: COPY Befehl für dhparam.pem hinzugefügt

Status:

  • Nur noch sichere Cipher Suites aktiv
  • Perfect Forward Secrecy gewährleistet
  • OCSP Stapling aktiviert
  • Chrome Sicherheitswarnung behoben

Hinweis: Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.

2025-06-08: CAPTCHA-Login-Bug behoben

Problem:

  • Nach 2 fehlgeschlagenen Login-Versuchen wurde CAPTCHA angezeigt
  • Da keine CAPTCHA-Keys konfiguriert waren (für PoC), konnte man sich nicht mehr einloggen
  • Selbst mit korrektem Passwort war Login blockiert
  • Fehlermeldung "CAPTCHA ERFORDERLICH!" erschien immer

Lösung:

  1. CAPTCHA-Prüfung nur wenn Keys vorhanden:
    • recaptcha_site_key wird vor CAPTCHA-Prüfung geprüft
    • Wenn keine Keys konfiguriert → kein CAPTCHA-Check
    • CAPTCHA wird nur angezeigt wenn Keys existieren
  2. Template-Anpassungen:
    • login.html zeigt CAPTCHA nur wenn recaptcha_site_key vorhanden
    • Kein Test-Key mehr als Fallback
  3. Konsistente Logik:
    • show_captcha prüft jetzt auch ob Keys vorhanden sind
    • Bei GET und POST Requests gleiche Logik

Änderungen:

  • v2_adminpanel/app.py: CAPTCHA-Check nur wenn RECAPTCHA_SITE_KEY existiert
  • v2_adminpanel/templates/login.html: CAPTCHA nur anzeigen wenn Keys vorhanden

Status:

  • Login funktioniert wieder nach 2+ Fehlversuchen
  • CAPTCHA wird nur angezeigt wenn Keys konfiguriert sind
  • Für PoC-Phase ohne CAPTCHA nutzbar
  • Produktiv-ready wenn CAPTCHA-Keys eingetragen werden

2025-06-08: Zeitzone auf Europe/Berlin umgestellt

Problem:

  • Alle Zeitstempel wurden in UTC gespeichert und angezeigt
  • Backup-Dateinamen zeigten UTC-Zeit statt deutsche Zeit
  • Verwirrung bei Zeitangaben im Admin Panel und Logs

Lösung:

  1. Docker Container Zeitzone konfiguriert:

    • Alle Dockerfiles mit TZ=Europe/Berlin und tzdata Installation
    • PostgreSQL mit PGTZ=Europe/Berlin für Datenbank-Zeitzone
    • Explizite Zeitzone-Dateien in /etc/localtime und /etc/timezone
  2. Python Code angepasst:

    • Import von zoneinfo.ZoneInfo für Zeitzonenunterstützung
    • Alle datetime.now() Aufrufe mit ZoneInfo("Europe/Berlin")
    • .replace(tzinfo=None) für Kompatibilität mit timezone-unaware Timestamps
  3. PostgreSQL Konfiguration:

    • SET timezone = 'Europe/Berlin'; in init.sql
    • Umgebungsvariablen TZ und PGTZ in docker-compose.yaml
  4. docker-compose.yaml erweitert:

    • TZ: Europe/Berlin für alle Services

Geänderte Dateien:

  • v2_adminpanel/Dockerfile: Zeitzone und tzdata hinzugefügt
  • v2_postgres/Dockerfile: Zeitzone und tzdata hinzugefügt
  • v2_nginx/Dockerfile: Zeitzone und tzdata hinzugefügt
  • v2_lizenzserver/Dockerfile: Zeitzone und tzdata hinzugefügt
  • v2_adminpanel/app.py: 14 datetime.now() Aufrufe mit Zeitzone versehen
  • v2_adminpanel/init.sql: PostgreSQL Zeitzone gesetzt
  • v2/docker-compose.yaml: TZ Environment-Variable für alle Services

Ergebnis:

  • Alle neuen Zeitstempel werden in deutscher Zeit (Europe/Berlin) gespeichert
  • Backup-Dateinamen zeigen korrekte deutsche Zeit
  • Admin Panel zeigt alle Zeiten in deutscher Zeitzone
  • Automatische Anpassung bei Sommer-/Winterzeit
  • Konsistente Zeitangaben über alle Komponenten

Hinweis: Nach diesen Änderungen müssen die Docker Container neu gebaut werden:

docker-compose down
docker-compose build
docker-compose up -d

2025-06-08: Zeitzone-Fix - PostgreSQL Timestamps

Problem nach erster Implementierung:

  • Trotz Zeitzoneneinstellung wurden Zeiten immer noch in UTC angezeigt
  • Grund: PostgreSQL Tabellen verwendeten TIMESTAMP WITHOUT TIME ZONE

Zusätzliche Lösung:

  1. Datenbankschema angepasst:

    • Alle TIMESTAMP Spalten auf TIMESTAMP WITH TIME ZONE geändert
    • Betrifft: created_at, timestamp, started_at, ended_at, last_heartbeat, etc.
    • Migration für bestehende Datenbanken berücksichtigt
  2. SQL-Abfragen vereinfacht:

    • AT TIME ZONE 'Europe/Berlin' nicht mehr nötig
    • PostgreSQL handhabt Zeitzonenkonvertierung automatisch

Geänderte Datei:

  • v2_adminpanel/init.sql: Alle TIMESTAMP Felder mit WITH TIME ZONE

Wichtig: Bei bestehenden Installationen muss die Datenbank neu initialisiert oder manuell migriert werden:

ALTER TABLE customers ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE licenses ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN started_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN last_heartbeat TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN ended_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE audit_log ALTER COLUMN timestamp TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE backup_history ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN first_attempt TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN last_attempt TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN blocked_until TYPE TIMESTAMP WITH TIME ZONE;

2025-06-08: UI/UX Überarbeitung - Phase 1 (Navigation)

Problem:

  • Inkonsistente Navigation zwischen verschiedenen Seiten
  • Zu viele Navigationspunkte im Dashboard
  • Verwirrende Benutzerführung

Lösung:

  1. Dashboard vereinfacht:

    • Nur noch 3 Buttons: Neue Lizenz, Batch-Lizenzen, Log
    • Statistik-Karten wurden klickbar gemacht (verlinken zu jeweiligen Seiten)
    • "Audit" wurde zu "Log" umbenannt
  2. Navigation konsistent gemacht:

    • Navbar-Brand "AccountForger - Admin Panel" ist jetzt klickbar und führt zum Dashboard
    • Keine Log-Links mehr in Unterseiten
    • Konsistente "Dashboard" Buttons in allen Unterseiten

Geänderte Dateien:

  • v2_adminpanel/templates/base.html: Navbar-Brand klickbar gemacht
  • v2_adminpanel/templates/dashboard.html: Navigation reduziert, Karten klickbar
  • v2_adminpanel/templates/*.html: Konsistente Dashboard-Links

2025-06-08: UI/UX Überarbeitung - Phase 2 (Visuelle Verbesserungen)

Implementierte Verbesserungen:

  1. Größere Icons in Statistik-Karten:

    • Icon-Größe auf 3rem erhöht
    • Bessere visuelle Hierarchie
  2. Donut-Chart für Lizenzen:

    • Chart.js Integration für Lizenzstatistik
    • Zeigt Verhältnis Aktiv/Abgelaufen
    • UPDATE: Später wieder entfernt auf Benutzerwunsch
  3. Pulse-Effekt für aktive Sessions:

    • CSS-Animation für aktive Sessions
    • Visueller Indikator für Live-Aktivität
  4. Progress-Bar für Backup-Status:

    • Zeigt visuell den Erfolg des letzten Backups
    • Inkl. Dateigröße und Dauer
  5. Konsistente Farbcodierung:

    • CSS-Variablen für Statusfarben
    • Globale Klassen für konsistente Darstellung

Geänderte Dateien:

  • v2_adminpanel/templates/base.html: Globale CSS-Variablen und Statusklassen
  • v2_adminpanel/templates/dashboard.html: Visuelle Verbesserungen implementiert

2025-06-08: UI/UX Überarbeitung - Phase 3 (Tabellen-Optimierungen)

Problem:

  • Tabellen waren schwer zu navigieren bei vielen Einträgen
  • Keine Möglichkeit für Bulk-Operationen
  • Umständliches Kopieren von Lizenzschlüsseln

Lösung:

  1. Sticky Headers:

    • Tabellenköpfe bleiben beim Scrollen sichtbar
    • CSS-Klasse .table-sticky mit position: sticky
  2. Inline-Actions:

    • Copy-Button direkt neben Lizenzschlüsseln
    • Toggle-Switches für Aktiv/Inaktiv-Status
    • Visuelles Feedback bei Aktionen
  3. Bulk-Actions:

    • Checkboxen für Mehrfachauswahl
    • "Select All" Funktionalität
    • Bulk-Actions Bar mit Aktivieren/Deaktivieren/Löschen
    • JavaScript für dynamische Anzeige
  4. API-Endpoints hinzugefügt:

    • /api/license/<id>/toggle - Toggle einzelner Lizenzstatus
    • /api/licenses/bulk-activate - Mehrere Lizenzen aktivieren
    • /api/licenses/bulk-deactivate - Mehrere Lizenzen deaktivieren
    • /api/licenses/bulk-delete - Mehrere Lizenzen löschen
  5. Beispieldaten eingefügt:

    • 15 Testkunden
    • 18 Lizenzen (verschiedene Status)
    • Sessions, Audit-Logs, Login-Attempts
    • Backup-Historie

Geänderte Dateien:

  • v2_adminpanel/templates/base.html: CSS für Sticky-Tables und Bulk-Actions
  • v2_adminpanel/templates/licenses.html: Komplette Tabellen-Überarbeitung
  • v2_adminpanel/app.py: 4 neue API-Endpoints für Toggle und Bulk-Operationen
  • v2_adminpanel/sample_data.sql: Umfangreiche Testdaten erstellt

Bugfix:

  • API-Endpoints versuchten updated_at zu setzen, obwohl die Spalte nicht existiert
  • Entfernt aus allen 3 betroffenen Endpoints

Status:

  • Sticky Headers funktionieren
  • Copy-Buttons mit Clipboard-API
  • Toggle-Switches ändern Lizenzstatus
  • Bulk-Operationen vollständig implementiert
  • Testdaten erfolgreich eingefügt

2025-06-08: UI/UX Überarbeitung - Phase 4 (Sortierbare Tabellen)

Problem:

  • Keine Möglichkeit, Tabellen nach verschiedenen Spalten zu sortieren
  • Besonders bei großen Datenmengen schwer zu navigieren

Lösung - Hybrid-Ansatz:

  1. Client-seitige Sortierung für kleine Tabellen:

    • Dashboard (3 kleine Übersichtstabellen)
    • Blocked IPs (typischerweise wenige Einträge)
    • Backups (begrenzte Anzahl)
    • JavaScript-basierte Sortierung ohne Reload
  2. Server-seitige Sortierung für große Tabellen:

    • Licenses (potenziell tausende Einträge)
    • Customers (viele Kunden möglich)
    • Audit Log (wächst kontinuierlich)
    • Sessions (viele aktive/beendete Sessions)
    • URL-Parameter für Sortierung mit SQL ORDER BY

Implementierung:

  1. Client-seitige Sortierung:

    • Generische JavaScript-Funktion in base.html
    • CSS-Klasse .sortable-table für betroffene Tabellen
    • Sortier-Indikatoren (↑↓↕) bei Hover/Active
    • Unterstützung für Text, Zahlen und deutsche Datumsformate
  2. Server-seitige Sortierung:

    • Query-Parameter sort und order in Routes
    • Whitelist für erlaubte Sortierfelder (SQL-Injection-Schutz)
    • Makro-Funktionen für sortierbare Header
    • Sortier-Parameter in Pagination-Links erhalten

Geänderte Dateien:

  • v2_adminpanel/templates/base.html: CSS und JavaScript für Sortierung
  • v2_adminpanel/templates/dashboard.html: Client-seitige Sortierung
  • v2_adminpanel/templates/blocked_ips.html: Client-seitige Sortierung
  • v2_adminpanel/templates/backups.html: Client-seitige Sortierung
  • v2_adminpanel/templates/licenses.html: Server-seitige Sortierung
  • v2_adminpanel/templates/customers.html: Server-seitige Sortierung
  • v2_adminpanel/templates/audit_log.html: Server-seitige Sortierung
  • v2_adminpanel/templates/sessions.html: Server-seitige Sortierung (2 Tabellen)
  • v2_adminpanel/app.py: 4 Routes erweitert für Sortierung

Besonderheiten:

  • Sessions-Seite hat zwei unabhängige Tabellen mit eigenen Sortierparametern
  • Intelligente Datentyp-Erkennung (numeric, date) für korrekte Sortierung
  • Visuelle Sortier-Indikatoren zeigen aktuelle Sortierung
  • Alle anderen Filter und Suchparameter bleiben bei Sortierung erhalten

Status:

  • Client-seitige Sortierung für kleine Tabellen
  • Server-seitige Sortierung für große Tabellen
  • Sortier-Indikatoren und visuelle Rückmeldung
  • SQL-Injection-Schutz durch Whitelisting
  • Vollständige Integration mit bestehenden Features

2025-06-08: Bugfix - Sortierlogik korrigiert

Problem:

  • Sortierung funktionierte nicht korrekt
  • Beim Klick auf Spaltenköpfe wurde immer absteigend sortiert
  • Toggle zwischen ASC/DESC funktionierte nicht

Ursachen:

  1. Falsche Bedingungslogik: Die ursprüngliche Implementierung verwendete eine fehlerhafte Ternär-Bedingung
  2. Berechnete Felder: Das 'status' Feld in der Lizenztabelle konnte nicht direkt sortiert werden

Lösung:

  1. Sortierlogik korrigiert:

    • Bei neuer Spalte: Immer aufsteigend (ASC) beginnen
    • Bei gleicher Spalte: Toggle zwischen ASC und DESC
    • Implementiert durch bedingte Links in den Makros
  2. Spezialbehandlung für berechnete Felder:

    • Status-Feld verwendet CASE-Statement in ORDER BY
    • Wiederholt die gleiche Logik wie im SELECT

Geänderte Dateien:

  • v2_adminpanel/templates/licenses.html: Sortierlogik korrigiert
  • v2_adminpanel/templates/customers.html: Sortierlogik korrigiert
  • v2_adminpanel/templates/audit_log.html: Sortierlogik korrigiert
  • v2_adminpanel/templates/sessions.html: Sortierlogik für beide Tabellen korrigiert
  • v2_adminpanel/app.py: Spezialbehandlung für Status-Feld in licenses Route

Verhalten nach Fix:

  • Erster Klick auf Spalte: Aufsteigend sortieren
  • Zweiter Klick: Absteigend sortieren
  • Weitere Klicks: Toggle zwischen ASC/DESC
  • Sortierung funktioniert korrekt mit Pagination und Filtern

2025-06-09: Port 8443 geschlossen - API nur noch über Nginx

Problem:

  • Doppelte Verfügbarkeit des License Servers (Port 8443 + Nginx) machte keinen Sinn
  • Inkonsistente Sicherheitskonfiguration (Nginx hatte Security Headers, Port 8443 nicht)
  • Doppelte SSL-Konfiguration nötig
  • Verwirrung welcher Zugangsweg genutzt werden soll

Lösung:

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:

Status:

  • Port 8443 geschlossen
  • API nur noch über Nginx Reverse Proxy erreichbar
  • Sicherheit erhöht durch zentrale Verwaltung

2025-06-09: Live-Filtering implementiert

Problem:

  • Benutzer mussten immer auf "Filter anwenden" klicken
  • Umständliche Bedienung, besonders bei mehreren Filterkriterien
  • Nicht zeitgemäße User Experience

Lösung:

  • JavaScript Event-Listener für automatisches Filtern
  • Text-Eingaben: 300ms Debouncing (verzögerte Suche nach Tipp-Pause)
  • Dropdowns: Sofortiges Filtern bei Änderung
  • "Filter anwenden" Button entfernt, nur "Zurücksetzen" bleibt

Implementierte Live-Filter:

  1. Lizenzübersicht (licenses.html):

    • Suchfeld mit Debouncing
    • Typ-Dropdown (Vollversion/Testversion)
    • Status-Dropdown (Aktiv/Ablaufend/Abgelaufen/Deaktiviert)
  2. Kundenübersicht (customers.html):

    • Suchfeld mit Debouncing
    • "Suchen" Button entfernt
  3. Audit-Log (audit_log.html):

    • Benutzer-Textfeld mit Debouncing
    • Aktion-Dropdown
    • Entität-Dropdown

Technische Details:

  • addEventListener('input') für Textfelder
  • addEventListener('change') für Select-Elemente
  • setTimeout() mit 300ms für Debouncing
  • Automatisches form.submit() bei Änderungen

Vorteile:

  • Schnellere und intuitivere Bedienung
  • Weniger Klicks erforderlich
  • Moderne User Experience
  • Besonders hilfreich bei komplexen Filterkriterien

Status:

  • Live-Filtering auf allen Hauptseiten implementiert
  • Debouncing verhindert zu viele Server-Requests
  • Zurücksetzen-Button bleibt für schnelles Löschen aller Filter

2025-06-09: Resource Pool System implementiert (Phase 1 & 2)

Ziel: Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder Lizenzerstellung 1-10 Ressourcen pro Typ zugewiesen werden. Ressourcen haben 3 Status: available, allocated, quarantine.

Phase 1 - Datenbank-Schema ( Abgeschlossen):

  1. Neue Tabellen erstellt:

    • resource_pools - Haupttabelle für alle Ressourcen
    • resource_history - Vollständige Historie aller Aktionen
    • resource_metrics - Performance-Tracking und ROI-Berechnung
    • license_resources - Zuordnung zwischen Lizenzen und Ressourcen
  2. Erweiterte licenses Tabelle:

    • domain_count, ipv4_count, phone_count Spalten hinzugefügt
    • Constraints: 0-10 pro Resource-Typ
  3. Indizes für Performance:

    • Status, Type, Allocated License, Quarantine Date

Phase 2 - Backend-Implementierung ( Abgeschlossen):

  1. Resource Management Routes:

    • /resources - Hauptübersicht mit Statistiken
    • /resources/add - Bulk-Import von Ressourcen
    • /resources/quarantine/<id> - Ressourcen sperren
    • /resources/release - Quarantäne aufheben
    • /resources/history/<id> - Komplette Historie
    • /resources/metrics - Performance Dashboard
    • /resources/report - Report-Generator
  2. API-Endpunkte:

    • /api/resources/allocate - Ressourcen-Zuweisung
    • /api/resources/check-availability - Verfügbarkeit prüfen
  3. Integration in Lizenzerstellung:

    • create_license() erweitert um Resource-Allocation
    • batch_licenses() mit Ressourcen-Prüfung für gesamten Batch
    • Transaktionale Sicherheit bei Zuweisung
  4. Dashboard-Integration:

    • Resource-Statistiken in Dashboard eingebaut
    • Warning-Level basierend auf Verfügbarkeit
  5. Navigation erweitert:

    • Resources-Link in Navbar hinzugefügt

Was noch zu tun ist:

Phase 3 - UI-Komponenten (🔄 Ausstehend):

  1. Templates erstellen:

    • resources.html - Hauptübersicht mit Drag&Drop
    • add_resources.html - Formular für Bulk-Import
    • resource_history.html - Historie-Anzeige
    • resource_metrics.html - Performance Dashboard
  2. Formulare erweitern:

    • index.html - Resource-Dropdowns hinzufügen
    • batch_form.html - Resource-Dropdowns hinzufügen
  3. Dashboard-Widget:

    • Resource Pool Statistik mit Ampelsystem
    • Warnung bei niedrigem Bestand

Phase 4 - Erweiterte Features (🔄 Ausstehend):

  1. Quarantäne-Workflow:

    • Gründe: abuse, defect, maintenance, blacklisted, expired
    • Automatische Tests vor Freigabe
    • Genehmigungsprozess
  2. Performance-Metrics:

    • Täglicher Cronjob für Metriken
    • ROI-Berechnung
    • Issue-Tracking
  3. Report-Generator:

    • Auslastungsreport
    • Performance-Report
    • Compliance-Report

Phase 5 - Backup erweitern (🔄 Ausstehend):

  • Neue Tabellen in Backup einbeziehen:
    • resource_pools
    • resource_history
    • resource_metrics
    • license_resources

Phase 6 - Testing & Migration (🔄 Ausstehend):

  1. Test-Daten generieren:

    • 500 Test-Domains
    • 200 Test-IPs
    • 100 Test-Telefonnummern
  2. Migrations-Script:

    • Bestehende Lizenzen auf default resource_count setzen

Phase 7 - Dokumentation (🔄 Ausstehend):

  • API-Dokumentation für License Server
  • Admin-Handbuch für Resource Management

Technische Details:

  • 3-Status-System: available/allocated/quarantine
  • Transaktionale Ressourcen-Zuweisung mit FOR UPDATE Lock
  • Vollständige Historie mit IP-Tracking
  • Drag&Drop UI für Resource-Management geplant
  • Automatische Warnung bei < 50 verfügbaren Ressourcen

Status:

  • Datenbank-Schema komplett
  • Backend-Routen implementiert
  • Integration in Lizenzerstellung
  • UI-Templates fehlen noch
  • Erweiterte Features ausstehend
  • Testing und Migration offen

2025-06-09: Resource Pool System UI-Implementierung (Phase 3 & 4)

Phase 3 - UI-Komponenten ( Abgeschlossen):

  1. Neue Templates erstellt:

    • resources.html - Hauptübersicht mit Statistiken, Filter, Live-Suche, Pagination
    • add_resources.html - Bulk-Import Formular mit Validierung
    • resource_history.html - Timeline-Ansicht der Historie mit Details
    • resource_metrics.html - Performance Dashboard mit Charts
    • resource_report.html - Report-Generator UI
  2. Erweiterte Formulare:

    • index.html - Resource-Count Dropdowns (0-10) mit Live-Verfügbarkeitsprüfung
    • batch_form.html - Resource-Count mit Batch-Berechnung (zeigt Gesamtbedarf)
  3. Dashboard-Widget:

    • Resource Pool Statistik mit Ampelsystem implementiert
    • Zeigt verfügbare/zugeteilte/quarantäne Ressourcen
    • Warnung bei niedrigem Bestand (<50)
    • Fortschrittsbalken für visuelle Darstellung
  4. Backend-Anpassungen:

    • resource_history Route korrigiert für Object-Style Template-Zugriff
    • resources_metrics Route vollständig implementiert mit Charts-Daten
    • resources_report Route erweitert für Template-Anzeige und Downloads
    • Dashboard erweitert um Resource-Statistiken

Phase 4 - Erweiterte Features ( Teilweise):

  1. Report-Generator:
    • Template für Report-Auswahl erstellt
    • 4 Report-Typen: Usage, Performance, Compliance, Inventory
    • Export als Excel, CSV oder PDF-Vorschau
    • Zeitraum-Auswahl mit Validierung

Technische Details der Implementierung:

  • Live-Filtering ohne Reload durch JavaScript
  • AJAX-basierte Verfügbarkeitsprüfung
  • Bootstrap 5 für konsistentes Design
  • Chart.js für Metriken-Visualisierung
  • Responsives Design für alle Templates
  • Copy-to-Clipboard für Resource-Werte
  • Modal-Dialoge für Quarantäne-Aktionen

Was noch fehlt:

Phase 5 - Backup erweitern (🔄 Ausstehend):

  • Resource-Tabellen in pg_dump einbeziehen:
    • resource_pools
    • resource_history
    • resource_metrics
    • license_resources

Phase 6 - Testing & Migration (🔄 Ausstehend):

  1. Test-Daten generieren:

    • Script für 500 Test-Domains
    • 200 Test-IPv4-Adressen
    • 100 Test-Telefonnummern
    • Realistische Verteilung über Status
  2. Migrations-Script:

    • Bestehende Lizenzen auf Default resource_count setzen
    • UPDATE licenses SET domain_count=1, ipv4_count=1, phone_count=1 WHERE ...

Phase 7 - Dokumentation (🔄 Ausstehend):

  • API-Dokumentation für Resource-Endpunkte
  • Admin-Handbuch für Resource Management
  • Troubleshooting-Guide

Offene Punkte für Produktion:

  1. Drag&Drop für Resource-Verwaltung (Nice-to-have)
  2. Automatische Quarantäne-Aufhebung nach Zeitablauf
  3. E-Mail-Benachrichtigungen bei niedrigem Bestand
  4. API für externe Resource-Prüfung
  5. Bulk-Delete für Ressourcen
  6. Resource-Import aus CSV/Excel

2025-06-09: Resource Pool System finalisiert

Problem:

  • Resource Pool System war nur teilweise implementiert
  • UI-Templates waren vorhanden, aber nicht dokumentiert
  • Test-Daten und Migration fehlten
  • Backup-Integration unklar

Analyse und Lösung:

  1. Status-Überprüfung durchgeführt:

    • Alle 5 UI-Templates existierten bereits (resources.html, add_resources.html, etc.)
    • Resource-Dropdowns waren bereits in index.html und batch_form.html integriert
    • Dashboard-Widget war bereits implementiert
    • Backup-System inkludiert bereits alle Tabellen (pg_dump ohne -t Parameter)
  2. Fehlende Komponenten erstellt:

    • Test-Daten Script: test_data_resources.sql

      • 500 Test-Domains (400 verfügbar, 50 zugeteilt, 50 in Quarantäne)
      • 200 Test-IPv4-Adressen (150 verfügbar, 30 zugeteilt, 20 in Quarantäne)
      • 100 Test-Telefonnummern (70 verfügbar, 20 zugeteilt, 10 in Quarantäne)
      • Resource History und Metrics für realistische Daten
    • Migration Script: migrate_existing_licenses.sql

      • Setzt Default Resource Counts (Vollversion: 2, Testversion: 1, Inaktiv: 0)
      • Weist automatisch verfügbare Ressourcen zu
      • Erstellt Audit-Log Einträge
      • Gibt detaillierten Migrationsbericht aus

Hinweis:

  • Test-Daten und Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht

Status:

  • Resource Pool System vollständig implementiert und dokumentiert
  • Alle UI-Komponenten vorhanden und funktionsfähig
  • Integration in Lizenz-Formulare abgeschlossen
  • Dashboard-Widget zeigt Resource-Statistiken
  • Backup-System inkludiert Resource-Tabellen
  • Test-Daten und Migration bereitgestellt

Nächste Schritte:

  1. License Server API implementieren (Hauptaufgabe)

2025-06-09: Bugfix - Resource Pool Tabellen fehlten

Problem:

  • Admin Panel zeigte "Internal Server Error"
  • Dashboard Route versuchte auf resource_pools Tabelle zuzugreifen
  • Tabelle existierte nicht in der Datenbank

Ursache:

  • Bei bereits existierender Datenbank wird init.sql nicht erneut ausgeführt
  • Resource Pool Tabellen wurden erst später zum init.sql hinzugefügt
  • Docker Container verwendeten noch die alte Datenbankstruktur

Lösung:

  1. Separates Script erstellt und manuell in der Datenbank ausgeführt
  2. Alle 4 Resource-Tabellen erfolgreich erstellt:
    • resource_pools
    • resource_history
    • resource_metrics
    • license_resources

Status:

  • Admin Panel funktioniert wieder
  • Dashboard zeigt Resource Pool Statistiken
  • Alle Resource-Funktionen verfügbar

Empfehlung für Neuinstallationen:

  • Bei frischer Installation funktioniert alles automatisch
  • Bei bestehenden Installationen: Resource-Tabellen manuell hinzufügen

2025-06-09: Navigation vereinfacht

Änderung:

  • Navigationspunkte aus der schwarzen Navbar entfernt
  • Links zu Lizenzen, Kunden, Ressourcen, Sessions, Backups und Log entfernt

Grund:

  • Cleaner Look mit nur Logo, Timer und Logout
  • Alle Funktionen sind weiterhin über das Dashboard erreichbar
  • Bessere Übersichtlichkeit und weniger Ablenkung

Geänderte Datei:

  • v2_adminpanel/templates/base.html - Navbar-Links auskommentiert

Status:

  • Navbar zeigt nur noch Logo, Session-Timer und Logout
  • Navigation erfolgt über Dashboard und Buttons auf den jeweiligen Seiten
  • Alle Funktionen bleiben erreichbar

2025-06-09: Bugfix - Resource Report Einrückungsfehler

Problem:

  • Resource Report Route zeigte "Internal Server Error"
  • UnboundLocalError: report_type wurde verwendet bevor es definiert war

Ursache:

  • Fehlerhafte Einrückung in der resources_report() Funktion
  • elif und else Blöcke waren falsch eingerückt
  • Variablen wurden außerhalb ihres Gültigkeitsbereichs verwendet

Lösung:

  • Korrekte Einrückung für alle Conditional-Blöcke wiederhergestellt
  • Alle Report-Typen (usage, performance, compliance, inventory) richtig strukturiert
  • Excel und CSV Export-Code korrekt eingerückt

Geänderte Datei:

  • v2_adminpanel/app.py - resources_report() Funktion korrigiert

Status:

  • Resource Report funktioniert wieder
  • Alle 4 Report-Typen verfügbar
  • Export als Excel und CSV möglich

Zusammenfassung der heutigen Arbeiten (2025-06-09)

1. Resource Pool System Finalisierung

  • Ausgangslage: Resource Pool war nur teilweise dokumentiert
  • Überraschung: UI-Templates waren bereits vorhanden (nicht dokumentiert)
  • Ergänzt:
    • Test-Daten Script (test_data_resources.sql)
    • Migration Script (migrate_existing_licenses.sql)
  • Status: Vollständig implementiert

2. Database Migration Bug

  • Problem: Admin Panel zeigte "Internal Server Error"
  • Ursache: Resource Pool Tabellen fehlten in bestehender DB
  • Lösung: Separates Script create_resource_tables.sql erstellt
  • Status: Behoben

3. UI Cleanup

  • Änderung: Navigation aus Navbar entfernt
  • Effekt: Cleaner Look, Navigation nur über Dashboard
  • Status: Implementiert

4. Resource Report Bug

  • Problem: Einrückungsfehler in resources_report() Funktion
  • Lösung: Korrekte Einrückung wiederhergestellt
  • Status: Behoben

Hinweis:

  • Test-Daten-Scripts wurden nach erfolgreicher Anwendung gelöscht

2025-06-09: Bugfix - Resource Quarantäne Modal

Problem:

  • Quarantäne-Button funktionierte nicht
  • Modal öffnete sich nicht beim Klick

Ursache:

  • Bootstrap 5 vs Bootstrap 4 API-Inkompatibilität
  • Modal wurde mit Bootstrap 4 Syntax (modal.modal('show')) aufgerufen
  • jQuery wurde nach Bootstrap geladen

Lösung:

  1. JavaScript angepasst:

    • Von jQuery Modal-API zu nativer Bootstrap 5 Modal-API gewechselt
    • new bootstrap.Modal(element).show() statt $(element).modal('show')
  2. HTML-Struktur aktualisiert:

    • Modal-Close-Button: data-bs-dismiss="modal" statt data-dismiss="modal"
    • btn-close Klasse statt custom close button
    • Form-Klassen: mb-3 statt form-group, form-select statt form-control für Select
  3. Script-Reihenfolge korrigiert:

    • jQuery vor Bootstrap laden für korrekte Initialisierung

Geänderte Dateien:

  • v2_adminpanel/templates/resources.html
  • v2_adminpanel/templates/base.html

Status: Behoben

2025-06-09: Resource Pool UI Redesign

Ziel:

  • Komplettes Redesign des Resource Pool Managements für bessere Benutzerfreundlichkeit
  • Konsistentes Design mit dem Rest der Anwendung

Durchgeführte Änderungen:

  1. resources.html - Hauptübersicht:

    • Moderne Statistik-Karten mit Hover-Effekten
    • Farbcodierte Progress-Bars mit Tooltips
    • Verbesserte Tabelle mit Icons und Status-Badges
    • Live-Filter mit sofortiger Suche
    • Überarbeitete Quarantäne-Modal für Bootstrap 5
    • Responsive Design mit Grid-Layout
  2. add_resources.html - Ressourcen hinzufügen:

    • 3-Schritt Wizard-ähnliches Interface
    • Visueller Ressourcentyp-Selector mit Icons
    • Live-Validierung mit Echtzeit-Feedback
    • Statistik-Anzeige (Gültig/Duplikate/Ungültig)
    • Formatierte Beispiele mit Erklärungen
    • Verbesserte Fehlerbehandlung
  3. resource_history.html - Historie:

    • Zentrierte Resource-Anzeige mit großen Icons
    • Info-Grid Layout für Details
    • Modernisierte Timeline mit Hover-Effekten
    • Farbcodierte Action-Icons
    • Verbesserte Darstellung von Details
  4. resource_metrics.html - Metriken:

    • Dashboard-Style Metrik-Karten mit Icon-Badges
    • Modernisierte Charts mit besseren Farben
    • Performance-Tabellen mit Progress-Bars
    • Trend-Indikatoren für Performance
    • Responsives Grid-Layout

Design-Verbesserungen:

  • Konsistente Emoji-Icons für bessere visuelle Kommunikation
  • Einheitliche Farbgebung (Blau/Lila/Grün für Ressourcentypen)
  • Card-basiertes Layout mit Schatten und Hover-Effekten
  • Bootstrap 5 kompatible Komponenten
  • Verbesserte Typografie und Spacing

Technische Details:

  • Bootstrap 5 Modal-API statt jQuery
  • CSS Grid für responsive Layouts
  • Moderne Chart.js Konfiguration
  • Optimierte JavaScript-Validierung

Geänderte Dateien:

  • v2_adminpanel/templates/resources.html
  • v2_adminpanel/templates/add_resources.html
  • v2_adminpanel/templates/resource_history.html
  • v2_adminpanel/templates/resource_metrics.html

Status: Abgeschlossen

2025-06-09: Zusammenfassung der heutigen Arbeiten

Durchgeführte Aufgaben:

  1. Quarantäne-Funktion repariert:

    • Bootstrap 5 Modal-API implementiert
    • data-bs-dismiss statt data-dismiss
    • jQuery vor Bootstrap laden
  2. Resource Pool UI komplett überarbeitet:

    • Alle 4 Templates modernisiert (resources, add_resources, resource_history, resource_metrics)
    • Konsistentes Design mit Emoji-Icons
    • Einheitliche Farbgebung (Blau/Lila/Grün)
    • Bootstrap 5 kompatible Komponenten
    • Responsive Grid-Layouts

Aktuelle Projekt-Status:

  • Admin Panel voll funktionsfähig
  • Resource Pool Management mit modernem UI
  • PostgreSQL mit allen Tabellen
  • Nginx Reverse Proxy mit SSL
  • Lizenzserver noch nicht implementiert (nur Platzhalter)

Nächste Schritte:

  • Lizenzserver implementieren
  • API-Endpunkte für Lizenzvalidierung
  • Heartbeat-System für Sessions
  • Versionsprüfung implementieren
  1. v2_adminpanel/templates/base.html - Navigation entfernt
  2. v2_adminpanel/app.py - Resource Report Einrückung korrigiert
  3. JOURNAL.md - Alle Änderungen dokumentiert

Offene Hauptaufgabe:

  • License Server API - Noch komplett zu implementieren
    • /api/version - Versionscheck
    • /api/validate - Lizenzvalidierung
    • /api/heartbeat - Session-Management

2025-06-09: Resource Pool Internal Error behoben

Problem:

  • Internal Server Error beim Zugriff auf /resources
  • NameError: name 'datetime' is not defined in Template

Ursache:

  • Fehlende datetime und timedelta Objekte im Template-Kontext
  • Falsche Array-Indizes in resources.html für activity-Daten

Lösung:

  1. app.py (Zeile 2797-2798):

    • datetime=datetime und timedelta=timedelta zu render_template hinzugefügt
  2. resources.html (Zeile 484-490):

    • Array-Indizes korrigiert:
      • activity[0] = action
      • activity[1] = action_by
      • activity[2] = action_at
      • activity[3] = resource_type
      • activity[4] = resource_value
      • activity[5] = details

Geänderte Dateien:

  • v2_adminpanel/app.py
  • v2_adminpanel/templates/resources.html

Status: Behoben - Resource Pool funktioniert wieder einwandfrei

2025-06-09: Passwort-Änderung und 2FA implementiert

Ziel:

  • Benutzer können ihr Passwort ändern
  • Zwei-Faktor-Authentifizierung (2FA) mit TOTP
  • Komplett kostenlose Lösung ohne externe Services

Implementierte Features:

  1. Datenbank-Erweiterung:

    • Neue users Tabelle mit Passwort-Hash und 2FA-Feldern
    • Unterstützung für TOTP-Secrets und Backup-Codes
    • Migration von Environment-Variablen zu Datenbank
  2. Passwort-Management:

    • Sichere Passwort-Hashes mit bcrypt
    • Passwort-Änderung mit Verifikation des alten Passworts
    • Passwort-Stärke-Indikator im Frontend
  3. 2FA-Implementation:

    • TOTP-basierte 2FA (Google Authenticator, Authy kompatibel)
    • QR-Code-Generierung für einfaches Setup
    • 8 Backup-Codes für Notfallzugriff
    • Backup-Codes als Textdatei downloadbar
  4. Neue Routen:

    • /profile - Benutzerprofil mit Passwort und 2FA-Verwaltung
    • /verify-2fa - 2FA-Verifizierung beim Login
    • /profile/setup-2fa - 2FA-Einrichtung mit QR-Code
    • /profile/enable-2fa - 2FA-Aktivierung
    • /profile/disable-2fa - 2FA-Deaktivierung
    • /profile/change-password - Passwort ändern
  5. Sicherheits-Features:

    • Fallback zu Environment-Variablen für Rückwärtskompatibilität
    • Session-Management für 2FA-Verifizierung
    • Fehlgeschlagene 2FA-Versuche werden protokolliert
    • Verwendete Backup-Codes werden entfernt

Verwendete Libraries (alle kostenlos):

  • bcrypt - Passwort-Hashing
  • pyotp - TOTP-Generierung und Verifizierung
  • qrcode[pil] - QR-Code-Generierung

Migration:

  • Migrations-Script für existierende Benutzer erstellt und angewendet
  • Erhält bestehende Credentials aus Environment-Variablen
  • Erstellt Datenbank-Einträge mit gehashten Passwörtern

Geänderte Dateien:

  • v2_adminpanel/init.sql - Users-Tabelle hinzugefügt
  • v2_adminpanel/requirements.txt - Neue Dependencies
  • v2_adminpanel/app.py - Auth-Funktionen und neue Routen
  • v2_adminpanel/templates/base.html - Profil-Link hinzugefügt
  • v2_adminpanel/templates/profile.html - Profil-Seite (neu)
  • v2_adminpanel/templates/verify_2fa.html - 2FA-Verifizierung (neu)
  • v2_adminpanel/templates/setup_2fa.html - 2FA-Setup (neu)
  • v2_adminpanel/templates/backup_codes.html - Backup-Codes Anzeige (neu)

Status: Vollständig implementiert

2025-06-09: Internal Server Error behoben und UI-Design angepasst

2025-06-09: Journal-Bereinigung und Projekt-Cleanup

Durchgeführte Aufgaben:

  1. Überflüssige SQL-Dateien gelöscht:

    • Migrations-Scripts - Waren nur für einmalige Anwendung nötig
    • Test-Daten-Scripts - Nach Anwendung nicht mehr benötigt
  2. Journal aktualisiert:

    • Veraltete Todo-Liste korrigiert (viele Features bereits implementiert)
    • Passwörter aus Zugangsdaten entfernt (Sicherheit)
    • "Bekannte Probleme" auf aktuellen Stand gebracht
    • Neuer Abschnitt "Best Practices für Produktiv-Migration" hinzugefügt
  3. Status-Klärungen:

    • Alle Daten sind Testdaten (PoC-Phase)
    • 2FA ist implementiert und funktionsfähig
    • Resource Pool System ist vollständig implementiert
    • Port 8443 ist geschlossen (nur über Nginx erreichbar)

Noch zu erledigen:

  • Nginx Config anpassen (proxy_pass von https:// auf http://)
  • License Server API implementieren (Hauptaufgabe)

Problem:

  • Internal Server Error nach Login wegen fehlender users Tabelle
  • UI-Design der neuen 2FA-Seiten passte nicht zum Rest der Anwendung

Lösung:

  1. Datenbank-Fix:

    • Users-Tabelle wurde nicht automatisch erstellt
    • Manuell mit SQL-Script nachgeholt
    • Migration erfolgreich durchgeführt
    • Beide Admin-User (rac00n, w@rh@mm3r) migriert
  2. UI-Design Überarbeitung:

    • Profile-Seite im Dashboard-Stil mit Cards und Hover-Effekten
    • 2FA-Setup mit nummerierten Schritten und modernem Card-Design
    • Backup-Codes Seite mit Animation und verbessertem Layout
    • Konsistente Farbgebung und Icons
    • Verbesserte Benutzerführung mit visuellen Hinweisen

Design-Features:

  • Card-basiertes Layout mit Schatten-Effekten
  • Hover-Animationen für bessere Interaktivität
  • Farbcodierte Sicherheitsstatus-Anzeigen
  • Passwort-Stärke-Indikator mit visueller Rückmeldung
  • Responsive Design für alle Bildschirmgrößen
  • Print-optimiertes Layout für Backup-Codes

Hinweis:

  • Users-Tabelle wurde manuell erstellt (Script danach gelöscht)

2025-06-09: Journal-Bereinigung

Durchgeführte Änderungen:

  • Todo-Listen und Status-Informationen entfernt
  • Fokus auf chronologische Dokumentation der Änderungen
  • Veraltete Dateien und Scripts dokumentiert als gelöscht

2025-06-09: Nginx Config angepasst

Änderung:

  • proxy_pass für License Server von https://license-server:8443 auf http://license-server:8443 geändert
  • proxy_ssl_verify off entfernt (nicht mehr nötig bei HTTP)
  • WebSocket-Support hinzugefügt (für zukünftige Features)

Grund:

  • License Server läuft intern auf HTTP (wie Admin Panel)
  • SSL-Termination erfolgt nur am Nginx
  • Vereinfachte Konfiguration ohne doppelte SSL-Verschlüsselung

Hinweis: Docker-Container müssen neu gestartet werden, damit die Änderung wirksam wird:

docker-compose down
docker-compose up -d
  • v2_adminpanel/templates/profile.html - Komplett überarbeitet
  • v2_adminpanel/templates/setup_2fa.html - Neues Step-by-Step Design
  • v2_adminpanel/templates/backup_codes.html - Modernisiertes Layout

Status: Abgeschlossen - Login funktioniert, UI im konsistenten Design

2025-06-09: Lizenzschlüssel-Format geändert

Änderung:

  • Altes Format: AF-YYYYMMFT-XXXX-YYYY-ZZZZ (z.B. AF-202506F-V55Y-9DWE-GL5G)
  • Neues Format: AF-F-YYYYMM-XXXX-YYYY-ZZZZ (z.B. AF-F-202506-V55Y-9DWE-GL5G)

Vorteile:

  • Klarere Struktur mit separatem Typ-Indikator
  • Einfacher zu lesen und zu verstehen
  • Typ (F/T) sofort im zweiten Block erkennbar

Geänderte Dateien:

  • v2_adminpanel/app.py:
    • generate_license_key() - Generiert Keys im neuen Format
    • validate_license_key() - Validiert Keys mit neuem Regex-Pattern
  • v2_adminpanel/templates/index.html:
    • Placeholder und Pattern für Input-Feld angepasst
    • JavaScript charAt() Position für Typ-Prüfung korrigiert
  • v2_adminpanel/templates/batch_form.html:
    • Vorschau-Format für Batch-Generierung angepasst

Hinweis: Alte Keys im bisherigen Format bleiben ungültig. Bei Bedarf könnte eine Migration oder Dual-Support implementiert werden.

Status: Implementiert

2025-06-09: Datenbank-Migration der Lizenzschlüssel

Durchgeführt:

  • Alle bestehenden Lizenzschlüssel in der Datenbank auf das neue Format migriert
  • 18 Lizenzschlüssel erfolgreich konvertiert (16 Full, 2 Test)

Migration:

  • Von: AF-YYYYMMFT-XXXX-YYYY-ZZZZ
  • Nach: AF-F-YYYYMM-XXXX-YYYY-ZZZZ

Beispiele:

  • Alt: AF-202506F-V55Y-9DWE-GL5G
  • Neu: AF-F-202506-V55Y-9DWE-GL5G

Hinweis:

  • Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht

Status: Alle Lizenzschlüssel erfolgreich migriert

2025-06-09: Kombinierte Kunden-Lizenz-Ansicht implementiert

Problem:

  • Umständliche Navigation zwischen Kunden- und Lizenzseiten
  • Viel Hin-und-Her-Springen bei der Verwaltung
  • Kontext-Verlust beim Wechseln zwischen Ansichten

Lösung: Master-Detail View mit 2-Spalten Layout implementiert

Phase 1-3 abgeschlossen:

  1. Backend-Implementierung:

    • Neue Route /customers-licenses für kombinierte Ansicht
    • API-Endpoints für AJAX: /api/customer/<id>/licenses, /api/customer/<id>/quick-stats
    • API-Endpoint /api/license/<id>/quick-edit für Inline-Bearbeitung
    • Optimierte SQL-Queries mit JOIN für Performance
  2. Template-Erstellung:

    • Neues Template customers_licenses.html mit Master-Detail Layout
    • Links: Kundenliste (30%) mit Suchfeld
    • Rechts: Lizenzen des ausgewählten Kunden (70%)
    • Responsive Design (Mobile: untereinander)
    • JavaScript für dynamisches Laden ohne Seitenreload
    • Keyboard-Navigation (↑↓ für Kundenwechsel)
  3. Integration:

    • Dashboard: Neuer Button "Kunden & Lizenzen"
    • Customers-Seite: Link zur kombinierten Ansicht
    • Licenses-Seite: Link zur kombinierten Ansicht
    • Lizenz-Erstellung: Unterstützung für vorausgewählten Kunden
    • API /api/customers erweitert für Einzelabruf per ID

Features:

  • Live-Suche in Kundenliste
  • Quick-Actions: Copy License Key, Toggle Status
  • Modal für neue Lizenz direkt aus Kundenansicht
  • URL-Update ohne Reload für Bookmarking
  • Loading-States während AJAX-Calls
  • Visuelles Feedback (aktiver Kunde hervorgehoben)

Noch ausstehend:

  • Phase 4: Inline-Edit für Lizenzdetails
  • Phase 5: Erweiterte Error-Handling und Polish

Geänderte Dateien:

  • v2_adminpanel/app.py - Neue Routen und API-Endpoints
  • v2_adminpanel/templates/customers_licenses.html - Neues Template
  • v2_adminpanel/templates/dashboard.html - Neuer Button
  • v2_adminpanel/templates/customers.html - Link zur kombinierten Ansicht
  • v2_adminpanel/templates/licenses.html - Link zur kombinierten Ansicht
  • v2_adminpanel/templates/index.html - Unterstützung für preselected_customer_id

Status: Grundfunktionalität implementiert und funktionsfähig

2025-06-09: Kombinierte Ansicht - Fertigstellung

Abgeschlossen:

  • Phase 1-3 der kombinierten Kunden-Lizenz-Ansicht vollständig implementiert
  • Master-Detail Layout funktioniert einwandfrei
  • AJAX-basiertes Laden ohne Seitenreload
  • Keyboard-Navigation mit Pfeiltasten
  • Quick-Actions für Copy und Toggle Status
  • Integration in alle relevanten Seiten

Verbesserung gegenüber vorher:

  • Kein Hin-und-Her-Springen mehr zwischen Seiten
  • Kontext bleibt erhalten beim Arbeiten mit Kunden
  • Schnellere Navigation und bessere Übersicht
  • Deutlich verbesserte User Experience

Optional für später (Phase 4-5):

  • Inline-Edit für weitere Felder
  • Erweiterte Quick-Actions
  • Session-basierte Filter-Persistenz

Die Hauptproblematik der umständlichen Navigation ist damit gelöst!

2025-06-09: Test-Flag für Lizenzen implementiert

Ziel:

  • Klare Trennung zwischen Testdaten und echten Produktivdaten
  • Testdaten sollen von der Software ignoriert werden können
  • Bessere Übersicht im Admin Panel

Durchgeführte Änderungen:

  1. Datenbank-Schema (init.sql):

    • Neue Spalte is_test BOOLEAN DEFAULT FALSE zur licenses Tabelle hinzugefügt
    • Migration für bestehende Daten: Alle werden als is_test = TRUE markiert
    • Index idx_licenses_is_test für bessere Performance
  2. Backend (app.py):

    • Dashboard-Queries filtern Testdaten mit WHERE is_test = FALSE aus
    • Lizenz-Erstellung: Neues Checkbox-Feld für Test-Markierung
    • Lizenz-Bearbeitung: Test-Status kann geändert werden
    • Export: Optional mit/ohne Testdaten (?include_test=true)
    • Bulk-Operationen: Nur auf Live-Daten anwendbar
    • Neue Filter in Lizenzliste: "🧪 Testdaten" und "🚀 Live-Daten"
  3. Frontend Templates:

    • index.html: Checkbox "Als Testdaten markieren" bei Lizenzerstellung
    • edit_license.html: Checkbox zum Ändern des Test-Status
    • licenses.html: Badge 🧪 für Testdaten, neue Filteroptionen
    • dashboard.html: Info-Box zeigt Anzahl der Testdaten
    • batch_form.html: Option für Batch-Test-Lizenzen
  4. Audit-Log Integration:

    • is_test Feld wird bei CREATE/UPDATE geloggt
    • Nachvollziehbarkeit von Test/Live-Status-Änderungen

Technische Details:

  • Testdaten werden in allen Statistiken ausgefiltert
  • License Server API wird Lizenzen mit is_test = TRUE ignorieren
  • Resource Pool bleibt unverändert (kann Test- und Live-Ressourcen verwalten)

Migration der bestehenden Daten:

UPDATE licenses SET is_test = TRUE;  -- Alle aktuellen Daten sind Testdaten

Status: Implementiert

2025-06-09: Test-Flag für Kunden und Resource Pools erweitert

Ziel:

  • Konsistentes Test-Daten-Management über alle Entitäten
  • Kunden und Resource Pools können ebenfalls als Testdaten markiert werden
  • Automatische Verknüpfung: Test-Kunde → Test-Lizenzen → Test-Ressourcen

Durchgeführte Änderungen:

  1. Datenbank-Schema erweitert:

    • customers.is_test BOOLEAN DEFAULT FALSE hinzugefügt
    • resource_pools.is_test BOOLEAN DEFAULT FALSE hinzugefügt
    • Indizes für bessere Performance erstellt
    • Migrations in init.sql integriert
  2. Backend (app.py) - Erweiterte Logik:

    • Dashboard: Separate Zähler für Test-Kunden und Test-Ressourcen
    • Kunde-Erstellung: Erbt Test-Status von Lizenz
    • Test-Kunde erzwingt Test-Lizenzen
    • Resource-Zuweisung: Test-Lizenzen bekommen nur Test-Ressourcen
    • Customer-Management mit is_test Filter
  3. Frontend Updates:

    • customers.html: 🧪 Badge für Test-Kunden
    • edit_customer.html: Checkbox für Test-Status
    • dashboard.html: Erweiterte Test-Statistik (Lizenzen, Kunden, Ressourcen)
  4. Geschäftslogik:

    • Wenn neuer Kunde bei Test-Lizenz erstellt wird → automatisch Test-Kunde
    • Wenn Test-Kunde gewählt wird → Lizenz automatisch als Test markiert
    • Resource Pool Allocation prüft Test-Status für korrekte Zuweisung

Migration der bestehenden Daten:

UPDATE customers SET is_test = TRUE;       -- 5 Kunden
UPDATE resource_pools SET is_test = TRUE;  -- 20 Ressourcen

Technische Details:

  • Konsistente Test/Live-Trennung über alle Ebenen
  • Dashboard-Statistiken zeigen nur Live-Daten
  • Test-Ressourcen werden nur Test-Lizenzen zugewiesen
  • Alle bestehenden Daten sind jetzt als Test markiert

Status: Vollständig implementiert

2025-06-09 (17:20 - 18:13): Kunden-Lizenz-Verwaltung konsolidiert

Problem:

  • Kombinierte Ansicht /customers-licenses hatte Formatierungs- und Funktionsprobleme
  • Kunden wurden nicht angezeigt
  • Bootstrap Icons fehlten
  • JavaScript-Fehler beim Modal
  • Inkonsistentes Design im Vergleich zu anderen Seiten
  • Testkunden-Filter wurde beim Navigieren nicht beibehalten

Durchgeführte Änderungen:

  1. Frontend-Fixes (base.html):

    • Bootstrap Icons CSS hinzugefügt: bootstrap-icons@1.11.3/font/bootstrap-icons.min.css
    • Bootstrap JavaScript Bundle bereits vorhanden, Reihenfolge optimiert
  2. customers_licenses.html komplett überarbeitet:

    • Container-Klasse von container-fluid auf container py-5 geändert
    • Emojis und Button-Styling vereinheitlicht (👥 Kunden & Lizenzen)
    • Export-Dropdown wie in anderen Ansichten implementiert
    • Card-Styling mit Schatten für einheitliches Design
    • Checkbox "Testkunden anzeigen" mit Status-Beibehaltung
    • JavaScript-Funktionen korrigiert:
      • copyToClipboard mit event.currentTarget
      • showNewLicenseModal mit Bootstrap Modal
      • Header-Update beim AJAX-Kundenwechsel
    • URL-Parameter show_test wird überall beibehalten
  3. Backend-Anpassungen (app.py):

    • customers_licenses Route: Optional Testkunden anzeigen mit show_test Parameter
    • Redirects von /customers und /licenses auf /customers-licenses implementiert
    • Alte Route-Funktionen entfernt (kein toter Code mehr)
    • edit_license und edit_customer: Redirects behalten show_test Parameter bei
    • Dashboard-Links zeigen jetzt auf kombinierte Ansicht
  4. Navigation optimiert:

    • Dashboard: Klick auf Kunden/Lizenzen-Statistik führt zur kombinierten Ansicht
    • Alle Edit-Links behalten den show_test Parameter bei
    • Konsistente User Experience beim Navigieren

Technische Details:

  • AJAX-Loading für dynamisches Laden der Lizenzen
  • Keyboard-Navigation (↑↓) für Kundenliste
  • Responsive Design mit Bootstrap Grid
  • Modal-Dialoge für Bestätigungen
  • Live-Suche in der Kundenliste

Resultat:

  • Einheitliches Design mit anderen Admin-Panel-Seiten
  • Alle Funktionen arbeiten korrekt
  • Testkunden-Filter bleibt erhalten
  • Keine redundanten Views mehr
  • Zentrale Verwaltung für Kunden und Lizenzen

Status: Vollständig implementiert

2025-06-09: Test-Daten Checkbox Persistenz implementiert

Problem:

  • Die "Testkunden anzeigen" Checkbox in /customers-licenses verlor ihren Status beim Navigieren zwischen Seiten
  • Wenn Benutzer zu anderen Seiten (Resources, Audit Log, etc.) wechselten und zurückkehrten, war die Checkbox wieder deaktiviert
  • Benutzer mussten die Checkbox jedes Mal neu aktivieren, was umständlich war

Lösung:

  • Globale JavaScript-Funktion preserveShowTestParameter() in base.html implementiert
  • Die Funktion prüft beim Laden jeder Seite, ob show_test=true in der URL ist
  • Wenn ja, wird dieser Parameter automatisch an alle internen Links angehängt
  • Backend-Route /create wurde angepasst, um den Parameter bei Redirects beizubehalten

Technische Details:

  1. base.html - JavaScript-Funktion hinzugefügt:

    • Läuft beim DOMContentLoaded Event
    • Findet alle Links die mit "/" beginnen
    • Fügt show_test=true Parameter hinzu wenn nicht bereits vorhanden
    • Überspringt Fragment-Links (#) und Links die bereits den Parameter haben
  2. app.py - Route-Anpassung:

    • /create Route behält jetzt show_test Parameter bei Redirects bei
    • Andere Routen (edit_license, edit_customer) behalten Parameter bereits bei

Vorteile:

  • Konsistente User Experience beim Navigieren
  • Keine manuelle Anpassung aller Links nötig
  • Funktioniert automatisch für alle zukünftigen Links
  • Minimaler Code-Overhead

Geänderte Dateien:

  • v2_adminpanel/templates/base.html
  • v2_adminpanel/app.py

Status: Vollständig implementiert

2025-06-09: Bearbeiten-Button Fehler behoben

Problem:

  • Der "Bearbeiten" Button neben dem Kundennamen in der /customers-licenses Ansicht verursachte einen Internal Server Error
  • Die URL-Konstruktion war fehlerhaft wenn kein show_test Parameter vorhanden war
  • Die edit_customer.html Template hatte falsche Array-Indizes und veraltete Links

Ursache:

  1. Die href-Attribute wurden falsch konstruiert:

    • Alt: /customer/edit/ID{% if show_test %}?ref=customers-licenses&show_test=true{% endif %}
    • Problem: Ohne show_test fehlte das ?ref=customers-licenses komplett
  2. Die SQL-Abfrage in edit_customer() holte nur 4 Felder, aber das Template erwartete 5:

    • Query: SELECT id, name, email, is_test
    • Template erwartete: customer[3] = created_at und customer[4] = is_test
  3. Veraltete Links zu /customers statt /customers-licenses

Lösung:

  1. URL-Konstruktion korrigiert in beiden Fällen:

    • Neu: /customer/edit/ID?ref=customers-licenses{% if show_test %}&show_test=true{% endif %}
  2. SQL-Query erweitert um created_at:

    • Neu: SELECT id, name, email, created_at, is_test
  3. Template-Indizes korrigiert:

    • is_test Checkbox nutzt jetzt customer[4]
  4. Navigation-Links aktualisiert:

    • Alle Links zeigen jetzt auf /customers-licenses mit show_test Parameter

Geänderte Dateien:

  • v2_adminpanel/templates/customers_licenses.html (Zeilen 103 und 295)
  • v2_adminpanel/app.py (edit_customer Route)
  • v2_adminpanel/templates/edit_customer.html

Status: Behoben

2025-06-09: Unnötigen Lizenz-Erstellungs-Popup entfernt

Änderung:

  • Der Bestätigungs-Popup "Möchten Sie eine neue Lizenz für KUNDENNAME erstellen?" wurde entfernt
  • Klick auf "Neue Lizenz" Button führt jetzt direkt zur Lizenzerstellung

Technische Details:

  • Modal-HTML komplett entfernt
  • showNewLicenseModal() Funktion vereinfacht - navigiert jetzt direkt zu /create?customer_id=X
  • URL-Parameter (wie show_test) werden dabei beibehalten

Vorteile:

  • Ein Klick weniger für Benutzer
  • Schnellerer Workflow
  • Weniger Code zu warten

Geänderte Dateien:

  • v2_adminpanel/templates/customers_licenses.html

Status: Implementiert

2025-06-09: Testkunden-Checkbox bleibt jetzt bei Lizenz/Kunden-Bearbeitung erhalten

Problem:

  • Bei "Lizenz bearbeiten" ging der "Testkunden anzeigen" Haken verloren beim Zurückkehren
  • Die Navigation-Links in edit_license.html zeigten auf /licenses statt /customers-licenses
  • Der show_test Parameter wurde nur über den unsicheren Referrer übertragen

Lösung:

  1. Navigation-Links korrigiert:

    • Alle Links zeigen jetzt auf /customers-licenses mit show_test Parameter
    • Betrifft: "Zurück zur Übersicht" und "Abbrechen" Buttons
  2. Hidden Form Field hinzugefügt:

    • Sowohl in edit_license.html als auch edit_customer.html
    • Überträgt den show_test Parameter sicher beim POST
  3. Route-Logik verbessert:

    • Parameter wird aus Form-Daten ODER GET-Parametern gelesen
    • Nicht mehr auf unsicheren Referrer angewiesen
    • Funktioniert sowohl bei Speichern als auch Abbrechen

Technische Details:

  • Templates prüfen request.args.get('show_test') für Navigation
  • Hidden Input: <input type="hidden" name="show_test" value="true">
  • Routes: show_test = request.form.get('show_test') or request.args.get('show_test')

Geänderte Dateien:

  • v2_adminpanel/templates/edit_license.html
  • v2_adminpanel/templates/edit_customer.html
  • v2_adminpanel/app.py (edit_license und edit_customer Routen)

Status: Vollständig implementiert

2025-06-09 22:02: Konsistente Sortierung bei Status-Toggle

Problem:

  • Beim Klicken auf den An/Aus-Knopf (Status-Toggle) in der Kunden & Lizenzen Ansicht änderte sich die Reihenfolge der Lizenzen
  • Dies war verwirrend für Benutzer, da die Position der gerade bearbeiteten Lizenz springen konnte

Ursache:

  • Die Sortierung ORDER BY l.created_at DESC war nicht stabil genug
  • Bei gleichem Erstellungszeitpunkt konnte die Datenbank die Reihenfolge inkonsistent zurückgeben

Lösung:

  • Sekundäres Sortierkriterium hinzugefügt: ORDER BY l.created_at DESC, l.id DESC
  • Dies stellt sicher, dass bei gleichem Erstellungsdatum nach ID sortiert wird
  • Die Reihenfolge bleibt jetzt konsistent, auch nach Status-Änderungen

Geänderte Dateien:

  • v2_adminpanel/app.py:
    • Zeile 2278: /customers-licenses Route
    • Zeile 2319: /api/customer/<int:customer_id>/licenses API-Route

2025-06-10 00:01: Verbesserte Integration zwischen Kunden & Lizenzen und Resource Pool

Problem:

  • Umständliche Navigation zwischen Kunden & Lizenzen und Resource Pool Bereichen
  • Keine direkte Verbindung zwischen beiden Ansichten
  • Benutzer mussten ständig zwischen verschiedenen Seiten hin- und herspringen

Implementierte Lösung - 5 Phasen:

  1. Phase 1: Ressourcen-Details in Kunden & Lizenzen Ansicht

    • API /api/customer/{id}/licenses erweitert um konkrete Ressourcen-Informationen
    • Neue API /api/license/{id}/resources für detaillierte Ressourcen einer Lizenz
    • Anzeige der zugewiesenen Ressourcen mit Info-Buttons und Modal-Dialogen
    • Klickbare Links zu Ressourcen-Details im Resource Pool
  2. Phase 2: Quick-Actions für Ressourcenverwaltung

    • "Ressourcen verwalten" Button (Zahnrad-Icon) bei jeder Lizenz
    • Modal mit Übersicht aller zugewiesenen Ressourcen
    • Vorbereitung für Quarantäne-Funktionen und Ressourcen-Austausch
  3. Phase 3: Ressourcen-Preview bei Lizenzerstellung

    • Live-Anzeige verfügbarer Ressourcen beim Ändern der Anzahl
    • Erweiterte Verfügbarkeitsanzeige mit Badges (OK/Niedrig/Kritisch)
    • Warnungen bei niedrigem Bestand mit visuellen Hinweisen
    • Fortschrittsbalken zur Visualisierung der Verfügbarkeit
  4. Phase 4: Dashboard-Integration

    • Resource Pool Widget mit erweiterten Links
    • Kritische Warnungen bei < 50 Ressourcen mit "Auffüllen" Button
    • Direkte Navigation zu gefilterten Ansichten (nach Typ/Status)
    • Verbesserte visuelle Darstellung mit Tooltips
  5. Phase 5: Bidirektionale Navigation

    • Von Resource Pool: Links zu Kunden/Lizenzen bei zugewiesenen Ressourcen
    • "Zurück zu Kunden" Button wenn von Kunden & Lizenzen kommend
    • Navigation-Links im Dashboard für schnellen Zugriff
    • SQL-Query erweitert um customer_id für direkte Verlinkung

Technische Details:

  • JavaScript-Funktionen für Modal-Dialoge und Ressourcen-Details
  • Erweiterte SQL-Queries mit JOINs für Ressourcen-Informationen
  • Bootstrap 5 Tooltips und Modals für bessere UX
  • Globale Variable currentLicenses für Caching der Lizenzdaten

Geänderte Dateien:

  • v2_adminpanel/app.py - Neue APIs und erweiterte Queries
  • v2_adminpanel/templates/customers_licenses.html - Ressourcen-Details und Modals
  • v2_adminpanel/templates/index.html - Erweiterte Verfügbarkeitsanzeige
  • v2_adminpanel/templates/dashboard.html - Verbesserte Resource Pool Integration
  • v2_adminpanel/templates/resources.html - Bidirektionale Navigation

Status: Alle 5 Phasen erfolgreich implementiert

2025-06-10 00:15: IP-Adressen-Erfassung hinter Reverse Proxy korrigiert

Problem:

  • Flask-App erfasste nur die Docker-interne IP-Adresse von Nginx (172.19.0.5)
  • Echte Client-IPs wurden nicht in Audit-Logs und Login-Attempts gespeichert
  • Nginx setzte die Header korrekt, aber Flask las sie nicht aus

Ursache:

  • Flask verwendet standardmäßig nur request.remote_addr
  • Dies gibt bei einem Reverse Proxy nur die Proxy-IP zurück
  • Die Header X-Real-IP und X-Forwarded-For wurden ignoriert

Lösung:

  1. ProxyFix Middleware hinzugefügt für korrekte Header-Verarbeitung
  2. get_client_ip() Funktion angepasst:
    • Prüft zuerst X-Real-IP Header
    • Dann X-Forwarded-For Header (nimmt erste IP bei mehreren)
    • Fallback auf request.remote_addr
  3. Debug-Logging für IP-Erfassung hinzugefügt
  4. Alle request.remote_addr Aufrufe durch get_client_ip() ersetzt

Technische Details:

# ProxyFix für korrekte IP-Adressen
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)

# Verbesserte IP-Erfassung
def get_client_ip():
    if request.headers.get('X-Real-IP'):
        return request.headers.get('X-Real-IP')
    elif request.headers.get('X-Forwarded-For'):
        return request.headers.get('X-Forwarded-For').split(',')[0].strip()
    else:
        return request.remote_addr

Geänderte Dateien:

  • v2_adminpanel/app.py - ProxyFix und verbesserte IP-Erfassung

Status: Implementiert - Neue Aktionen erfassen jetzt echte Client-IPs

2025-06-10 00:30: Docker ENV Legacy-Format Warnungen behoben

Problem:

  • Docker Build zeigte Warnungen: "LegacyKeyValueFormat: ENV key=value should be used"
  • Veraltetes Format ENV KEY VALUE wurde in Dockerfiles verwendet

Lösung:

  • Alle ENV-Anweisungen auf neues Format ENV KEY=VALUE umgestellt
  • Betraf hauptsächlich v2_postgres/Dockerfile mit 3 ENV-Zeilen

Geänderte Dateien:

  • v2_postgres/Dockerfile - ENV-Format modernisiert

Beispiel der Änderung:

# 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