Dateien
Hetzner-Backup/JOURNAL.md
2025-06-09 04:38:35 +02:00

2161 Zeilen
80 KiB
Markdown

# v2-Docker Projekt Journal
## 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 (rac00n, w@rh@mm3r)
- **Ziel**: PoC für spätere VPS-Migration
---
## Aktueller Stand (2025-06-07)
### ✅ Implementiert
1. **Docker-Infrastruktur**
- docker-compose.yaml mit 4 Services (PostgreSQL, Admin Panel, License Server, Nginx)
- Interne Bridge-Netzwerkkommunikation
- Resource Limits konfiguriert (2 CPUs, 4GB RAM pro Service)
- Nginx Reverse Proxy für SSL-Termination
2. **PostgreSQL Datenbank**
- Tabellen: customers, licenses, sessions, audit_log, backup_history
- UTF-8 Support mit deutscher Locale (de_DE.UTF-8)
- Init-Script mit vollständigem Schema
- Persistente Datenspeicherung
3. **Admin Panel (Vollständig)**
- Flask-Anwendung mit Session-Management
- Login-Funktionalität für 2 Admin-User (rac00n, w@rh@mm3r)
- Dashboard mit Statistiken und Widgets
- Lizenz-CRUD (Create, Read, Update, Delete)
- Kunden-CRUD mit Lizenzzuordnung
- Session-Tracking und -Verwaltung
- Audit-Log für alle Aktionen
- Export-Funktion (CSV/Excel)
- Backup-System mit Verschlüsselung
- UTF-8 Support für deutsche Umlaute
- Suche und Filter mit Pagination
4. **Internet-Zugriff**
- Nginx Reverse Proxy mit SSL-Termination
- IONOS SSL-Zertifikate mit vollständiger Certificate Chain
- Subdomain-Routing funktioniert (admin-panel-undso, api-software-undso)
- DynDNS und Port-Forwarding konfiguriert
- Feste IP-Adresse (192.168.178.88)
### ❌ Noch nicht implementiert
1. **License Server API**
- Nur Platzhalter-Container vorhanden
- Keine API-Endpunkte (/api/version, /api/validate, /api/heartbeat)
- Keine Lizenzvalidierung
- Kein aktives Session-Management
---
## Offene Aufgaben (Priorität)
### 🔴 Hoch (Basis-Funktionalität)
1. **License Server API implementieren**
- `/api/version` - Versionscheck
- `/api/validate` - Lizenzvalidierung
- `/api/heartbeat` - Session-Management
2. **Reverse Proxy Setup** (Nginx/Traefik) für Subdomain-Routing
3. **SSL-Zertifikate** (Let's Encrypt) für beide Subdomains
4. **Session-Management** (nur eine aktive Session pro Lizenz)
### 🟡 Mittel (Erweiterte Features)
1. **Erweiterte Sicherheit**
- Rate-Limiting für Login-Versuche (Brute-Force-Schutz)
- 2-Faktor-Authentifizierung (2FA)
- Session-Timeout konfigurierbar
- IP-Whitelist für Admin-Zugriff
- Passwort-Richtlinien (Komplexität, Ablauf)
2. **Lizenz-Verwaltung Erweiterungen**
- Bulk-Import von Lizenzen (CSV/Excel Upload)
- Lizenz-Templates für schnelle Erstellung
- Lizenz-Verlängerung mit einem Klick
- Lizenz-Historie (wer hatte welche Lizenz wann)
- Lizenz-Gruppen/Pakete
- Automatische Lizenzverlängerung
3. **Benachrichtigungen**
- E-Mail bei ablaufenden Lizenzen (Struktur bereits vorbereitet)
- Dashboard-Benachrichtigungen (Toast/Pop-ups)
- Webhook-Support für externe Systeme
- SMS-Benachrichtigungen
- Slack/Teams Integration
4. **API für Automatisierung**
- REST API für Admin-Funktionen
- API-Keys für programmatischen Zugriff
- Swagger/OpenAPI Dokumentation
- Rate Limiting für API
- Webhook Events
### 🟢 Niedrig (Nice-to-have)
1. **Benutzeroberfläche**
- Dark Mode Toggle
- Mobile-optimierte Ansicht (Responsive)
- Mehrsprachigkeit (Deutsch/Englisch)
- Anpassbare Dashboard-Widgets
- Drag & Drop Dashboard
- Keyboard Shortcuts
2. **Erweiterte Statistiken**
- Grafische Auswertungen (Chart.js/D3.js)
- Umsatz-Statistiken
- Nutzungsstatistiken pro Kunde
- Lizenz-Verlaufsdiagramme
- Geografische Verteilung
- Vorhersage-Analysen
3. **Weitere Features**
- Rechnungserstellung
- Mehrmandantenfähigkeit
- Benutzerverwaltung (verschiedene Admin-Rollen)
- Lizenz-Aktivierung per E-Mail
- QR-Code für Lizenzschlüssel
- Dokumentenverwaltung pro Kunde
- JWT-Authentifizierung für API
- Docker Resource-Optimierung
- VPS-Migrationsdokumentation
---
## Bekannte Probleme
1. PostgreSQL Volume-Pfad wurde von absolutem Windows-Pfad auf Docker Volume geändert
2. Duplizierte .env Datei in templates/ Ordner
3. Credentials im Klartext in .env Dateien
4. Selbstsignierte SSL-Zertifikate verursachen Browser-Warnungen
---
## Nächste Schritte
1. License Server API entwickeln mit Endpunkten:
- `/api/version` - Versionscheck
- `/api/validate` - Lizenzvalidierung
- `/api/heartbeat` - Session-Management
2. Mobile Optimizations für Admin Panel
3. Weitere Sicherheitsfeatures
4. Performance-Optimierungen
---
## Änderungsprotokoll
### 2025-06-06 - Journal erstellt
- Initialer Projektstand dokumentiert
- Aufgabenliste priorisiert
- Technische Anforderungen festgehalten
### 2025-06-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-06-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-06-06 - Lizenz bearbeiten/löschen implementiert
- Neue Routen für Bearbeiten und Löschen von Lizenzen
- Bearbeitungsformular mit vorausgefüllten Werten
- Aktiv/Inaktiv-Status kann geändert werden
- Lösch-Bestätigung per JavaScript confirm()
- Kunde kann nicht geändert werden (nur Lizenzdetails)
**Neue Features:**
- `/license/edit/<id>` - Bearbeitungsformular
- `/license/delete/<id>` - Lizenz löschen (POST)
- Aktionen-Spalte in der Lizenzübersicht
- Buttons für Bearbeiten und Löschen
- Checkbox für Aktiv-Status
**Geänderte/Neue Dateien:**
- v2_adminpanel/app.py (edit_license und delete_license Routen)
- v2_adminpanel/templates/licenses.html (Aktionen-Spalte hinzugefügt)
- v2_adminpanel/templates/edit_license.html (neu erstellt)
**Sicherheit:**
- Login-Required für alle Aktionen
- POST-only für Löschvorgänge
- Bestätigungsdialog vor dem Löschen
### 2025-06-06 - Kundenverwaltung implementiert
- Komplette CRUD-Funktionalität für Kunden
- Übersicht zeigt Anzahl aktiver/gesamter Lizenzen pro Kunde
- Kunden können nur gelöscht werden, wenn sie keine Lizenzen haben
- Bearbeitungsseite zeigt alle Lizenzen des Kunden
**Neue Features:**
- `/customers` - Kundenübersicht mit Statistiken
- `/customer/edit/<id>` - Kunde bearbeiten (Name, E-Mail)
- `/customer/delete/<id>` - Kunde löschen (nur ohne Lizenzen)
- Navigation zwischen allen drei Hauptbereichen
- Anzeige der Kundenlizenzen beim Bearbeiten
**Geänderte/Neue Dateien:**
- v2_adminpanel/app.py (customers, edit_customer, delete_customer Routen)
- v2_adminpanel/templates/customers.html (neu erstellt)
- v2_adminpanel/templates/edit_customer.html (neu erstellt)
- v2_adminpanel/templates/index.html (Navigation erweitert)
- v2_adminpanel/templates/licenses.html (Navigation erweitert)
**Besonderheiten:**
- Lösch-Button ist deaktiviert, wenn Kunde Lizenzen hat
- Aktive Lizenzen werden separat gezählt (nicht abgelaufen + aktiv)
- UTF-8 Support für Kundennamen mit Umlauten
### 2025-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-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 / 1248163264
- Benutzer 2: w@rh@mm3r / Warhammer123!
**Status:**
- ✅ Admin-Panel extern erreichbar ohne SSL-Warnungen
- ✅ Reverse Proxy funktioniert
- ✅ SSL-Zertifikate korrekt konfiguriert
- ✅ Netzwerk-Setup abgeschlossen
### 2025-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-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-06-07 - Batch-Lizenzgenerierung implementiert
- Mehrere Lizenzen auf einmal für einen Kunden erstellen
**Implementierte Features:**
1. **Batch-Formular (/batch):**
- Kunde und E-Mail eingeben
- Anzahl der Lizenzen (1-100)
- Lizenztyp (Vollversion/Testversion)
- Gültigkeitszeitraum für alle Lizenzen
- Vorschau-Modal zeigt Key-Format
- Standard-Datum-Einstellungen (heute + 1 Jahr)
2. **Backend-Verarbeitung:**
- Route `/batch` für GET (Formular) und POST (Generierung)
- Generiert die angegebene Anzahl eindeutiger Keys
- Speichert alle in einer Transaktion
- Kunde wird automatisch angelegt (falls nicht vorhanden)
- ON CONFLICT für existierende Kunden
- Audit-Log-Eintrag mit CREATE_BATCH Aktion
3. **Ergebnis-Seite:**
- Zeigt alle generierten Lizenzen in Tabellenform
- Kundeninformationen und Gültigkeitszeitraum
- Einzelne Keys können kopiert werden (📋 Button)
- Alle Keys auf einmal kopieren
- Druckfunktion für physische Ausgabe
- Link zur Lizenzübersicht mit Kundenfilter
4. **Export-Funktionalität:**
- Route `/batch/export` für CSV-Download
- Speichert Batch-Daten in Session für Export
- CSV mit UTF-8 BOM für Excel-Kompatibilität
- Enthält Kundeninfo, Generierungsdatum und alle Keys
- Format: Nr;Lizenzschlüssel;Typ
- Dateiname: batch_licenses_KUNDE_TIMESTAMP.csv
5. **Integration:**
- Batch-Button in Navigation (Dashboard, Einzellizenz-Seite)
- CREATE_BATCH Aktion im Audit-Log (Farbe: #6610f2)
- Session-basierte Export-Daten
- Flash-Messages für Feedback
**Sicherheit:**
- Limit von 100 Lizenzen pro Batch
- Login-Required für alle Routen
- Transaktionale Datenbank-Operationen
- Validierung der Eingaben
**Beispiel-Workflow:**
1. Admin geht zu `/batch`
2. Gibt Kunde "Firma GmbH", Anzahl "25", Typ "Vollversion" ein
3. System generiert 25 eindeutige Keys
4. Ergebnis-Seite zeigt alle Keys
5. Admin kann CSV exportieren oder Keys kopieren
6. Kunde erhält die Lizenzen
**Status:**
- ✅ Batch-Formular vollständig implementiert
- ✅ Backend-Generierung mit Transaktionen
- ✅ Export als CSV
- ✅ Copy-to-Clipboard Funktionalität
- ✅ Audit-Log-Integration
- ✅ Navigation aktualisiert
## 2025-06-06: Implementierung Searchable Dropdown für Kundenauswahl
**Problem:**
- Bei der Lizenzerstellung wurde immer ein neuer Kunde angelegt
- Keine Möglichkeit, Lizenzen für bestehende Kunden zu erstellen
- Bei vielen Kunden wäre ein normales Dropdown unübersichtlich
**Lösung:**
1. **Select2 Library** für searchable Dropdown integriert
2. **API-Endpoint `/api/customers`** für die Kundensuche erstellt
3. **Frontend angepasst:**
- Searchable Dropdown mit Live-Suche
- Option "Neuer Kunde" im Dropdown
- Eingabefelder erscheinen nur bei "Neuer Kunde"
4. **Backend-Logik verbessert:**
- Prüfung ob neuer oder bestehender Kunde
- E-Mail-Duplikatsprüfung vor Kundenerstellung
- Separate Audit-Logs für Kunde und Lizenz
5. **Datenbank:**
- UNIQUE Constraint auf E-Mail-Spalte hinzugefügt
**Änderungen:**
- `app.py`: Neuer API-Endpoint `/api/customers`, angepasste Routes `/create` und `/batch`
- `base.html`: Select2 CSS und JS eingebunden
- `index.html`: Kundenauswahl mit Select2 implementiert
- `batch_form.html`: Kundenauswahl mit Select2 implementiert
- `init.sql`: UNIQUE Constraint für E-Mail
**Status:**
- ✅ API-Endpoint funktioniert mit Pagination
- ✅ Select2 Dropdown mit Suchfunktion
- ✅ Neue/bestehende Kunden können ausgewählt werden
- ✅ E-Mail-Duplikate werden verhindert
- ✅ Sowohl Einzellizenz als auch Batch unterstützt
## 2025-06-06: Automatische Ablaufdatum-Berechnung
**Problem:**
- Manuelles Eingeben von Start- und Enddatum war umständlich
- Fehleranfällig bei der Datumseingabe
- Nicht intuitiv für Standard-Laufzeiten
**Lösung:**
1. **Frontend-Änderungen:**
- Startdatum + Laufzeit (Zahl) + Einheit (Tage/Monate/Jahre)
- Ablaufdatum wird automatisch berechnet und angezeigt (read-only)
- Standard: 1 Jahr Laufzeit voreingestellt
2. **Backend-Validierung:**
- Server-seitige Berechnung zur Sicherheit
- Verwendung von `python-dateutil` für korrekte Monats-/Jahresberechnungen
3. **Benutzerfreundlichkeit:**
- Sofortige Neuberechnung bei Änderungen
- Visuelle Hervorhebung des berechneten Datums
**Änderungen:**
- `index.html`: Laufzeit-Eingabe statt Ablaufdatum
- `batch_form.html`: Laufzeit-Eingabe statt Ablaufdatum
- `app.py`: Datum-Berechnung in `/create` und `/batch` Routes
- `requirements.txt`: `python-dateutil` hinzugefügt
**Status:**
- ✅ Automatische Berechnung funktioniert
- ✅ Frontend zeigt berechnetes Datum sofort an
- ✅ Backend validiert die Berechnung
- ✅ Standardwert (1 Jahr) voreingestellt
## 2025-06-06: Bugfix - created_at für licenses Tabelle
**Problem:**
- Batch-Generierung schlug fehl mit "Fehler bei der Batch-Generierung!"
- INSERT Statement versuchte `created_at` zu setzen, aber Spalte existierte nicht
- Inkonsistenz: Einzellizenzen hatten kein created_at, Batch-Lizenzen versuchten es zu setzen
**Lösung:**
1. **Datenbank-Schema erweitert:**
- `created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP` zur licenses Tabelle hinzugefügt
- Migration für bestehende Datenbanken implementiert
- Konsistent mit customers Tabelle
2. **Code bereinigt:**
- Explizites `created_at` aus Batch-INSERT entfernt
- Datenbank setzt nun automatisch den Zeitstempel bei ALLEN Lizenzen
**Änderungen:**
- `init.sql`: created_at Spalte zur licenses Tabelle mit DEFAULT-Wert
- `init.sql`: Migration für bestehende Datenbanken
- `app.py`: Entfernt explizites created_at aus batch_licenses()
**Status:**
- ✅ Alle Lizenzen haben nun automatisch einen Erstellungszeitstempel
- ✅ Batch-Generierung funktioniert wieder
- ✅ Konsistente Zeitstempel für Audit-Zwecke
## 2025-06-06: Status "Deaktiviert" für manuell abgeschaltete Lizenzen
**Problem:**
- Dashboard zeigte nur "aktiv" und "abgelaufen" als Status
- Manuell deaktivierte Lizenzen (is_active = FALSE) wurden nicht korrekt angezeigt
- Filter für "inactive" existierte, aber Status wurde nicht richtig berechnet
**Lösung:**
1. **Status-Berechnung erweitert:**
- CASE-Statement prüft zuerst `is_active = FALSE`
- Status "deaktiviert" wird vor anderen Status geprüft
- Reihenfolge: deaktiviert → abgelaufen → läuft bald ab → aktiv
2. **Dashboard-Statistik erweitert:**
- Neue Zählung für deaktivierte Lizenzen
- Variable `inactive_licenses` im stats Dictionary
**Änderungen:**
- `app.py`: Dashboard - Status-Berechnung für letzte 5 Lizenzen
- `app.py`: Lizenzübersicht - Status-Berechnung in der Hauptabfrage
- `app.py`: Export - Status-Berechnung für CSV/Excel Export
- `app.py`: Dashboard - Neue Statistik für deaktivierte Lizenzen
**Status:**
- ✅ "Deaktiviert" wird korrekt als Status angezeigt
- ✅ Dashboard zeigt Anzahl deaktivierter Lizenzen
- ✅ Export enthält korrekten Status
- ✅ Konsistente Status-Anzeige überall
## 2025-06-08: SSL-Sicherheit verbessert - Chrome Warnung behoben
**Problem:**
- Chrome zeigte Warnung "Die Verbindung zu dieser Website ist nicht sicher"
- Nginx erlaubte schwache Cipher Suites (WEAK) ohne Perfect Forward Secrecy
- Veraltete SSL-Konfiguration mit `ssl_ciphers HIGH:!aNULL:!MD5;`
**Lösung:**
1. **Moderne Cipher Suite Konfiguration:**
- Nur sichere ECDHE und DHE Cipher Suites
- Entfernung aller RSA-only Cipher Suites
- Perfect Forward Secrecy für alle Verbindungen
2. **SSL-Optimierungen:**
- Session Cache aktiviert (1 Tag Timeout)
- OCSP Stapling für bessere Performance
- DH Parameters (2048 bit) für zusätzliche Sicherheit
3. **Resolver-Konfiguration:**
- Google DNS Server für OCSP Stapling
**Änderungen:**
- `v2_nginx/nginx.conf`: Komplett überarbeitete SSL-Konfiguration
- `v2_nginx/ssl/dhparam.pem`: Neue 2048-bit DH Parameters generiert
- `v2_nginx/Dockerfile`: COPY Befehl für dhparam.pem hinzugefügt
**Status:**
- ✅ Nur noch sichere Cipher Suites aktiv
- ✅ Perfect Forward Secrecy gewährleistet
- ✅ OCSP Stapling aktiviert
- ✅ Chrome Sicherheitswarnung behoben
**Hinweis:** Nach dem Rebuild des nginx Containers wird die Verbindung als sicher angezeigt.
## 2025-06-08: CAPTCHA-Login-Bug behoben
**Problem:**
- Nach 2 fehlgeschlagenen Login-Versuchen wurde CAPTCHA angezeigt
- Da keine CAPTCHA-Keys konfiguriert waren (für PoC), konnte man sich nicht mehr einloggen
- Selbst mit korrektem Passwort war Login blockiert
- Fehlermeldung "CAPTCHA ERFORDERLICH!" erschien immer
**Lösung:**
1. **CAPTCHA-Prüfung nur wenn Keys vorhanden:**
- `recaptcha_site_key` wird vor CAPTCHA-Prüfung geprüft
- Wenn keine Keys konfiguriert → kein CAPTCHA-Check
- CAPTCHA wird nur angezeigt wenn Keys existieren
2. **Template-Anpassungen:**
- login.html zeigt CAPTCHA nur wenn `recaptcha_site_key` vorhanden
- Kein Test-Key mehr als Fallback
3. **Konsistente Logik:**
- show_captcha prüft jetzt auch ob Keys vorhanden sind
- Bei GET und POST Requests gleiche Logik
**Änderungen:**
- `v2_adminpanel/app.py`: CAPTCHA-Check nur wenn `RECAPTCHA_SITE_KEY` existiert
- `v2_adminpanel/templates/login.html`: CAPTCHA nur anzeigen wenn Keys vorhanden
**Status:**
- ✅ Login funktioniert wieder nach 2+ Fehlversuchen
- ✅ CAPTCHA wird nur angezeigt wenn Keys konfiguriert sind
- ✅ Für PoC-Phase ohne CAPTCHA nutzbar
- ✅ Produktiv-ready wenn CAPTCHA-Keys eingetragen werden
### 2025-06-08: Zeitzone auf Europe/Berlin umgestellt
**Problem:**
- Alle Zeitstempel wurden in UTC gespeichert und angezeigt
- Backup-Dateinamen zeigten UTC-Zeit statt deutsche Zeit
- Verwirrung bei Zeitangaben im Admin Panel und Logs
**Lösung:**
1. **Docker Container Zeitzone konfiguriert:**
- Alle Dockerfiles mit `TZ=Europe/Berlin` und tzdata Installation
- PostgreSQL mit `PGTZ=Europe/Berlin` für Datenbank-Zeitzone
- Explizite Zeitzone-Dateien in /etc/localtime und /etc/timezone
2. **Python Code angepasst:**
- Import von `zoneinfo.ZoneInfo` für Zeitzonenunterstützung
- Alle `datetime.now()` Aufrufe mit `ZoneInfo("Europe/Berlin")`
- `.replace(tzinfo=None)` für Kompatibilität mit timezone-unaware Timestamps
3. **PostgreSQL Konfiguration:**
- `SET timezone = 'Europe/Berlin';` in init.sql
- Umgebungsvariablen TZ und PGTZ in docker-compose.yaml
4. **docker-compose.yaml erweitert:**
- `TZ: Europe/Berlin` für alle Services
**Geänderte Dateien:**
- `v2_adminpanel/Dockerfile`: Zeitzone und tzdata hinzugefügt
- `v2_postgres/Dockerfile`: Zeitzone und tzdata hinzugefügt
- `v2_nginx/Dockerfile`: Zeitzone und tzdata hinzugefügt
- `v2_lizenzserver/Dockerfile`: Zeitzone und tzdata hinzugefügt
- `v2_adminpanel/app.py`: 14 datetime.now() Aufrufe mit Zeitzone versehen
- `v2_adminpanel/init.sql`: PostgreSQL Zeitzone gesetzt
- `v2/docker-compose.yaml`: TZ Environment-Variable für alle Services
**Ergebnis:**
- ✅ Alle neuen Zeitstempel werden in deutscher Zeit (Europe/Berlin) gespeichert
- ✅ Backup-Dateinamen zeigen korrekte deutsche Zeit
- ✅ Admin Panel zeigt alle Zeiten in deutscher Zeitzone
- ✅ Automatische Anpassung bei Sommer-/Winterzeit
- ✅ Konsistente Zeitangaben über alle Komponenten
**Hinweis:** Nach diesen Änderungen müssen die Docker Container neu gebaut werden:
```bash
docker-compose down
docker-compose build
docker-compose up -d
```
### 2025-06-08: Zeitzone-Fix - PostgreSQL Timestamps
**Problem nach erster Implementierung:**
- Trotz Zeitzoneneinstellung wurden Zeiten immer noch in UTC angezeigt
- Grund: PostgreSQL Tabellen verwendeten `TIMESTAMP WITHOUT TIME ZONE`
**Zusätzliche Lösung:**
1. **Datenbankschema angepasst:**
- Alle `TIMESTAMP` Spalten auf `TIMESTAMP WITH TIME ZONE` geändert
- Betrifft: created_at, timestamp, started_at, ended_at, last_heartbeat, etc.
- Migration für bestehende Datenbanken berücksichtigt
2. **SQL-Abfragen vereinfacht:**
- `AT TIME ZONE 'Europe/Berlin'` nicht mehr nötig
- PostgreSQL handhabt Zeitzonenkonvertierung automatisch
**Geänderte Datei:**
- `v2_adminpanel/init.sql`: Alle TIMESTAMP Felder mit WITH TIME ZONE
**Wichtig:** Bei bestehenden Installationen muss die Datenbank neu initialisiert oder manuell migriert werden:
```sql
ALTER TABLE customers ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE licenses ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN started_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN last_heartbeat TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE sessions ALTER COLUMN ended_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE audit_log ALTER COLUMN timestamp TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE backup_history ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN first_attempt TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN last_attempt TYPE TIMESTAMP WITH TIME ZONE;
ALTER TABLE login_attempts ALTER COLUMN blocked_until TYPE TIMESTAMP WITH TIME ZONE;
```
### 2025-06-08: UI/UX Überarbeitung - Phase 1 (Navigation)
**Problem:**
- Inkonsistente Navigation zwischen verschiedenen Seiten
- Zu viele Navigationspunkte im Dashboard
- Verwirrende Benutzerführung
**Lösung:**
1. **Dashboard vereinfacht:**
- Nur noch 3 Buttons: Neue Lizenz, Batch-Lizenzen, Log
- Statistik-Karten wurden klickbar gemacht (verlinken zu jeweiligen Seiten)
- "Audit" wurde zu "Log" umbenannt
2. **Navigation konsistent gemacht:**
- Navbar-Brand "AccountForger - Admin Panel" ist jetzt klickbar und führt zum Dashboard
- Keine Log-Links mehr in Unterseiten
- Konsistente "Dashboard" Buttons in allen Unterseiten
**Geänderte Dateien:**
- `v2_adminpanel/templates/base.html`: Navbar-Brand klickbar gemacht
- `v2_adminpanel/templates/dashboard.html`: Navigation reduziert, Karten klickbar
- `v2_adminpanel/templates/*.html`: Konsistente Dashboard-Links
### 2025-06-08: UI/UX Überarbeitung - Phase 2 (Visuelle Verbesserungen)
**Implementierte Verbesserungen:**
1. **Größere Icons in Statistik-Karten:**
- Icon-Größe auf 3rem erhöht
- Bessere visuelle Hierarchie
2. **Donut-Chart für Lizenzen:**
- Chart.js Integration für Lizenzstatistik
- Zeigt Verhältnis Aktiv/Abgelaufen
- UPDATE: Später wieder entfernt auf Benutzerwunsch
3. **Pulse-Effekt für aktive Sessions:**
- CSS-Animation für aktive Sessions
- Visueller Indikator für Live-Aktivität
4. **Progress-Bar für Backup-Status:**
- Zeigt visuell den Erfolg des letzten Backups
- Inkl. Dateigröße und Dauer
5. **Konsistente Farbcodierung:**
- CSS-Variablen für Statusfarben
- Globale Klassen für konsistente Darstellung
**Geänderte Dateien:**
- `v2_adminpanel/templates/base.html`: Globale CSS-Variablen und Statusklassen
- `v2_adminpanel/templates/dashboard.html`: Visuelle Verbesserungen implementiert
### 2025-06-08: UI/UX Überarbeitung - Phase 3 (Tabellen-Optimierungen)
**Problem:**
- Tabellen waren schwer zu navigieren bei vielen Einträgen
- Keine Möglichkeit für Bulk-Operationen
- Umständliches Kopieren von Lizenzschlüsseln
**Lösung:**
1. **Sticky Headers:**
- Tabellenköpfe bleiben beim Scrollen sichtbar
- CSS-Klasse `.table-sticky` mit `position: sticky`
2. **Inline-Actions:**
- Copy-Button direkt neben Lizenzschlüsseln
- Toggle-Switches für Aktiv/Inaktiv-Status
- Visuelles Feedback bei Aktionen
3. **Bulk-Actions:**
- Checkboxen für Mehrfachauswahl
- "Select All" Funktionalität
- Bulk-Actions Bar mit Aktivieren/Deaktivieren/Löschen
- JavaScript für dynamische Anzeige
4. **API-Endpoints hinzugefügt:**
- `/api/license/<id>/toggle` - Toggle einzelner Lizenzstatus
- `/api/licenses/bulk-activate` - Mehrere Lizenzen aktivieren
- `/api/licenses/bulk-deactivate` - Mehrere Lizenzen deaktivieren
- `/api/licenses/bulk-delete` - Mehrere Lizenzen löschen
5. **Beispieldaten eingefügt:**
- 15 Testkunden
- 18 Lizenzen (verschiedene Status)
- Sessions, Audit-Logs, Login-Attempts
- Backup-Historie
**Geänderte Dateien:**
- `v2_adminpanel/templates/base.html`: CSS für Sticky-Tables und Bulk-Actions
- `v2_adminpanel/templates/licenses.html`: Komplette Tabellen-Überarbeitung
- `v2_adminpanel/app.py`: 4 neue API-Endpoints für Toggle und Bulk-Operationen
- `v2_adminpanel/sample_data.sql`: Umfangreiche Testdaten erstellt
**Bugfix:**
- API-Endpoints versuchten `updated_at` zu setzen, obwohl die Spalte nicht existiert
- Entfernt aus allen 3 betroffenen Endpoints
**Status:**
- ✅ Sticky Headers funktionieren
- ✅ Copy-Buttons mit Clipboard-API
- ✅ Toggle-Switches ändern Lizenzstatus
- ✅ Bulk-Operationen vollständig implementiert
- ✅ Testdaten erfolgreich eingefügt
### 2025-06-08: UI/UX Überarbeitung - Phase 4 (Sortierbare Tabellen)
**Problem:**
- Keine Möglichkeit, Tabellen nach verschiedenen Spalten zu sortieren
- Besonders bei großen Datenmengen schwer zu navigieren
**Lösung - Hybrid-Ansatz:**
1. **Client-seitige Sortierung für kleine Tabellen:**
- Dashboard (3 kleine Übersichtstabellen)
- Blocked IPs (typischerweise wenige Einträge)
- Backups (begrenzte Anzahl)
- JavaScript-basierte Sortierung ohne Reload
2. **Server-seitige Sortierung für große Tabellen:**
- Licenses (potenziell tausende Einträge)
- Customers (viele Kunden möglich)
- Audit Log (wächst kontinuierlich)
- Sessions (viele aktive/beendete Sessions)
- URL-Parameter für Sortierung mit SQL ORDER BY
**Implementierung:**
1. **Client-seitige Sortierung:**
- Generische JavaScript-Funktion in base.html
- CSS-Klasse `.sortable-table` für betroffene Tabellen
- Sortier-Indikatoren (↑↓↕) bei Hover/Active
- Unterstützung für Text, Zahlen und deutsche Datumsformate
2. **Server-seitige Sortierung:**
- Query-Parameter `sort` und `order` in Routes
- Whitelist für erlaubte Sortierfelder (SQL-Injection-Schutz)
- Makro-Funktionen für sortierbare Header
- Sortier-Parameter in Pagination-Links erhalten
**Geänderte Dateien:**
- `v2_adminpanel/templates/base.html`: CSS und JavaScript für Sortierung
- `v2_adminpanel/templates/dashboard.html`: Client-seitige Sortierung
- `v2_adminpanel/templates/blocked_ips.html`: Client-seitige Sortierung
- `v2_adminpanel/templates/backups.html`: Client-seitige Sortierung
- `v2_adminpanel/templates/licenses.html`: Server-seitige Sortierung
- `v2_adminpanel/templates/customers.html`: Server-seitige Sortierung
- `v2_adminpanel/templates/audit_log.html`: Server-seitige Sortierung
- `v2_adminpanel/templates/sessions.html`: Server-seitige Sortierung (2 Tabellen)
- `v2_adminpanel/app.py`: 4 Routes erweitert für Sortierung
**Besonderheiten:**
- Sessions-Seite hat zwei unabhängige Tabellen mit eigenen Sortierparametern
- Intelligente Datentyp-Erkennung (numeric, date) für korrekte Sortierung
- Visuelle Sortier-Indikatoren zeigen aktuelle Sortierung
- Alle anderen Filter und Suchparameter bleiben bei Sortierung erhalten
**Status:**
- ✅ Client-seitige Sortierung für kleine Tabellen
- ✅ Server-seitige Sortierung für große Tabellen
- ✅ Sortier-Indikatoren und visuelle Rückmeldung
- ✅ SQL-Injection-Schutz durch Whitelisting
- ✅ Vollständige Integration mit bestehenden Features
### 2025-06-08: Bugfix - Sortierlogik korrigiert
**Problem:**
- Sortierung funktionierte nicht korrekt
- Beim Klick auf Spaltenköpfe wurde immer absteigend sortiert
- Toggle zwischen ASC/DESC funktionierte nicht
**Ursachen:**
1. **Falsche Bedingungslogik**: Die ursprüngliche Implementierung verwendete eine fehlerhafte Ternär-Bedingung
2. **Berechnete Felder**: Das 'status' Feld in der Lizenztabelle konnte nicht direkt sortiert werden
**Lösung:**
1. **Sortierlogik korrigiert:**
- Bei neuer Spalte: Immer aufsteigend (ASC) beginnen
- Bei gleicher Spalte: Toggle zwischen ASC und DESC
- Implementiert durch bedingte Links in den Makros
2. **Spezialbehandlung für berechnete Felder:**
- Status-Feld verwendet CASE-Statement in ORDER BY
- Wiederholt die gleiche Logik wie im SELECT
**Geänderte Dateien:**
- `v2_adminpanel/templates/licenses.html`: Sortierlogik korrigiert
- `v2_adminpanel/templates/customers.html`: Sortierlogik korrigiert
- `v2_adminpanel/templates/audit_log.html`: Sortierlogik korrigiert
- `v2_adminpanel/templates/sessions.html`: Sortierlogik für beide Tabellen korrigiert
- `v2_adminpanel/app.py`: Spezialbehandlung für Status-Feld in licenses Route
**Verhalten nach Fix:**
- ✅ Erster Klick auf Spalte: Aufsteigend sortieren
- ✅ Zweiter Klick: Absteigend sortieren
- ✅ Weitere Klicks: Toggle zwischen ASC/DESC
- ✅ Sortierung funktioniert korrekt mit Pagination und Filtern
### 2025-06-09: Port 8443 geschlossen - API nur noch über Nginx
**Problem:**
- Doppelte Verfügbarkeit des License Servers (Port 8443 + Nginx) machte keinen Sinn
- Inkonsistente Sicherheitskonfiguration (Nginx hatte Security Headers, Port 8443 nicht)
- Doppelte SSL-Konfiguration nötig
- Verwirrung welcher Zugangsweg genutzt werden soll
**Lösung:**
- Port-Mapping für License Server in docker-compose.yaml entfernt
- API nur noch über Nginx erreichbar: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com
- Interne Kommunikation zwischen Nginx und License Server bleibt bestehen
**Vorteile:**
- ✅ Einheitliche Sicherheitskonfiguration (Security Headers, HSTS)
- ✅ Zentrale SSL-Verwaltung nur in Nginx
- ✅ Möglichkeit für Rate Limiting und zentrales Logging
- ✅ Keine zusätzlichen offenen Ports (nur 80/443)
- ✅ Professionellere API-URL ohne Port-Angabe
**Geänderte Dateien:**
- `v2/docker-compose.yaml`: Port-Mapping "8443:8443" entfernt
**Hinweis für Client-Software:**
- API-Endpunkte sind weiterhin unter https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com erreichbar
- Keine Änderung der API-URLs nötig, nur Port 8443 ist nicht mehr direkt zugänglich
**Status:**
- ✅ Port 8443 geschlossen
- ✅ API nur noch über Nginx Reverse Proxy erreichbar
- ✅ Sicherheit erhöht durch zentrale Verwaltung
### 2025-06-09: Live-Filtering implementiert
**Problem:**
- Benutzer mussten immer auf "Filter anwenden" klicken
- Umständliche Bedienung, besonders bei mehreren Filterkriterien
- Nicht zeitgemäße User Experience
**Lösung:**
- JavaScript Event-Listener für automatisches Filtern
- Text-Eingaben: 300ms Debouncing (verzögerte Suche nach Tipp-Pause)
- Dropdowns: Sofortiges Filtern bei Änderung
- "Filter anwenden" Button entfernt, nur "Zurücksetzen" bleibt
**Implementierte Live-Filter:**
1. **Lizenzübersicht** (licenses.html):
- Suchfeld mit Debouncing
- Typ-Dropdown (Vollversion/Testversion)
- Status-Dropdown (Aktiv/Ablaufend/Abgelaufen/Deaktiviert)
2. **Kundenübersicht** (customers.html):
- Suchfeld mit Debouncing
- "Suchen" Button entfernt
3. **Audit-Log** (audit_log.html):
- Benutzer-Textfeld mit Debouncing
- Aktion-Dropdown
- Entität-Dropdown
**Technische Details:**
- `addEventListener('input')` für Textfelder
- `addEventListener('change')` für Select-Elemente
- `setTimeout()` mit 300ms für Debouncing
- Automatisches `form.submit()` bei Änderungen
**Vorteile:**
- ✅ Schnellere und intuitivere Bedienung
- ✅ Weniger Klicks erforderlich
- ✅ Moderne User Experience
- ✅ Besonders hilfreich bei komplexen Filterkriterien
**Status:**
- ✅ Live-Filtering auf allen Hauptseiten implementiert
- ✅ Debouncing verhindert zu viele Server-Requests
- ✅ Zurücksetzen-Button bleibt für schnelles Löschen aller Filter
### 2025-06-09: Resource Pool System implementiert (Phase 1 & 2)
**Ziel:**
Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder Lizenzerstellung 1-10 Ressourcen pro Typ zugewiesen werden. Ressourcen haben 3 Status: available, allocated, quarantine.
**Phase 1 - Datenbank-Schema (✅ Abgeschlossen):**
1. **Neue Tabellen erstellt:**
- `resource_pools` - Haupttabelle für alle Ressourcen
- `resource_history` - Vollständige Historie aller Aktionen
- `resource_metrics` - Performance-Tracking und ROI-Berechnung
- `license_resources` - Zuordnung zwischen Lizenzen und Ressourcen
2. **Erweiterte licenses Tabelle:**
- `domain_count`, `ipv4_count`, `phone_count` Spalten hinzugefügt
- Constraints: 0-10 pro Resource-Typ
3. **Indizes für Performance:**
- Status, Type, Allocated License, Quarantine Date
**Phase 2 - Backend-Implementierung (✅ Abgeschlossen):**
1. **Resource Management Routes:**
- `/resources` - Hauptübersicht mit Statistiken
- `/resources/add` - Bulk-Import von Ressourcen
- `/resources/quarantine/<id>` - Ressourcen sperren
- `/resources/release` - Quarantäne aufheben
- `/resources/history/<id>` - Komplette Historie
- `/resources/metrics` - Performance Dashboard
- `/resources/report` - Report-Generator
2. **API-Endpunkte:**
- `/api/resources/allocate` - Ressourcen-Zuweisung
- `/api/resources/check-availability` - Verfügbarkeit prüfen
3. **Integration in Lizenzerstellung:**
- `create_license()` erweitert um Resource-Allocation
- `batch_licenses()` mit Ressourcen-Prüfung für gesamten Batch
- Transaktionale Sicherheit bei Zuweisung
4. **Dashboard-Integration:**
- Resource-Statistiken in Dashboard eingebaut
- Warning-Level basierend auf Verfügbarkeit
5. **Navigation erweitert:**
- Resources-Link in Navbar hinzugefügt
**Was noch zu tun ist:**
### Phase 3 - UI-Komponenten (🔄 Ausstehend):
1. **Templates erstellen:**
- `resources.html` - Hauptübersicht mit Drag&Drop
- `add_resources.html` - Formular für Bulk-Import
- `resource_history.html` - Historie-Anzeige
- `resource_metrics.html` - Performance Dashboard
2. **Formulare erweitern:**
- `index.html` - Resource-Dropdowns hinzufügen
- `batch_form.html` - Resource-Dropdowns hinzufügen
3. **Dashboard-Widget:**
- Resource Pool Statistik mit Ampelsystem
- Warnung bei niedrigem Bestand
### Phase 4 - Erweiterte Features (🔄 Ausstehend):
1. **Quarantäne-Workflow:**
- Gründe: abuse, defect, maintenance, blacklisted, expired
- Automatische Tests vor Freigabe
- Genehmigungsprozess
2. **Performance-Metrics:**
- Täglicher Cronjob für Metriken
- ROI-Berechnung
- Issue-Tracking
3. **Report-Generator:**
- Auslastungsreport
- Performance-Report
- Compliance-Report
### Phase 5 - Backup erweitern (🔄 Ausstehend):
- Neue Tabellen in Backup einbeziehen:
- resource_pools
- resource_history
- resource_metrics
- license_resources
### Phase 6 - Testing & Migration (🔄 Ausstehend):
1. **Test-Daten generieren:**
- 500 Test-Domains
- 200 Test-IPs
- 100 Test-Telefonnummern
2. **Migrations-Script:**
- Bestehende Lizenzen auf default resource_count setzen
### Phase 7 - Dokumentation (🔄 Ausstehend):
- API-Dokumentation für License Server
- Admin-Handbuch für Resource Management
**Technische Details:**
- 3-Status-System: available/allocated/quarantine
- Transaktionale Ressourcen-Zuweisung mit FOR UPDATE Lock
- Vollständige Historie mit IP-Tracking
- Drag&Drop UI für Resource-Management geplant
- Automatische Warnung bei < 50 verfügbaren Ressourcen
**Status:**
- ✅ Datenbank-Schema komplett
- ✅ Backend-Routen implementiert
- ✅ Integration in Lizenzerstellung
- ❌ UI-Templates fehlen noch
- ❌ Erweiterte Features ausstehend
- ❌ Testing und Migration offen
### 2025-06-09: Resource Pool System UI-Implementierung (Phase 3 & 4)
**Phase 3 - UI-Komponenten (✅ Abgeschlossen):**
1. **Neue Templates erstellt:**
- `resources.html` - Hauptübersicht mit Statistiken, Filter, Live-Suche, Pagination
- `add_resources.html` - Bulk-Import Formular mit Validierung
- `resource_history.html` - Timeline-Ansicht der Historie mit Details
- `resource_metrics.html` - Performance Dashboard mit Charts
- `resource_report.html` - Report-Generator UI
2. **Erweiterte Formulare:**
- `index.html` - Resource-Count Dropdowns (0-10) mit Live-Verfügbarkeitsprüfung
- `batch_form.html` - Resource-Count mit Batch-Berechnung (zeigt Gesamtbedarf)
3. **Dashboard-Widget:**
- Resource Pool Statistik mit Ampelsystem implementiert
- Zeigt verfügbare/zugeteilte/quarantäne Ressourcen
- Warnung bei niedrigem Bestand (<50)
- Fortschrittsbalken für visuelle Darstellung
4. **Backend-Anpassungen:**
- `resource_history` Route korrigiert für Object-Style Template-Zugriff
- `resources_metrics` Route vollständig implementiert mit Charts-Daten
- `resources_report` Route erweitert für Template-Anzeige und Downloads
- Dashboard erweitert um Resource-Statistiken
**Phase 4 - Erweiterte Features (✅ Teilweise):**
1. **Report-Generator:**
- Template für Report-Auswahl erstellt
- 4 Report-Typen: Usage, Performance, Compliance, Inventory
- Export als Excel, CSV oder PDF-Vorschau
- Zeitraum-Auswahl mit Validierung
**Technische Details der Implementierung:**
- Live-Filtering ohne Reload durch JavaScript
- AJAX-basierte Verfügbarkeitsprüfung
- Bootstrap 5 für konsistentes Design
- Chart.js für Metriken-Visualisierung
- Responsives Design für alle Templates
- Copy-to-Clipboard für Resource-Werte
- Modal-Dialoge für Quarantäne-Aktionen
**Was noch fehlt:**
### Phase 5 - Backup erweitern (🔄 Ausstehend):
- Resource-Tabellen in pg_dump einbeziehen:
- resource_pools
- resource_history
- resource_metrics
- license_resources
### Phase 6 - Testing & Migration (🔄 Ausstehend):
1. **Test-Daten generieren:**
- Script für 500 Test-Domains
- 200 Test-IPv4-Adressen
- 100 Test-Telefonnummern
- Realistische Verteilung über Status
2. **Migrations-Script:**
- Bestehende Lizenzen auf Default resource_count setzen
- UPDATE licenses SET domain_count=1, ipv4_count=1, phone_count=1 WHERE ...
### Phase 7 - Dokumentation (🔄 Ausstehend):
- API-Dokumentation für Resource-Endpunkte
- Admin-Handbuch für Resource Management
- Troubleshooting-Guide
**Offene Punkte für Produktion:**
1. Drag&Drop für Resource-Verwaltung (Nice-to-have)
2. Automatische Quarantäne-Aufhebung nach Zeitablauf
3. E-Mail-Benachrichtigungen bei niedrigem Bestand
4. API für externe Resource-Prüfung
5. Bulk-Delete für Ressourcen
6. Resource-Import aus CSV/Excel
### 2025-06-09: Resource Pool System finalisiert
**Problem:**
- Resource Pool System war nur teilweise implementiert
- UI-Templates waren vorhanden, aber nicht dokumentiert
- Test-Daten und Migration fehlten
- Backup-Integration unklar
**Analyse und Lösung:**
1. **Status-Überprüfung durchgeführt:**
- Alle 5 UI-Templates existierten bereits (resources.html, add_resources.html, etc.)
- Resource-Dropdowns waren bereits in index.html und batch_form.html integriert
- Dashboard-Widget war bereits implementiert
- Backup-System inkludiert bereits alle Tabellen (pg_dump ohne -t Parameter)
2. **Fehlende Komponenten erstellt:**
- Test-Daten Script: `test_data_resources.sql`
- 500 Test-Domains (400 verfügbar, 50 zugeteilt, 50 in Quarantäne)
- 200 Test-IPv4-Adressen (150 verfügbar, 30 zugeteilt, 20 in Quarantäne)
- 100 Test-Telefonnummern (70 verfügbar, 20 zugeteilt, 10 in Quarantäne)
- Resource History und Metrics für realistische Daten
- Migration Script: `migrate_existing_licenses.sql`
- Setzt Default Resource Counts (Vollversion: 2, Testversion: 1, Inaktiv: 0)
- Weist automatisch verfügbare Ressourcen zu
- Erstellt Audit-Log Einträge
- Gibt detaillierten Migrationsbericht aus
**Neue Dateien:**
- `v2_adminpanel/test_data_resources.sql` - Testdaten für Resource Pool
- `v2_adminpanel/migrate_existing_licenses.sql` - Migration für bestehende Lizenzen
**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. Test-Daten einspielen: `psql -U adminuser -d meinedatenbank -f test_data_resources.sql`
2. Migration ausführen: `psql -U adminuser -d meinedatenbank -f migrate_existing_licenses.sql`
3. 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 `create_resource_tables.sql` erstellt
2. Script manuell in der Datenbank ausgeführt
3. 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: `create_resource_tables.sql` ausführen
### 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
### Neue Dateien erstellt heute:
1. `v2_adminpanel/test_data_resources.sql` - 800 Test-Ressourcen
### 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:**
- Script `migrate_users.py` erstellt für Migration existierender Benutzer
- 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/migrate_users.py` - Migrations-Script (neu)
- `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
**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
**Geänderte Dateien:**
- `v2_adminpanel/create_users_table.sql` - SQL für Users-Tabelle (temporär)
- `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