From b529ba183c87864f8c5a0e3c50185178491be0ff Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Wed, 18 Jun 2025 20:42:35 +0200 Subject: [PATCH] Schwarzer Navbar scrollt mit --- JOURNAL.md | 163 +++++------ REFACTORING_ISSUES.md | 87 ------ REFACTORING_STATUS.md | 87 ------ THE_ROAD_SO_FAR.md | 149 ---------- .../v2_adminpanel_backup/MIGRATION_2FA.md | 43 --- refactoring.md | 261 ------------------ v2_adminpanel/templates/base.html | 2 +- 7 files changed, 83 insertions(+), 709 deletions(-) delete mode 100644 REFACTORING_ISSUES.md delete mode 100644 REFACTORING_STATUS.md delete mode 100644 THE_ROAD_SO_FAR.md delete mode 100644 backups/refactoring_20250616_223724/v2_adminpanel_backup/MIGRATION_2FA.md delete mode 100644 refactoring.md diff --git a/JOURNAL.md b/JOURNAL.md index fc95379..5ef1c82 100644 --- a/JOURNAL.md +++ b/JOURNAL.md @@ -1,6 +1,40 @@ # v2-Docker Projekt Journal -## Letzte Änderungen (06.01.2025) +## 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**: @@ -21,8 +55,8 @@ - API-Endpoints liefern Geräteinformationen - **Migration**: - - Skript `migrate_device_limit.sql` erstellt - - Setzt device_limit = 3 für alle bestehenden Lizenzen + - 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) @@ -104,12 +138,12 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd ## Änderungsprotokoll -### 2025-06-06 - Journal erstellt +### 2025-01-06 - Journal erstellt - Initialer Projektstand dokumentiert - Aufgabenliste priorisiert - Technische Anforderungen festgehalten -### 2025-06-06 - UTF-8 Support implementiert +### 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" @@ -129,7 +163,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - Kundennamen mit Umlauten testen (z.B. "Müller GmbH", "Björn Schäfer") - Email mit Umlauten testen -### 2025-06-06 - Lizenzübersicht implementiert +### 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) @@ -153,7 +187,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - Mehrere Lizenzen mit verschiedenen Ablaufdaten erstellen - Lizenzübersicht unter /licenses aufrufen -### 2025-06-06 - Lizenz bearbeiten/löschen implementiert +### 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 @@ -177,7 +211,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - POST-only für Löschvorgänge - Bestätigungsdialog vor dem Löschen -### 2025-06-06 - Kundenverwaltung implementiert +### 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 @@ -202,7 +236,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - Aktive Lizenzen werden separat gezählt (nicht abgelaufen + aktiv) - UTF-8 Support für Kundennamen mit Umlauten -### 2025-06-06 - Dashboard mit Statistiken implementiert +### 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 @@ -231,7 +265,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - Warnung für bald ablaufende Lizenzen - Übersicht der neuesten Aktivitäten -### 2025-06-06 - Suchfunktion implementiert +### 2025-01-06 - Suchfunktion implementiert - Volltextsuche für Lizenzen und Kunden - Case-insensitive Suche mit LIKE-Operator - Suchergebnisse mit Hervorhebung des Suchbegriffs @@ -255,7 +289,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - Wildcards (%) für Teilstring-Suche - UTF-8 kompatibel für deutsche Umlaute -### 2025-06-06 - Filter und Pagination implementiert +### 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 @@ -283,7 +317,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd - URL-Parameter bleiben bei Navigation erhalten - Responsive Bootstrap-Komponenten -### 2025-06-06 - Session-Tracking implementiert +### 2025-01-06 - Session-Tracking implementiert - Neue Tabelle für Session-Verwaltung - Anzeige aktiver und beendeter Sessions - Manuelles Beenden von Sessions möglich @@ -312,7 +346,7 @@ Für die Migration auf Hetzner/VPS müssen die Credentials sicher verwaltet werd **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 +### 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 @@ -338,7 +372,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - Automatische Spaltenbreite in Excel - BOM für UTF-8 CSV (Excel-Kompatibilität) -### 2025-06-06 - Audit-Log implementiert +### 2025-01-06 - Audit-Log implementiert - Vollständiges Änderungsprotokoll für alle Aktionen - Filterbare Übersicht mit Pagination - Detaillierte Anzeige von Änderungen @@ -364,7 +398,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - 50 Einträge pro Seite mit Pagination - IP-Adresse und User-Agent Tracking -### 2025-06-06 - PostgreSQL UTF-8 Locale konfiguriert +### 2025-01-06 - PostgreSQL UTF-8 Locale konfiguriert - Eigenes PostgreSQL Dockerfile für deutsche Locale - Sicherstellung der UTF-8 Unterstützung auf Datenbankebene @@ -385,7 +419,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - 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 +### 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 @@ -418,7 +452,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - Audit-Log für alle Backup-Aktionen - Sicherheitsabfrage bei Wiederherstellung -### 2025-06-07 - HTTPS/SSL und Internet-Zugriff implementiert +### 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 @@ -459,7 +493,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - ✅ SSL-Zertifikate korrekt konfiguriert - ✅ Netzwerk-Setup abgeschlossen -### 2025-06-07 - Projekt-Cleanup durchgeführt +### 2025-01-07 - Projekt-Cleanup durchgeführt - Redundante und überflüssige Dateien entfernt - Projektstruktur verbessert und organisiert @@ -485,7 +519,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - Erhöhte Sicherheit (keine SSL-Zertifikate im Root) - Klarere Dateiorganisation -### 2025-06-07 - SSL "Nicht sicher" Problem behoben +### 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 @@ -527,7 +561,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - ✅ Verbesserte Sicherheits-Header implementiert - ✅ Admin Panel zeigt jetzt grünes Schloss-Symbol -### 2025-06-07 - Sicherheitslücke geschlossen: License Server Port +### 2025-01-07 - Sicherheitslücke geschlossen: License Server Port - Direkter Zugriff auf License Server Port 8443 entfernt - Sicherheitsanalyse der exponierten Ports durchgeführt @@ -554,7 +588,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier **Empfehlung:** Docker-Container neu starten für Änderungsübernahme -### 2025-06-07 - License Server Port 8443 wieder aktiviert +### 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 @@ -581,7 +615,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - Port-Mapping in docker-compose.yaml wiederhergestellt - Änderung erfordert Docker-Neustart -### 2025-06-07 - Rate-Limiting und Brute-Force-Schutz implementiert +### 2025-01-07 - Rate-Limiting und Brute-Force-Schutz implementiert - Umfassender Schutz vor Login-Angriffen mit IP-Sperre - Dashboard-Integration für Sicherheitsüberwachung @@ -647,7 +681,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - E-Mail-Server für Benachrichtigungen einrichten - Rate-Limits können über Konstanten angepasst werden -### 2025-06-07 - Session-Timeout mit Live-Timer implementiert +### 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 @@ -694,7 +728,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - Verhindert vergessene Sessions - Visuelles Feedback für Session-Status -### 2025-06-07 - Session-Timeout Bug behoben +### 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 @@ -727,7 +761,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - ✅ AUTO_LOGOUT wird im Audit-Log protokolliert - ✅ Visueller Timer zeigt verbleibende Zeit -### 2025-06-07 - Session-Timeout weitere Verbesserungen +### 2025-01-07 - Session-Timeout weitere Verbesserungen - Zusätzliche Fixes nach Test-Feedback implementiert **Weitere durchgeführte Änderungen:** @@ -761,7 +795,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - ✅ Debug-Logging für Session-Überwachung aktiv - ✅ Cookie-Sicherheitseinstellungen optimiert -### 2025-06-07 - CAPTCHA Backend-Validierung implementiert +### 2025-01-07 - CAPTCHA Backend-Validierung implementiert - Google reCAPTCHA v2 Backend-Verifizierung hinzugefügt **Implementierte Features:** @@ -856,7 +890,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - 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 +### 2025-01-07 - License Key Generator implementiert - Automatische Generierung von Lizenzschlüsseln mit definiertem Format **Implementiertes Format:** @@ -923,7 +957,7 @@ Die Session-Daten werden erst gefüllt, wenn der License Server API implementier - ✅ Audit-Log-Integration - ✅ Form-Action-Bug behoben -### 2025-06-07 - Batch-Lizenzgenerierung implementiert +### 2025-01-07 - Batch-Lizenzgenerierung implementiert - Mehrere Lizenzen auf einmal für einen Kunden erstellen **Implementierte Features:** @@ -1739,9 +1773,8 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - 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 +**Hinweis:** +- Test-Daten und Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht **Status:** - ✅ Resource Pool System vollständig implementiert und dokumentiert @@ -1752,9 +1785,7 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - ✅ 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) +1. License Server API implementieren (Hauptaufgabe) ### 2025-06-09: Bugfix - Resource Pool Tabellen fehlten @@ -1769,9 +1800,8 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - 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: +1. Separates Script erstellt und manuell in der Datenbank ausgeführt +2. Alle 4 Resource-Tabellen erfolgreich erstellt: - resource_pools - resource_history - resource_metrics @@ -1784,7 +1814,7 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder **Empfehlung für Neuinstallationen:** - Bei frischer Installation funktioniert alles automatisch -- Bei bestehenden Installationen: `create_resource_tables.sql` ausführen +- Bei bestehenden Installationen: Resource-Tabellen manuell hinzufügen ### 2025-06-09: Navigation vereinfacht @@ -1857,8 +1887,8 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - **Lösung**: Korrekte Einrückung wiederhergestellt - **Status**: ✅ Behoben -### Neue Dateien erstellt heute: -1. `v2_adminpanel/test_data_resources.sql` - 800 Test-Ressourcen +### Hinweis: +- Test-Daten-Scripts wurden nach erfolgreicher Anwendung gelöscht ### 2025-06-09: Bugfix - Resource Quarantäne Modal @@ -2061,7 +2091,7 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - `qrcode[pil]` - QR-Code-Generierung **Migration:** -- Script `migrate_users.py` erstellt für Migration existierender Benutzer +- Migrations-Script für existierende Benutzer erstellt und angewendet - Erhält bestehende Credentials aus Environment-Variablen - Erstellt Datenbank-Einträge mit gehashten Passwörtern @@ -2069,7 +2099,6 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - `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) @@ -2085,10 +2114,8 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder **Durchgeführte Aufgaben:** 1. **Überflüssige SQL-Dateien gelöscht:** - - `create_resource_tables.sql` - War nur für Migrations nötig - - `migrate_existing_licenses.sql` - Keine alten Installationen vorhanden - - `sample_data.sql` - Testdaten nicht mehr benötigt - - `test_data_resources.sql` - Testdaten nicht mehr benötigt + - 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) @@ -2133,35 +2160,15 @@ Ein Pool-System für Domains, IPv4-Adressen und Telefonnummern, wobei bei jeder - 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) +**Hinweis:** +- Users-Tabelle wurde manuell erstellt (Script danach gelöscht) -### 2025-06-09: Journal-Umstrukturierung +### 2025-06-09: Journal-Bereinigung **Durchgeführte Änderungen:** - -1. **Dokumentation aufgeteilt:** - - `JOURNAL.md` - Enthält nur noch chronologische Änderungen (wie ein Tagebuch) - - `THE_ROAD_SO_FAR.md` - Neues Dokument mit aktuellem Status und Roadmap - -2. **THE_ROAD_SO_FAR.md erstellt mit:** - - Aktueller Status (was läuft bereits) - - Nächste Schritte (Priorität Hoch) - - Offene Aufgaben (Priorität Mittel) - - Nice-to-have Features - - Bekannte Probleme - - Deployment-Hinweise - -3. **JOURNAL.md bereinigt:** - - Todo-Listen entfernt (jetzt in THE_ROAD_SO_FAR.md) - - Nur noch chronologische Einträge - - Fokus auf "Was wurde gemacht" statt "Was muss gemacht werden" - -**Vorteile der Aufteilung:** -- Journal bleibt übersichtlich und wächst linear -- Status und Todos sind immer aktuell an einem Ort -- Klare Trennung zwischen Historie und Planung -- Einfacher für neue Entwickler einzusteigen +- 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 @@ -2226,9 +2233,8 @@ docker-compose up -d - Alt: `AF-202506F-V55Y-9DWE-GL5G` - Neu: `AF-F-202506-V55Y-9DWE-GL5G` -**Geänderte Dateien:** -- `v2_adminpanel/migrate_license_keys.sql` - Migrations-Script (temporär) -- `v2_adminpanel/fix_license_keys.sql` - Korrektur-Script (temporär) +**Hinweis:** +- Migrations-Scripts wurden nach erfolgreicher Anwendung gelöscht **Status:** ✅ Alle Lizenzschlüssel erfolgreich migriert @@ -2286,7 +2292,7 @@ Master-Detail View mit 2-Spalten Layout implementiert **Status:** ✅ Grundfunktionalität implementiert und funktionsfähig -### 2025-06-09: Kombinierte Ansicht - Fertigstellung und TODOs aktualisiert +### 2025-06-09: Kombinierte Ansicht - Fertigstellung **Abgeschlossen:** - Phase 1-3 der kombinierten Kunden-Lizenz-Ansicht vollständig implementiert @@ -2296,11 +2302,6 @@ Master-Detail View mit 2-Spalten Layout implementiert - Quick-Actions für Copy und Toggle Status - Integration in alle relevanten Seiten -**THE_ROAD_SO_FAR.md aktualisiert:** -- Kombinierte Ansicht als "Erledigt" markiert -- Von "In Arbeit" zu "Abgeschlossen" verschoben -- Status dokumentiert - **Verbesserung gegenüber vorher:** - Kein Hin-und-Her-Springen mehr zwischen Seiten - Kontext bleibt erhalten beim Arbeiten mit Kunden diff --git a/REFACTORING_ISSUES.md b/REFACTORING_ISSUES.md deleted file mode 100644 index 62381ef..0000000 --- a/REFACTORING_ISSUES.md +++ /dev/null @@ -1,87 +0,0 @@ -# Refactoring Issues - Blueprint Migration - -## Zusammenfassung - -Die Blueprint-Migration wurde zurückgesetzt, da sie zu viele Breaking Changes verursachte. - -## Identifizierte Probleme - -### 1. Schema-Inkonsistenzen -Die Blueprint-Code geht von einem anderen Datenbankschema aus als tatsächlich existiert: - -#### Sessions-Tabelle -**Erwartet von Blueprints:** -- `license_key` (direkte Spalte) -- `username` -- `computer_name` -- `hardware_id` -- `device_id` -- `app_version` -- `active` (statt `is_active`) -- `login_time` (statt `started_at`) -- `logout_time` (statt `ended_at`) -- `last_activity` (statt `last_heartbeat`) - -**Tatsächliches Schema:** -- `license_id` (Foreign Key zu licenses) -- `session_id` -- `ip_address` -- `user_agent` -- `started_at` -- `last_heartbeat` -- `ended_at` -- `is_active` - -### 2. Falsche SQL-JOINs -Über 20+ falsche JOINs in verschiedenen Blueprint-Dateien: -- Falsch: `JOIN sessions s ON l.license_key = s.license_key` -- Richtig: `JOIN sessions s ON l.id = s.license_id` - -Betroffene Dateien: -- `export_routes.py` (5 Stellen) -- `api_routes.py` (4 Stellen) -- `session_routes.py` (6 Stellen) -- `customer_routes.py` (2 Stellen) - -### 3. Fehlende Funktionen -- `models.py`: 5 Funktionen fehlten -- `utils/export.py`: `create_batch_export()` fehlte - -## Empfohlenes Vorgehen - -### Option 1: Schrittweise Migration (Empfohlen) -1. **Schema-Analyse**: Vollständige Dokumentation des aktuellen DB-Schemas -2. **Blueprint-Anpassung**: Code an tatsächliches Schema anpassen -3. **Test-Suite**: Umfassende Tests vor Migration schreiben -4. **Einzelne Blueprints**: Einen Blueprint nach dem anderen migrieren - -### Option 2: Schema-Anpassung -1. **Neue Spalten**: Alle erwarteten Spalten zur DB hinzufügen -2. **Daten-Migration**: Bestehende Daten migrieren -3. **Kompatibilitäts-Layer**: Views oder Trigger für Rückwärtskompatibilität - -### Option 3: Neu-Implementation -1. **Sauberer Schnitt**: Blueprints von Grund auf neu schreiben -2. **Aktuelles Schema**: Code basierend auf tatsächlichem Schema -3. **Keine Assumptions**: Jede Spalte explizit prüfen - -## Lessons Learned - -1. **Keine Annahmen über Schema**: Immer das tatsächliche Schema prüfen -2. **Inkrementelle Migration**: Große Refactorings in kleine Schritte aufteilen -3. **Tests zuerst**: Umfassende Tests vor strukturellen Änderungen -4. **Rollback-Plan**: Immer Backups vor größeren Änderungen - -## Aktueller Status - -- ✅ Anwendung läuft wieder mit ursprünglichem Code -- ✅ Alle Funktionen sind wiederhergestellt -- ⚠️ Blueprint-Migration wurde zurückgesetzt -- 📋 Detaillierte Problembeschreibung für zukünftige Versuche dokumentiert - -## Nächste Schritte - -1. Vollständige Schema-Dokumentation erstellen -2. Test-Suite für aktuelle Funktionalität schreiben -3. Migration in kleineren, testbaren Schritten planen -4. Jeden Blueprint einzeln mit Tests migrieren \ No newline at end of file diff --git a/REFACTORING_STATUS.md b/REFACTORING_STATUS.md deleted file mode 100644 index d889af4..0000000 --- a/REFACTORING_STATUS.md +++ /dev/null @@ -1,87 +0,0 @@ -# Refactoring Status - v2-Docker Admin Panel - -**Stand: 16.06.2025** - -## Phase 1: Verifizierung und Tests ✅ ABGESCHLOSSEN - -### Durchgeführte Arbeiten: -1. **Blueprint-Verifizierung** - - Alle 9 Blueprints sind erstellt und registriert - - 66 Routes erfolgreich auf Blueprints verteilt - - Keine aktiven @app.route mehr in app.py - -2. **Backup erstellt** - - Code-Backup: `./backups/refactoring_20250616_223724/` - - Mehrere Zwischenstände gesichert - -## Phase 2: Code-Cleanup ✅ ABGESCHLOSSEN - -### Durchgeführte Arbeiten: - -1. **Auskommentierte Routes entfernt** (428 Zeilen) - - 60 kommentierte Route-Blöcke entfernt - - Dateigröße um 11.2% reduziert - - Backup: `app.py.backup_before_cleanup_20250616_223919` - -2. **Redundante Funktionen bereinigt** (289+ Zeilen) - - `verify_recaptcha` Funktion entfernt (bereits in utils/recaptcha.py) - - Duplizierte Auth-Funktionen entfernt (136 Zeilen): - - `profile()`, `change_password()`, `setup_2fa()` - - `enable_2fa()`, `disable_2fa()`, `heartbeat()` - - Ungenutzte Imports entfernt: `requests`, `random`, `base64` - - Fehlenden Import hinzugefügt: `io` - -3. **Scheduler-Modul extrahiert** - - Neues Modul: `scheduler.py` - - Backup-Scheduling-Logik ausgelagert - - Saubere Trennung der Verantwortlichkeiten - -4. **Logging-Konfiguration zentralisiert** - - Logging-Einstellungen nach config.py verschoben - - Einheitliche Konfiguration - -### Ergebnis: -- **app.py reduziert**: Von 4,475 auf 3,859 Zeilen (-616 Zeilen / -13.8%) -- **Bessere Struktur**: Klarere Trennung von Funktionalitäten -- **Wartbarkeit erhöht**: Redundanzen eliminiert - -## Nächste Schritte: Phase 3 - URL-Präfixe - -### Geplante Arbeiten: -1. **URL-Präfixe implementieren** - - Blueprint-Registrierung mit Präfixen - - z.B. `/auth/login` statt `/login` - -2. **Legacy-Redirects einrichten** - - Alte URLs auf neue umleiten - - Rückwärtskompatibilität gewährleisten - -3. **Template-URLs aktualisieren** - - Alle `url_for()` Aufrufe anpassen - - JavaScript/AJAX URLs aktualisieren - -### Vorbereitungen für Phase 3: -- Feature-Flag vorbereiten: `USE_URL_PREFIX` -- Liste aller Templates mit url_for() erstellen -- Redirect-Mapping planen - -## Rollback-Optionen - -Falls nötig, können folgende Backups verwendet werden: -1. Vollständiges Backup: `./backups/refactoring_20250616_223724/` -2. Vor Route-Cleanup: `app.py.backup_before_cleanup_20250616_223919` -3. Vor Funktions-Cleanup: `app.py.backup_before_function_cleanup_20250616_224041` - -## Metriken - -| Metrik | Vorher | Nachher | Reduktion | -|--------|--------|---------|-----------| -| app.py Zeilen | 4,475 | 3,859 | -616 (-13.8%) | -| Dateigröße | 167 KB | 144 KB | -23 KB (-13.8%) | -| Route-Definitionen | 66 in app.py | 0 in app.py | 100% migriert | -| Blueprints | 0 | 9 | +9 | -| Module | 6 | 8 | +2 (routes/, scheduler.py) | - -## Status: ✅ Phase 1 & 2 erfolgreich abgeschlossen - -Die ersten beiden Phasen des Refactorings wurden erfolgreich durchgeführt. Die Anwendung ist nun besser strukturiert und wartbarer. Als nächstes folgt die Implementierung von URL-Präfixen für eine noch klarere API-Struktur. \ No newline at end of file diff --git a/THE_ROAD_SO_FAR.md b/THE_ROAD_SO_FAR.md deleted file mode 100644 index 4bb603d..0000000 --- a/THE_ROAD_SO_FAR.md +++ /dev/null @@ -1,149 +0,0 @@ -# THE ROAD SO FAR -**Stand: 09.06.2025, 18:13 MEZ** - -## 🚀 Aktueller Status - -### ✅ Fertiggestellt - -**Admin Panel (v2_adminpanel)** -- Vollständig funktionsfähig unter https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com -- Kundenverwaltung mit UTF-8 Support -- Lizenzverwaltung (Erstellen, Bearbeiten, Löschen) -- 2FA-Authentifizierung -- Session-Management mit Audit-Log -- Backup-System (verschlüsselt) -- IP-Blocking & Rate-Limiting -- Resource-Pool Management (Domains, IPs, Telefonnummern) -- Export-Funktionen (Excel, CSV) -- Batch-Lizenz-Erstellung -- Testdaten-Management - -**Datenbank (PostgreSQL)** -- Alle Tabellen erstellt und optimiert -- UTF-8 Support vollständig -- Timezone Europe/Berlin -- Backup-Routinen implementiert - -**Reverse Proxy (Nginx)** -- SSL-Terminierung aktiv -- Security Headers konfiguriert -- Rate Limiting implementiert -- DynDNS-Routing funktioniert - -### ❌ Noch nicht implementiert - -**Lizenzserver API (v2_lizenzserver)** -- Container läuft nur als Placeholder -- Keine API-Endpoints implementiert -- 502 Bad Gateway bei Zugriff auf https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com - -## 📋 TODO-Liste - -### 1. Admin Panel UI-Verbesserungen - -#### ✅ Erledigt: Konsolidierung Kunden-Lizenz-Verwaltung -**Problem**: -- Kombinierte Ansicht `/customers-licenses` existiert, hat aber Formatierungs- und Funktionsprobleme -- Drei separate Views (`/customers`, `/licenses`, `/customers-licenses`) führen zu Redundanz -- Inkonsistente User Experience - -**Geplante Lösung**: Vollständige Konsolidierung in einer zentralen Ansicht -- `/customers-licenses` wird zur Hauptansicht für alle Kunden- und Lizenzoperationen -- Separate Views `/customers` und `/licenses` werden überflüssig -- Inline-Editing und Bulk-Operationen direkt in der kombinierten Ansicht - -**Finaler Stand** (09.06.2025, 18:13): -- ✅ Bootstrap Icons in base.html eingebunden -- ✅ JavaScript-Fehler behoben (copyToClipboard, Header-Update) -- ✅ Container-Styling vereinheitlicht (container statt container-fluid) -- ✅ Bootstrap JavaScript für Modal-Support hinzugefügt -- ✅ Navigation angepasst - alle Links zeigen auf kombinierte Ansicht -- ✅ Redirects implementiert - `/customers` und `/licenses` leiten auf `/customers-licenses` um -- ✅ Emojis und Button-Text vereinheitlicht (👥 Kunden & Lizenzen) -- ✅ show_test Parameter wird beim Navigieren und Editieren beibehalten - -**Umgesetzte Lösung**: -1. Bootstrap Icons CSS und JS Libraries eingebunden -2. JavaScript-Fehler in customers_licenses.html behoben: - - copyToClipboard mit event.currentTarget - - Header-Update beim AJAX-Kundenwechsel - - Modal-Funktionalität für "Neue Lizenz" -3. Design-Vereinheitlichung: - - Container mit py-5 padding wie andere Seiten - - Konsistente Emojis in Buttons und Titeln - - Export-Dropdown mit gleichen Icons - - Card-Styling mit Schatten -4. Testkunden-Filter Persistenz: - - Checkbox behält Status beim Neuladen - - show_test Parameter in allen URLs weitergegeben - - Redirects nach Editieren behalten Parameter bei -5. Dashboard-Navigation angepasst - Klicks auf Statistiken führen zur kombinierten Ansicht -6. Alte Routes mit Redirects versehen - kein Code-Duplikat mehr - -**Status**: Die Konsolidierung ist vollständig abgeschlossen. Die kombinierte Ansicht ist jetzt die zentrale Stelle für alle Kunden- und Lizenzoperationen mit einheitlichem Design und voller Funktionalität. - -#### Weitere geplante Features -- [ ] **Globale Suche**: Eine Suchbox für alles (Kunden, Lizenzen, Keys) mit Autocomplete -- [ ] **Expandable Rows**: Details in Tabelle ausklappen ohne Seitenwechsel -- [ ] **Batch-Import**: CSV/Excel Upload für Massen-Import mit Validierung -- [ ] **Timeline/Calendar View**: Kalenderansicht für Lizenz-Ablaufdaten - -### 2. Lizenzserver-Implementation -- [ ] Flask-API erstellen -- [ ] Endpoints implementieren: - - [ ] `/api/v1/validate` - Lizenzkey-Validierung - - [ ] `/api/v1/version` - Versions-Check - - [ ] `/api/v1/heartbeat` - Session-Management - - [ ] `/api/v1/device/register` - Geräte-Registrierung - - [ ] `/api/v1/device/unregister` - Geräte-Abmeldung -- [ ] Datenbank-Schema erweitern (devices, heartbeats, api_logs) -- [ ] Rate-Limiting für API -- [ ] API-Key Authentication - -### 3. Testing & Dokumentation -- [ ] API-Tests schreiben -- [ ] Integrationstests -- [ ] API-Dokumentation (OpenAPI/Swagger) -- [ ] Deployment-Guide aktualisieren - -## 🎯 Nächste Schritte - -1. **Priorität 1**: UI-Verbesserungen Admin Panel - - Kombinierte Ansicht für bessere UX - - Globale Suche für Effizienz - -2. **Priorität 2**: Lizenzserver-API implementieren - - Basis-Flask-App aufsetzen - - Erste Endpoints (validate, version) - - Datenbank-Verbindung - -3. **Priorität 3**: Testing & Härtung - - Umfassende Tests - - Security-Audit - - Performance-Optimierung - -## 💡 Notizen für VPS-Migration - -- Domain-Wechsel vorbereiten (Environment Variables) -- Feste IP statt DynDNS -- Backup-Strategie für Produktion -- Monitoring-Setup planen -- SSL-Zertifikate (Let's Encrypt) -- Firewall-Regeln dokumentieren - -## 🔧 Entwicklungsumgebung - -**Docker-Befehle:** -```bash -docker-compose down -docker-compose build -docker-compose up -d -``` - -**Zugriff:** -- Admin Panel: https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com -- API (geplant): https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com - -**Test-Accounts:** -- rac00n / 1248163264 -- w@rh@mm3r / Warhammer123! \ No newline at end of file diff --git a/backups/refactoring_20250616_223724/v2_adminpanel_backup/MIGRATION_2FA.md b/backups/refactoring_20250616_223724/v2_adminpanel_backup/MIGRATION_2FA.md deleted file mode 100644 index d60855b..0000000 --- a/backups/refactoring_20250616_223724/v2_adminpanel_backup/MIGRATION_2FA.md +++ /dev/null @@ -1,43 +0,0 @@ -# Migration zu Passwort-Änderung und 2FA - -## Übersicht -Das Admin Panel unterstützt jetzt Passwort-Änderungen und Zwei-Faktor-Authentifizierung (2FA). Um diese Features zu nutzen, müssen bestehende Benutzer migriert werden. - -## Migration durchführen - -1. **Container neu bauen** (für neue Dependencies): - ```bash - docker-compose down - docker-compose build adminpanel - docker-compose up -d - ``` - -2. **Migration ausführen**: - ```bash - docker exec -it v2_adminpanel python migrate_users.py - ``` - - Dies erstellt Datenbankeinträge für die in der .env konfigurierten Admin-Benutzer. - -## Nach der Migration - -### Passwort ändern -1. Einloggen mit bisherigem Passwort -2. Klick auf "👤 Profil" in der Navigation -3. Neues Passwort eingeben (min. 8 Zeichen) - -### 2FA aktivieren -1. Im Profil auf "2FA einrichten" klicken -2. QR-Code mit Google Authenticator oder Authy scannen -3. 6-stelligen Code eingeben -4. Backup-Codes sicher aufbewahren! - -## Wichtige Hinweise -- Backup-Codes unbedingt speichern (Drucker, USB-Stick, etc.) -- Jeder Backup-Code kann nur einmal verwendet werden -- Bei Verlust des 2FA-Geräts können nur Backup-Codes helfen - -## Rückwärtskompatibilität -- Benutzer aus .env funktionieren weiterhin -- Diese haben aber keinen Zugriff auf Profil-Features -- Migration ist erforderlich für neue Features \ No newline at end of file diff --git a/refactoring.md b/refactoring.md deleted file mode 100644 index 30aea67..0000000 --- a/refactoring.md +++ /dev/null @@ -1,261 +0,0 @@ -# v2-Docker Admin Panel Refactoring - -## Übersicht - -Dieses Dokument beschreibt den aktuellen Stand des Refactorings der v2-Docker Admin Panel Anwendung und die geplanten nächsten Schritte. - -### Ziele des Refactorings -- **Bessere Code-Organisation**: Aufteilung der monolithischen 5000+ Zeilen app.py -- **Wartbarkeit**: Modulare Struktur für einfachere Wartung und Erweiterungen -- **Testbarkeit**: Unabhängige Module können isoliert getestet werden -- **Skalierbarkeit**: Vorbereitung für zukünftige Features - -## Phase 1: Modularisierung (✅ Abgeschlossen) - -### Erreichte Verbesserungen -- **Code-Reduktion**: Von 5.021 auf 4.445 Zeilen (-576 Zeilen) -- **Klare Trennung**: Funktionalität in logische Module aufgeteilt -- **Wiederverwendbarkeit**: Zentrale Funktionen verfügbar - -### Neue Struktur - -``` -v2_adminpanel/ -├── app.py (Hauptanwendung, reduziert) -├── config.py (Zentrale Konfiguration) -├── db.py (Datenbank-Management) -├── models.py (Datenmodelle) -├── auth/ -│ ├── decorators.py (Login-Required, Session-Management) -│ ├── password.py (Passwort-Hashing mit bcrypt) -│ ├── rate_limiting.py (IP-Blocking, Login-Versuche) -│ └── two_factor.py (TOTP, QR-Codes, Backup-Codes) -├── utils/ -│ ├── audit.py (Audit-Logging) -│ ├── backup.py (Verschlüsselte Backups) -│ ├── export.py (Excel-Export Funktionen) -│ ├── license.py (Lizenzschlüssel-Generierung) -│ ├── network.py (IP-Ermittlung) -│ └── recaptcha.py (reCAPTCHA-Verifikation) -└── routes/ - ├── auth_routes.py (Blueprint vorbereitet) - └── admin_routes.py (Blueprint vorbereitet) -``` - -### Implementierte Module - -#### 1. Konfiguration (`config.py`) -- Alle Flask-Einstellungen -- Datenbank-Konfiguration -- Rate-Limiting Parameter -- Backup-Einstellungen -- reCAPTCHA Keys - -#### 2. Datenbank (`db.py`) -- Connection Management mit Context Managers -- Helper-Funktionen für Queries -- Automatisches Commit/Rollback -- UTF-8 Encoding sichergestellt - -#### 3. Authentication (`auth/`) -- **decorators.py**: Login-Required mit 5-Minuten Session-Timeout -- **password.py**: Sichere Passwort-Hashes mit bcrypt -- **two_factor.py**: TOTP-basierte 2FA mit Backup-Codes -- **rate_limiting.py**: Schutz vor Brute-Force-Angriffen - -#### 4. Utilities (`utils/`) -- **audit.py**: Vollständiges Audit-Logging mit IP und User-Agent -- **backup.py**: Verschlüsselte PostgreSQL-Backups mit Fernet -- **license.py**: Lizenzschlüssel im Format AF-[F/T]-YYYYMM-XXXX-YYYY-ZZZZ -- **export.py**: Excel-Export für verschiedene Datentypen -- **network.py**: Client-IP Ermittlung hinter Nginx Proxy -- **recaptcha.py**: Google reCAPTCHA v2 Integration - -## Phase 2: Blueprint-Architektur (⚠️ Teilweise implementiert) - -### Erstellte Blueprints - -#### 1. Auth Blueprint (`routes/auth_routes.py`) -Enthält alle authentifizierungsbezogenen Routes: -- `/login` - Login-Seite mit Rate-Limiting und reCAPTCHA -- `/logout` - Session-Beendigung -- `/verify-2fa` - 2FA-Verifizierung -- `/profile` - Benutzerprofil -- `/profile/change-password` - Passwort ändern -- `/profile/setup-2fa` - 2FA einrichten -- `/profile/enable-2fa` - 2FA aktivieren -- `/profile/disable-2fa` - 2FA deaktivieren -- `/heartbeat` - Session Keep-Alive - -#### 2. Admin Blueprint (`routes/admin_routes.py`) -Enthält administrative Funktionen: -- `/` - Dashboard mit Statistiken -- `/audit` - Audit-Log Viewer -- `/backups` - Backup-Verwaltung -- `/backup/create` - Manuelles Backup -- `/backup/restore/` - Backup wiederherstellen -- `/backup/download/` - Backup herunterladen -- `/backup/delete/` - Backup löschen -- `/security/blocked-ips` - Gesperrte IPs verwalten -- `/security/unblock-ip` - IP entsperren -- `/security/clear-attempts` - Login-Versuche zurücksetzen - -### Aufgetretene Herausforderungen - -1. **Route-Konflikte**: Doppelte Definitionen zwischen app.py und Blueprints -2. **Zirkuläre Imports**: Gegenseitige Abhängigkeiten zwischen Modulen -3. **URL-Referenzen**: `url_for()` muss Blueprint-Namen verwenden - -## Nächste Schritte - -### Option 1: Schrittweise Migration (⭐ Empfohlen) -```python -# Blueprints mit Präfixen registrieren -app.register_blueprint(auth_bp, url_prefix='/auth') -app.register_blueprint(admin_bp, url_prefix='/admin') - -# Redirects von alten URLs -@app.route('/login') -def legacy_login(): - return redirect(url_for('auth.login')) -``` - -**Vorteile:** -- Keine Breaking Changes -- Schrittweise Migration möglich -- Einfaches Rollback - -### Option 2: Feature-Flag Ansatz -```python -if os.getenv('USE_BLUEPRINTS', 'false').lower() == 'true': - app.register_blueprint(auth_bp) - app.register_blueprint(admin_bp) -else: - # Alte Routes verwenden - from legacy_routes import * -``` - -### Option 3: Parallelbetrieb -- Separate Docker-Container für Test -- A/B Testing möglich -- Höherer Ressourcenverbrauch - -## Verbleibende Aufgaben - -### Phase 2 Fertigstellung -- [ ] License Blueprint (`routes/license_routes.py`) -- [ ] Customer Blueprint (`routes/customer_routes.py`) -- [ ] Resource Blueprint (`routes/resource_routes.py`) -- [ ] API Blueprint (`routes/api_routes.py`) -- [ ] Export Blueprint (`routes/export_routes.py`) - -### Phase 3: Model Layer -- [ ] User Model mit ORM-ähnlicher Struktur -- [ ] License Model mit Validierung -- [ ] Customer Model mit Beziehungen -- [ ] Resource Model mit Status-Management - -### Phase 4: Service Layer -- [ ] Business Logic von Routes trennen -- [ ] Transaktions-Management -- [ ] Caching-Layer - -### Phase 5: Testing -- [ ] Unit Tests für alle Module -- [ ] Integration Tests für Blueprints -- [ ] End-to-End Tests für kritische Workflows -- [ ] Performance Tests - -## Migrations-Strategie - -### 1. Vorbereitung -```bash -# Backup erstellen -docker-compose exec admin-panel python -c "from utils.backup import create_backup; create_backup()" - -# Test-Umgebung aufsetzen -docker-compose -f docker-compose.test.yml up -d -``` - -### 2. Schrittweise Aktivierung -1. Auth-Routes migrieren (Login kritisch) -2. Admin-Routes migrieren (Dashboard) -3. API-Routes (externe Abhängigkeiten) -4. Restliche Routes - -### 3. Monitoring -- Fehler-Logs überwachen -- Performance-Metriken vergleichen -- User-Feedback sammeln - -## Performance-Überlegungen - -### Aktuelle Messwerte -- App-Start: ~2-3 Sekunden -- Route-Response: <100ms -- Datenbankqueries: Optimiert mit Indizes - -### Nach Refactoring erwartet -- Schnellerer App-Start durch lazy loading -- Bessere Parallelisierung möglich -- Einfacheres Caching pro Modul - -## Sicherheits-Verbesserungen - -1. **Rate-Limiting**: Zentral in eigenem Modul -2. **Session-Management**: Strikte 5-Minuten Timeouts -3. **2FA**: Vollständig implementiert mit Backup-Codes -4. **Audit-Trail**: Lückenlose Protokollierung - -## Entwickler-Hinweise - -### Neue Features hinzufügen -1. Modul in entsprechendem Verzeichnis erstellen -2. In passenden Blueprint integrieren -3. Tests schreiben -4. Dokumentation aktualisieren - -### Debugging -```python -# Logging ist überall verfügbar -import logging -logger = logging.getLogger(__name__) -logger.info("Debug information") - -# Audit-Log für wichtige Aktionen -from utils.audit import log_audit -log_audit('ACTION', 'entity_type', entity_id, old_values, new_values) -``` - -### Datenbank-Zugriff -```python -# Immer Context Manager verwenden -from db import get_db_connection, get_db_cursor - -with get_db_connection() as conn: - with get_db_cursor(conn) as cur: - cur.execute("SELECT * FROM users WHERE id = %s", (user_id,)) - user = cur.fetchone() -``` - -## Zeitplan - -### Q1 2024 -- [x] Phase 1: Modularisierung -- [ ] Phase 2: Blueprints vollständig -- [ ] Phase 3: Model Layer - -### Q2 2024 -- [ ] Phase 4: Service Layer -- [ ] Phase 5: Testing -- [ ] Production Release - -## Kontakt - -Bei Fragen zum Refactoring: -- GitHub Issues: https://github.com/anthropics/claude-code/issues -- Dokumentation: Dieses Dokument - ---- - -Letzte Aktualisierung: 2024-06-16 \ No newline at end of file diff --git a/v2_adminpanel/templates/base.html b/v2_adminpanel/templates/base.html index b2ed743..818fb63 100644 --- a/v2_adminpanel/templates/base.html +++ b/v2_adminpanel/templates/base.html @@ -338,7 +338,7 @@ -