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