From 6d1a52b7e36c295389d5c36a8dbae12872b64957 Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Wed, 18 Jun 2025 22:48:22 +0200 Subject: [PATCH] Lizenzserver im Adminpanel --- LIZENZSERVER.md | 162 +++- v2/docker-compose.yaml | 91 +++ v2_adminpanel/requirements.txt | 1 + v2_adminpanel/routes/admin_routes.py | 29 +- v2_adminpanel/templates/base.html | 10 +- .../templates/license_analytics.html | 445 +++++++++++ .../templates/license_anomalies.html | 241 ++++++ v2_adminpanel/templates/license_config.html | 239 ++++++ v2_lizenzserver/services/admin/Dockerfile | 29 + v2_lizenzserver/services/admin/__init__.py | 1 + v2_lizenzserver/services/admin/app.py | 739 ++++++++++++++++++ .../services/admin/requirements.txt | 9 + v2_lizenzserver/services/analytics/Dockerfile | 29 + .../services/analytics/__init__.py | 1 + v2_lizenzserver/services/analytics/app.py | 460 +++++++++++ .../services/analytics/requirements.txt | 9 + v2_nginx/nginx.conf | 20 + 17 files changed, 2483 insertions(+), 32 deletions(-) create mode 100644 v2_adminpanel/templates/license_analytics.html create mode 100644 v2_adminpanel/templates/license_anomalies.html create mode 100644 v2_adminpanel/templates/license_config.html create mode 100644 v2_lizenzserver/services/admin/Dockerfile create mode 100644 v2_lizenzserver/services/admin/__init__.py create mode 100644 v2_lizenzserver/services/admin/app.py create mode 100644 v2_lizenzserver/services/admin/requirements.txt create mode 100644 v2_lizenzserver/services/analytics/Dockerfile create mode 100644 v2_lizenzserver/services/analytics/__init__.py create mode 100644 v2_lizenzserver/services/analytics/app.py create mode 100644 v2_lizenzserver/services/analytics/requirements.txt diff --git a/LIZENZSERVER.md b/LIZENZSERVER.md index a041c7e..b0b6175 100644 --- a/LIZENZSERVER.md +++ b/LIZENZSERVER.md @@ -299,6 +299,94 @@ CREATE TABLE anomaly_detections ( ); ``` +## Neue Service-Endpunkte (18.06.2025) + +### Analytics Service API (Port 5003) +```yaml +# Usage Statistics +GET /api/v1/analytics/usage + Query: days, customer_id + Response: Daily usage trends with active licenses/devices + +# Performance Metrics +GET /api/v1/analytics/performance + Query: days + Response: Hourly performance metrics + +# Anomaly Statistics +GET /api/v1/analytics/anomalies + Query: days + Response: Anomaly breakdown by type and severity + +# License Distribution +GET /api/v1/analytics/distribution + Response: License distribution by type and status + +# Revenue Impact +GET /api/v1/analytics/revenue + Query: days + Response: Revenue analysis by license type + +# Geographic Distribution +GET /api/v1/analytics/geographic + Response: Top 100 locations by usage + +# Usage Patterns +GET /api/v1/analytics/patterns + Query: license_id (optional) + Response: Hourly/daily usage patterns + +# Churn Risk Analysis +GET /api/v1/analytics/churn-risk + Response: Customers sorted by churn risk + +# Customer Summary +GET /api/v1/analytics/summary/{customer_id} + Response: Comprehensive customer analytics + +# Real-time Stats +GET /api/v1/analytics/realtime + Response: Current live statistics +``` + +### Admin API Service (Port 5004) +```yaml +# License Management +GET /api/v1/admin/licenses + Query: page, per_page, customer_id, is_active, license_type +POST /api/v1/admin/licenses +GET /api/v1/admin/licenses/{id} +PUT /api/v1/admin/licenses/{id} +DELETE /api/v1/admin/licenses/{id} + +# Batch Operations +POST /api/v1/admin/licenses/batch +POST /api/v1/admin/licenses/batch/activate + +# Device Management +GET /api/v1/admin/licenses/{id}/devices +DELETE /api/v1/admin/licenses/{id}/devices/{hardware_id} + +# Customer Management +GET /api/v1/admin/customers + Query: page, per_page, search + +# Configuration +GET /api/v1/admin/config/feature-flags +PUT /api/v1/admin/config/feature-flags/{id} + +# API Key Management +GET /api/v1/admin/api-keys +POST /api/v1/admin/api-keys + +# Audit Log +GET /api/v1/admin/audit-log + Query: page, per_page, action, username, start_date, end_date + +# System Statistics +GET /api/v1/admin/stats/overview +``` + ## API-Endpunkte ### Public API (Client-Software) @@ -483,15 +571,17 @@ Cache-Keys: - [ ] Load Testing - [ ] Documentation -## Aktueller Implementierungsstand (Stand: 18.06.2025) +## Aktueller Implementierungsstand (Stand: 18.06.2025 - UPDATED) ### ✅ Fertiggestellte Komponenten: #### 1. **Microservices-Architektur** -- **Auth Service** (Port 5001): JWT-Token-Generierung und -Validierung -- **License API Service** (Port 5002): Lizenzvalidierung, Aktivierung, Heartbeat -- **Docker Compose**: Vollständiges Setup mit Redis, RabbitMQ, PostgreSQL -- **Netzwerk**: Gemeinsames `v2_network` für Service-Kommunikation +- **Auth Service** (Port 5001): JWT-Token-Generierung und -Validierung ✅ +- **License API Service** (Port 5002): Lizenzvalidierung, Aktivierung, Heartbeat ✅ +- **Analytics Service** (Port 5003): Umfassende Analyse-Funktionen ✅ NEU! +- **Admin API Service** (Port 5004): CRUD-Operationen und Batch-Processing ✅ NEU! +- **Docker Compose**: Vollständiges Setup mit Redis, RabbitMQ, PostgreSQL ✅ +- **Netzwerk**: Gemeinsames `internal_net` für Service-Kommunikation ✅ #### 2. **Datenbank-Erweiterungen** Alle neuen Tabellen wurden erfolgreich implementiert: @@ -525,16 +615,20 @@ Alle neuen Tabellen wurden erfolgreich implementiert: #### 5. **Admin Panel Integration** Neuer Menüpunkt "Lizenzserver" mit folgenden Unterseiten: -- **Live Monitor** (`/lizenzserver/monitor`): +- **Live Monitor** (`/lizenzserver/monitor`): ✅ - Echtzeit-Statistiken (aktive Lizenzen, Validierungen/Min) - Top 10 aktive Lizenzen - Aktuelle Anomalien - Validierungs-Timeline mit Chart.js -- **Analytics** (`/lizenzserver/analytics`): Placeholder für detaillierte Analysen -- **Anomalien** (`/lizenzserver/anomalies`): +- **Analytics** (`/lizenzserver/analytics`): ✅ FERTIG! + - Integration mit Analytics Service API + - Nutzungstrends und Performance-Metriken + - Revenue Analysis und Churn Risk + - Interaktive Charts mit Chart.js +- **Anomalien** (`/lizenzserver/anomalies`): ✅ - Anomalie-Liste mit Filterung - Anomalie-Resolution mit Audit-Log -- **Konfiguration** (`/lizenzserver/config`): +- **Konfiguration** (`/lizenzserver/config`): ✅ - Feature Flag Management - API Client Verwaltung - Rate Limit Konfiguration @@ -546,15 +640,32 @@ Neuer Menüpunkt "Lizenzserver" mit folgenden Unterseiten: - 💤 Offline (länger als 1h inaktiv) - ⚠️ Anzahl ungelöster Anomalien -### 🚧 In Entwicklung: +### ✅ NEU: Fertiggestellte Services (18.06.2025): -1. **Analytics Service** (Port 5003) - - Grundstruktur vorhanden - - Detaillierte Implementierung ausstehend +1. **Analytics Service** (Port 5003) ✅ FERTIG! + - Vollständige Implementierung mit allen geplanten Features: + - Usage Statistics API + - Performance Metrics + - Anomaly Statistics + - Revenue Impact Analysis + - Geographic Distribution + - Usage Patterns & Churn Risk Calculation + - Integration in Admin Panel Analytics-Seite + - JWT-basierte Authentifizierung + - Redis-Caching für Performance -2. **Admin API Service** (Port 5004) - - Struktur vorbereitet - - Implementation pending +2. **Admin API Service** (Port 5004) ✅ FERTIG! + - Vollständige CRUD-API für License Management: + - License CRUD mit Pagination und Filterung + - Batch-Operationen (Bulk Create/Update) + - Customer Management API + - Device Management + - Feature Flag Management + - API Key Management + - Audit Log API + - System Overview Statistics + - JWT-basierte Admin-Authentifizierung + - Comprehensive Audit Logging ### 📋 Noch zu implementieren: @@ -582,20 +693,25 @@ Neuer Menüpunkt "Lizenzserver" mit folgenden Unterseiten: ### 🔧 Technische Details: - **Python Version**: 3.11 -- **Flask Version**: 3.0.0 +- **Flask Version**: 3.0.0 (Analytics & Admin Services) +- **FastAPI**: License Server - **PostgreSQL**: 15 mit UUID-Extension -- **Redis**: 7-alpine für Caching +- **Redis**: 7-alpine für Caching (3 separate Datenbanken) - **RabbitMQ**: 3-management für Event Bus - **JWT**: PyJWT 2.8.0 - **Psycopg2**: 2.9.9 für PostgreSQL +- **Nginx**: Reverse Proxy mit SSL/TLS ### 📝 Nächste Schritte: -1. Analytics Service vollständig implementieren -2. Prometheus Monitoring aufsetzen -3. Load Testing durchführen -4. API-Dokumentation mit Swagger erstellen -5. Kubernetes Deployment vorbereiten +1. ~~Analytics Service vollständig implementieren~~ ✅ ERLEDIGT! +2. ~~Admin API Service implementieren~~ ✅ ERLEDIGT! +3. Prometheus Monitoring aufsetzen +4. Grafana Dashboards erstellen +5. Load Testing durchführen +6. API-Dokumentation mit Swagger erstellen +7. Kubernetes Deployment vorbereiten +8. WebSocket für Real-time Updates implementieren ## Testing-Strategie diff --git a/v2/docker-compose.yaml b/v2/docker-compose.yaml index 5ab8942..80135da 100644 --- a/v2/docker-compose.yaml +++ b/v2/docker-compose.yaml @@ -25,6 +25,40 @@ services: cpus: '2' memory: 4g + redis: + image: redis:7-alpine + container_name: redis-cache + restart: always + environment: + TZ: Europe/Berlin + networks: + - internal_net + volumes: + - redis_data:/data + deploy: + resources: + limits: + cpus: '0.5' + memory: 512m + + rabbitmq: + image: rabbitmq:3-management + container_name: rabbitmq + restart: always + environment: + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-admin} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASS:-admin} + TZ: Europe/Berlin + networks: + - internal_net + volumes: + - rabbitmq_data:/var/lib/rabbitmq + deploy: + resources: + limits: + cpus: '1' + memory: 1g + license-server: build: context: ../v2_lizenzserver @@ -34,8 +68,11 @@ services: env_file: .env environment: TZ: Europe/Berlin + REDIS_URL: redis://redis:6379/0 depends_on: - postgres + - redis + - rabbitmq networks: - internal_net deploy: @@ -44,6 +81,56 @@ services: cpus: '2' memory: 4g + analytics-service: + build: + context: ../v2_lizenzserver/services/analytics + container_name: analytics-service + restart: always + # Port 5003 - nur intern erreichbar + env_file: .env + environment: + TZ: Europe/Berlin + DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/v2_adminpanel + REDIS_URL: redis://redis:6379/2 + JWT_SECRET: ${JWT_SECRET} + FLASK_ENV: production + depends_on: + - postgres + - redis + - rabbitmq + networks: + - internal_net + deploy: + resources: + limits: + cpus: '1' + memory: 2g + + admin-api-service: + build: + context: ../v2_lizenzserver/services/admin + container_name: admin-api-service + restart: always + # Port 5004 - nur intern erreichbar + env_file: .env + environment: + TZ: Europe/Berlin + DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/v2_adminpanel + REDIS_URL: redis://redis:6379/3 + JWT_SECRET: ${JWT_SECRET} + FLASK_ENV: production + depends_on: + - postgres + - redis + - rabbitmq + networks: + - internal_net + deploy: + resources: + limits: + cpus: '1' + memory: 2g + admin-panel: build: context: ../v2_adminpanel @@ -79,6 +166,8 @@ services: depends_on: - admin-panel - license-server + - analytics-service + - admin-api-service networks: - internal_net @@ -88,3 +177,5 @@ networks: volumes: postgres_data: + redis_data: + rabbitmq_data: diff --git a/v2_adminpanel/requirements.txt b/v2_adminpanel/requirements.txt index f1fcc95..50ebfbb 100644 --- a/v2_adminpanel/requirements.txt +++ b/v2_adminpanel/requirements.txt @@ -12,3 +12,4 @@ python-dateutil bcrypt pyotp qrcode[pil] +PyJWT diff --git a/v2_adminpanel/routes/admin_routes.py b/v2_adminpanel/routes/admin_routes.py index 1c5e134..3493e39 100644 --- a/v2_adminpanel/routes/admin_routes.py +++ b/v2_adminpanel/routes/admin_routes.py @@ -794,7 +794,12 @@ def license_anomalies(): except Exception as e: flash(f'Fehler beim Laden der Anomalie-Daten: {str(e)}', 'error') - return render_template('license_anomalies.html') + return render_template('license_anomalies.html', + anomalies=[], + anomaly_stats=[], + severity='all', + resolved='false' + ) finally: if 'cur' in locals(): cur.close() @@ -972,3 +977,25 @@ def license_live_stats(): cur.close() if 'conn' in locals(): conn.close() + + +@admin_bp.route("/api/admin/license/auth-token") +@login_required +def get_analytics_token(): + """Get JWT token for accessing Analytics Service""" + import jwt + from datetime import datetime, timedelta + + # Generate a short-lived token for the analytics service + payload = { + 'sub': session.get('user_id', 'admin'), + 'type': 'analytics_access', + 'exp': datetime.utcnow() + timedelta(hours=1), + 'iat': datetime.utcnow() + } + + # Use the same secret as configured in the analytics service + jwt_secret = os.environ.get('JWT_SECRET', 'your-secret-key') + token = jwt.encode(payload, jwt_secret, algorithm='HS256') + + return jsonify({'token': token}) diff --git a/v2_adminpanel/templates/base.html b/v2_adminpanel/templates/base.html index 563572d..8df5398 100644 --- a/v2_adminpanel/templates/base.html +++ b/v2_adminpanel/templates/base.html @@ -434,17 +434,11 @@