diff --git a/README.md b/README.md index cf3abab..f5edf99 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,729 @@ -# JTL-WAFI +# πŸ›‘οΈ JTL-WAFi v2.3 -Die JTL-WAFI. Aktuell hat sie Geoblocking und Bot-Ratelimit funktionalitΓ€t. \ No newline at end of file +**Web Application Firewall fΓΌr JTL-Shops** - Ein verteiltes Bot-Protection und GeoIP-Blocking System mit Echtzeit-Dashboard, WebSocket-Kommunikation und zentraler Verwaltung mehrerer Server. + +![Version](https://img.shields.io/badge/version-2.3.0-blue) +![Python](https://img.shields.io/badge/python-3.8+-green) +![License](https://img.shields.io/badge/license-MIT-orange) + +--- + +## πŸ“‹ Inhaltsverzeichnis + +- [Überblick](#-ΓΌberblick) +- [Features](#-features) +- [Architektur](#-architektur) +- [Voraussetzungen](#-voraussetzungen) +- [Installation](#-installation) + - [Dashboard Server](#1-dashboard-server-zentral) + - [Agent Server](#2-agent-server-pro-shop-server) +- [Konfiguration](#-konfiguration) +- [Verwendung](#-verwendung) + - [Einzelne Shops](#einzelne-shops-verwalten) + - [Massenaktionen](#massenaktionen) + - [Monitoring](#monitoring) +- [API-Referenz](#-api-referenz) +- [WebSocket Events](#-websocket-events) +- [Datenstrukturen](#-datenstrukturen) +- [Troubleshooting](#-troubleshooting) +- [Changelog](#-changelog) + +--- + +## 🎯 Überblick + +JTL-WAFi besteht aus zwei Komponenten: + +| Komponente | Beschreibung | Deployment | +|------------|--------------|------------| +| **Dashboard** | Zentrale Web-OberflΓ€che zur Verwaltung aller Shops | 1x auf Management-Server | +| **Agent** | Lokaler Dienst der das Blocking durchfΓΌhrt | 1x pro Shop-Server | + +### Schutzmodi + +| Modus | Beschreibung | Anwendungsfall | +|-------|--------------|----------------| +| **πŸ€– Bot Rate-Limiting** | Erkennt und limitiert aggressive Bots basierend auf User-Agent-Analyse | Schutz vor Scraping, SEO-Bots, Crawlern | +| **🌍 GeoIP-Blocking** | Blockiert Traffic aus nicht-relevanten Regionen | Shops die nur DACH/EU beliefern | + +--- + +## ✨ Features + +### Dashboard (v2.3) + +#### Übersicht & Monitoring +- **πŸ“Š Echtzeit-Statistiken** - Server online, aktive Shops, Requests/min, aktive Bans +- **πŸ”₯ Top 10 Shops** - Übersicht der Shops mit hΓΆchster Last +- **πŸ“ˆ Bot-AktivitΓ€ts-Graph** - Zeitbasierte Darstellung pro Bot-Typ mit Zeitachse +- **πŸ“œ Live Logs** - Echtzeit Log-Streaming pro Shop +- **πŸ›‘οΈ Link11 Kategorisierung** - Unterscheidung zwischen CDN- und Direkt-Shops + +#### Verwaltung +- **⚑ Massenaktionen** - Alle Shops gleichzeitig aktivieren/deaktivieren +- **πŸ” Sortierbare Shop-Liste** - Nach Requests/min oder aktiven Bans +- **πŸ–₯️ Multi-Agent Support** - Verwaltung beliebig vieler Server von einem Dashboard +- **πŸ” Token-basierte Auth** - Sichere Agent-Freigabe + +#### Technisch +- **WebSocket Real-Time** - Keine Polling, sofortige Updates +- **In-Memory Storage** - Keine Datenbank-Locks, maximale Performance +- **SSL/TLS** - Automatische selbstsignierte Zertifikatsgenerierung +- **Responsive Design** - Funktioniert auf Desktop, Tablet und Mobile + +### Agent (v2.3) + +#### Erkennung & Blocking +- **πŸ” Auto-Discovery** - Findet automatisch alle JTL-Shops auf dem Server +- **πŸ“ Log-Analyse** - Parst Nginx Access-Logs in Echtzeit +- **πŸ€– Bot-Erkennung** - Identifiziert 50+ bekannte Bot-Typen +- **🚫 IP-Banning** - Dynamisches Blocking via iptables +- **🌍 GeoIP-Lookup** - MaxMind GeoLite2 Datenbank + +#### ZuverlΓ€ssigkeit +- **♻️ Auto-Reconnect** - Automatische Wiederverbindung zum Dashboard +- **πŸ”‘ Token-Auth** - Sichere Authentifizierung nach Freigabe +- **⏹️ Graceful Shutdown** - Sauberes Beenden mit Ctrl+C (SIGINT/SIGTERM) +- **πŸ’Ύ Token-Persistenz** - Token wird lokal gespeichert + +--- + +## πŸ— Architektur + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ DASHBOARD SERVER β”‚ +β”‚ (shop000.example.com) β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ jtl_wafi_dashboard.py β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ FastAPI β”‚ β”‚ WebSocket β”‚ β”‚ In-Memory β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ HTTP API β”‚ β”‚ Server β”‚ β”‚ DataStore β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ WSS (Port 8000) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ AGENT SERVER 1 β”‚ β”‚ AGENT SERVER 2 β”‚ β”‚ AGENT SERVER N β”‚ +β”‚ (shop020.xxx) β”‚ β”‚ (shop043.xxx) β”‚ β”‚ (shopXXX.xxx) β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Agent β”‚ β”‚ β”‚ β”‚ Agent β”‚ β”‚ β”‚ β”‚ Agent β”‚ β”‚ +β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ +β”‚ β”‚ Shop A β”‚ β”‚ β”‚ β”‚ Shop D β”‚ β”‚ β”‚ β”‚ Shop X β”‚ β”‚ +β”‚ β”‚ Shop B β”‚ β”‚ β”‚ β”‚ Shop E β”‚ β”‚ β”‚ β”‚ Shop Y β”‚ β”‚ +β”‚ β”‚ Shop C β”‚ β”‚ β”‚ β”‚ Shop F β”‚ β”‚ β”‚ β”‚ Shop Z β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Datenfluss + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Agent β”‚ ──── agent.connect ────────► β”‚ Dashboard β”‚ +β”‚ β”‚ ◄─── auth.approved ───────── β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ ──── agent.heartbeat ──────► β”‚ β”‚ (alle 30s) +β”‚ β”‚ ──── shop.full_update ─────► β”‚ β”‚ +β”‚ β”‚ ──── shop.stats ───────────► β”‚ β”‚ (alle 10s) +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ ◄─── command.activate ────── β”‚ β”‚ +β”‚ β”‚ ◄─── command.deactivate ──── β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ ──── log.entry ────────────► β”‚ β”‚ (live) +β”‚ β”‚ ──── bot.banned ───────────► β”‚ β”‚ (events) +β”‚ β”‚ ──── command.result ───────► β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## πŸ“¦ Voraussetzungen + +### Dashboard Server + +```bash +# Python 3.8+ +python3 --version + +# BenΓΆtigte Pakete +pip3 install fastapi uvicorn websockets python-multipart --break-system-packages + +# OpenSSL fΓΌr Zertifikate +apt install openssl +``` + +### Agent Server + +```bash +# Python 3.8+ +python3 --version + +# BenΓΆtigte Pakete +pip3 install websockets geoip2 watchdog --break-system-packages + +# MaxMind GeoLite2 Datenbank +# Download von: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data +mkdir -p /var/lib/GeoIP +# GeoLite2-Country.mmdb hierhin kopieren + +# iptables fΓΌr IP-Blocking +apt install iptables + +# Nginx (fΓΌr Log-Analyse) +# Muss bereits installiert sein +``` + +--- + +## πŸš€ Installation + +### 1. Dashboard Server (Zentral) + +```bash +# Verzeichnis erstellen +mkdir -p /opt/jtl-wafi +cd /opt/jtl-wafi + +# Dashboard kopieren +cp jtl_wafi_dashboard.py /opt/jtl-wafi/ + +# Datenverzeichnis erstellen +mkdir -p /var/lib/jtl-wafi/ssl + +# Systemd Service installieren +python3 /opt/jtl-wafi/jtl_wafi_dashboard.py --install-service + +# Service aktivieren und starten +systemctl daemon-reload +systemctl enable jtl-wafi +systemctl start jtl-wafi + +# Status prΓΌfen +systemctl status jtl-wafi +``` + +#### Firewall konfigurieren + +```bash +# Port 8000 ΓΆffnen (oder anderen konfigurierten Port) +ufw allow 8000/tcp +# ODER +iptables -A INPUT -p tcp --dport 8000 -j ACCEPT +``` + +#### Erster Login + +1. Browser ΓΆffnen: `https://dashboard-server:8000` +2. SSL-Warnung akzeptieren (selbstsigniertes Zertifikat) +3. Admin-Passwort setzen (mind. 8 Zeichen) +4. Dashboard ist einsatzbereit + +--- + +### 2. Agent Server (Pro Shop-Server) + +```bash +# Verzeichnis erstellen +mkdir -p /opt/jtl-wafi-agent +mkdir -p /etc/jtl-wafi-agent +cd /opt/jtl-wafi-agent + +# Agent kopieren +cp jtl_wafi_agent.py /opt/jtl-wafi-agent/ + +# Systemd Service installieren +python3 /opt/jtl-wafi-agent/jtl_wafi_agent.py --install-service + +# Service konfigurieren (Dashboard URL setzen) +nano /etc/systemd/system/jtl-wafi-agent.service +# ExecStart anpassen: +# ExecStart=/usr/bin/python3 /opt/jtl-wafi-agent/jtl_wafi_agent.py --url wss://DASHBOARD-IP:8000/ws/agent + +# Service aktivieren und starten +systemctl daemon-reload +systemctl enable jtl-wafi-agent +systemctl start jtl-wafi-agent + +# Status prΓΌfen +systemctl status jtl-wafi-agent +``` + +#### Agent freigeben + +1. Im Dashboard erscheint der neue Agent mit Status "🟑 Warte" +2. Auf "βœ“ Freigeben" klicken +3. Agent erhΓ€lt Token und wird "🟒 Online" +4. Token wird automatisch in `/etc/jtl-wafi-agent/token` gespeichert + +--- + +## βš™οΈ Konfiguration + +### Dashboard Umgebungsvariablen + +| Variable | Beschreibung | Standard | +|----------|--------------|----------| +| `DASHBOARD_SECRET` | Session Secret Key | Auto-generiert | + +### Dashboard Kommandozeilen-Optionen + +```bash +python3 jtl_wafi_dashboard.py --help + +Options: + --host TEXT Host zum Binden [default: 0.0.0.0] + --port INTEGER Port [default: 8000] + --no-ssl SSL deaktivieren + --install-service Systemd Service erstellen +``` + +### Agent Kommandozeilen-Optionen + +```bash +python3 jtl_wafi_agent.py --help + +Options: + --url TEXT Dashboard WebSocket URL [required] + --token TEXT Auth Token (optional, wird nach Freigabe gespeichert) + --install-service Systemd Service erstellen +``` + +### Dateipfade + +#### Dashboard +``` +/opt/jtl-wafi/jtl_wafi_dashboard.py # Hauptprogramm +/var/lib/jtl-wafi/config.json # Passwort-Hash +/var/lib/jtl-wafi/tokens.json # Agent-Tokens +/var/lib/jtl-wafi/ssl/server.crt # SSL Zertifikat +/var/lib/jtl-wafi/ssl/server.key # SSL Private Key +``` + +#### Agent +``` +/opt/jtl-wafi-agent/jtl_wafi_agent.py # Hauptprogramm +/etc/jtl-wafi-agent/token # Auth Token +/var/log/jtl-wafi-agent.log # Log-Datei +/var/lib/GeoIP/GeoLite2-Country.mmdb # GeoIP Datenbank +``` + +--- + +## πŸ“– Verwendung + +### Einzelne Shops verwalten + +#### Shop aktivieren (Bot Rate-Limiting) + +1. Shop in der Liste finden +2. "Start" Button klicken +3. Modus wΓ€hlen: "πŸ€– Bot Rate-Limiting" +4. Rate-Limit einstellen (z.B. 30 Requests/min pro Bot) +5. Ban-Dauer einstellen (z.B. 300 Sekunden = 5 Minuten) +6. "Aktivieren" klicken + +#### Shop aktivieren (GeoIP-Blocking) + +1. Shop in der Liste finden +2. "Start" Button klicken +3. Modus wΓ€hlen: "🌍 GeoIP-Blocking" +4. Region wΓ€hlen: + - **DACH**: Deutschland, Γ–sterreich, Schweiz + - **Eurozone**: EU-LΓ€nder + Großbritannien +5. "Aktivieren" klicken + +#### Shop deaktivieren + +1. "Stop" Button beim aktiven Shop klicken +2. BestΓ€tigung +3. Alle Bans werden aufgehoben + +### Massenaktionen + +#### Alle Shops aktivieren + +1. "▢️ Aktivieren..." Button klicken +2. Modus und Parameter wΓ€hlen +3. Filter wΓ€hlen: + - Alle inaktiven Shops + - Nur Direkte (⚑) - ohne Link11 + - Nur Link11 (πŸ›‘οΈ) +4. "Aktivieren" klicken + +#### Alle Shops deaktivieren + +1. "⏹️ Deaktivieren..." Button klicken +2. Filter wΓ€hlen +3. "Deaktivieren" klicken + +### Monitoring + +#### Top 10 Shops + +- Zeigt die 10 Shops mit den meisten Requests/min +- Klick auf einen Shop ΓΆffnet Detail-Modal +- Klick auf Überschrift ΓΆffnet sortierbare Gesamtliste + +#### Shop-Details + +1. Auf Shop-Domain klicken +2. Detail-Modal zeigt: + - **Status, Modus, Region, Rate-Limit, Ban-Dauer, Laufzeit** + - **Aktuelle Stats**: Req/min, Aktive Bans, Total Bans + - **Bot-AktivitΓ€ts-Graph**: Zeitverlauf pro Bot-Typ + - **Top Bots**: Meistaktive Bots + - **Gebannte Bots**: Aktuell gesperrte Bot-Typen + +#### Live Logs + +1. πŸ“œ Icon beim Shop klicken +2. Log-Panel ΓΆffnet sich unten +3. Echtzeit-Anzeige der Log-EintrΓ€ge +4. Farbkodierung: + - **Rot**: BANNED Events + - **Gelb**: BLOCKED Events + - **Grau**: Normale Requests + +--- + +## πŸ”Œ API-Referenz + +### HTTP Endpoints + +| Method | Endpoint | Beschreibung | +|--------|----------|--------------| +| `GET` | `/` | Dashboard HTML | +| `POST` | `/setup` | Initiales Passwort setzen | +| `POST` | `/login` | Anmeldung | +| `GET` | `/logout` | Abmeldung | +| `POST` | `/api/agents/{id}/approve` | Agent freigeben | +| `POST` | `/api/shops/activate` | Shop aktivieren | +| `POST` | `/api/shops/deactivate` | Shop deaktivieren | +| `POST` | `/api/shops/bulk-activate` | Massenaktivierung | +| `POST` | `/api/shops/bulk-deactivate` | Massendeaktivierung | +| `POST` | `/api/change-password` | Passwort Γ€ndern | +| `GET` | `/api/shop/{domain}/history` | Shop-Historie | + +### Aktivierung Parameter + +``` +POST /api/shops/activate +Content-Type: application/x-www-form-urlencoded + +domain=example.com +mode=bot|geoip +geo_region=dach|eurozone # nur bei mode=geoip +rate_limit=30 # nur bei mode=bot +ban_duration=300 # nur bei mode=bot (Sekunden) +``` + +### Massenaktivierung Parameter + +``` +POST /api/shops/bulk-activate +Content-Type: application/x-www-form-urlencoded + +mode=bot|geoip +geo_region=dach|eurozone +rate_limit=30 +ban_duration=300 +filter_type=all|direct|link11 +``` + +--- + +## πŸ“‘ WebSocket Events + +### Endpoint: `/ws/agent` (Agent β†’ Dashboard) + +| Event | Richtung | Beschreibung | +|-------|----------|--------------| +| `agent.connect` | Agent β†’ Dashboard | Agent-Registrierung | +| `agent.heartbeat` | Agent β†’ Dashboard | System-Status (alle 30s) | +| `shop.full_update` | Agent β†’ Dashboard | Alle Shop-Daten | +| `shop.stats` | Agent β†’ Dashboard | Shop-Statistiken (alle 10s) | +| `log.entry` | Agent β†’ Dashboard | Log-Zeile (bei Subscription) | +| `bot.banned` | Agent β†’ Dashboard | Ban-Event | +| `command.result` | Agent β†’ Dashboard | Kommando-Ergebnis | +| `auth.approved` | Dashboard β†’ Agent | Token nach Freigabe | +| `command.activate` | Dashboard β†’ Agent | Shop aktivieren | +| `command.deactivate` | Dashboard β†’ Agent | Shop deaktivieren | +| `log.subscribe` | Dashboard β†’ Agent | Log-Streaming starten | +| `log.unsubscribe` | Dashboard β†’ Agent | Log-Streaming stoppen | + +### Endpoint: `/ws/dashboard` (Browser β†’ Dashboard) + +| Event | Richtung | Beschreibung | +|-------|----------|--------------| +| `initial_state` | Dashboard β†’ Browser | Initialer Zustand | +| `refresh` | Dashboard β†’ Browser | Aktualisierte Daten | +| `agent.online` | Dashboard β†’ Browser | Agent online | +| `agent.offline` | Dashboard β†’ Browser | Agent offline | +| `agent.pending` | Dashboard β†’ Browser | Agent wartet auf Freigabe | +| `agent.approved` | Dashboard β†’ Browser | Agent freigegeben | +| `shop.full_update` | Dashboard β†’ Browser | Shop-Update | +| `shop.stats` | Dashboard β†’ Browser | Stats-Update | +| `shop_history` | Dashboard β†’ Browser | Historie fΓΌr Graph | +| `top_shops` | Dashboard β†’ Browser | Top 10 Shops | +| `all_shops_sorted` | Dashboard β†’ Browser | Alle Shops sortiert | +| `log.entry` | Dashboard β†’ Browser | Log-Zeile | +| `bot.banned` | Dashboard β†’ Browser | Ban-Notification | +| `command.result` | Dashboard β†’ Browser | Kommando-Ergebnis | +| `get_shop_history` | Browser β†’ Dashboard | Historie anfordern | +| `get_all_shops_sorted` | Browser β†’ Dashboard | Sortierte Liste anfordern | +| `log.subscribe` | Browser β†’ Dashboard | Logs abonnieren | +| `log.unsubscribe` | Browser β†’ Dashboard | Logs abbestellen | + +--- + +## πŸ“Š Datenstrukturen + +### Agent Connect + +```json +{ + "type": "agent.connect", + "data": { + "agent_id": "a1b2c3d4e5f6", + "hostname": "shop020.jtl-hosting.de", + "token": "stored-token-or-null", + "version": "2.3.0", + "os_info": { + "system": "Linux", + "release": "5.15.0", + "hostname": "shop020" + }, + "shops_summary": { + "total": 25, + "active": 12 + } + } +} +``` + +### Shop Stats + +```json +{ + "type": "shop.stats", + "data": { + "domain": "example.com", + "stats": { + "log_entries": 15234, + "total_bans": 47, + "active_bans": 3, + "banned_bots": ["AhrefsBot", "SemrushBot"], + "req_per_min": 45.7, + "unique_ips": 234, + "unique_bots": 12, + "top_bots": { + "Googlebot": 523, + "bingbot": 234, + "AhrefsBot": 189 + }, + "top_ips": { + "66.249.66.1": 145, + "157.55.39.1": 98 + } + } + } +} +``` + +### Command Activate + +```json +{ + "type": "command.activate", + "data": { + "command_id": "cmd_abc123", + "shop": "example.com", + "mode": "bot", + "geo_region": null, + "rate_limit": 30, + "ban_duration": 300 + } +} +``` + +--- + +## πŸ”§ Troubleshooting + +### Dashboard startet nicht + +```bash +# Logs prΓΌfen +journalctl -u jtl-wafi -f + +# HΓ€ufige Ursachen: +# 1. Port bereits belegt +lsof -i :8000 + +# 2. Python-Pakete fehlen +pip3 install fastapi uvicorn websockets python-multipart --break-system-packages + +# 3. SSL-Verzeichnis fehlt +mkdir -p /var/lib/jtl-wafi/ssl +``` + +### Agent verbindet nicht + +```bash +# Logs prΓΌfen +journalctl -u jtl-wafi-agent -f + +# HΓ€ufige Ursachen: +# 1. Dashboard nicht erreichbar +curl -k https://dashboard:8000/ + +# 2. Firewall blockiert +telnet dashboard 8000 + +# 3. SSL-Zertifikat Problem (selbstsigniert) +# Agent akzeptiert selbstsignierte Zertifikate automatisch +``` + +### Agent wird nicht freigegeben + +```bash +# Token manuell lΓΆschen und neu verbinden +rm /etc/jtl-wafi-agent/token +systemctl restart jtl-wafi-agent +``` + +### Shops werden nicht erkannt + +```bash +# Agent Logs prΓΌfen +journalctl -u jtl-wafi-agent | grep -i shop + +# Nginx Konfiguration prΓΌfen +ls -la /etc/nginx/sites-enabled/ + +# Shop-Verzeichnisse prΓΌfen +ls -la /var/www/ +``` + +### Bans funktionieren nicht + +```bash +# iptables Regeln prΓΌfen +iptables -L -n | grep -i drop + +# Berechtigungen prΓΌfen (Agent braucht root) +whoami +# Muss "root" sein +``` + +### GeoIP funktioniert nicht + +```bash +# Datenbank prΓΌfen +ls -la /var/lib/GeoIP/GeoLite2-Country.mmdb + +# Download falls fehlend +# https://dev.maxmind.com/geoip/geolite2-free-geolocation-data +``` + +### Dashboard reagiert langsam + +```bash +# WebSocket Verbindungen prΓΌfen +ss -tuln | grep 8000 + +# Memory-Nutzung prΓΌfen +ps aux | grep jtl_wafi + +# Bei vielen Agents: Connection-Limits erhΓΆhen +ulimit -n 65535 +``` + +--- + +## πŸ“ Changelog + +### v2.3.0 (2024-12-19) + +#### Neue Features +- **πŸ”₯ Top 10 Shops** - Neue Übersichtskarte mit meistbelasteten Shops +- **πŸ“Š Sortierbare Shop-Liste** - Modal mit allen Shops, sortierbar nach Requests oder Bans +- **πŸ“ˆ Bot-AktivitΓ€ts-Graph** - Mehrere Linien pro Bot-Typ mit Zeitachse +- **πŸ”„ Rebranding** - Umbenannt zu "JTL-WAFi" + +#### Verbesserungen +- Dropdown bei Massenaktionen entfernt (Filter jetzt im Modal) +- Laufzeit-Anzeige korrigiert +- Graph zeigt jetzt Uhrzeiten auf X-Achse +- Agent-Logging verbessert (zeigt Rate-Limit statt Region bei Bot-Mode) + +#### Fixes +- Laufzeit wird jetzt korrekt angezeigt +- Graph-Skalierung verbessert + +### v2.2.0 (2024-12-19) + +#### Architektur-Γ„nderung +- **In-Memory Storage** statt SQLite fΓΌr Echtzeit-Daten +- Keine "database is locked" Fehler mehr +- Massiv verbesserte Performance bei vielen Agents + +#### Neue Features +- Passwort in JSON-Datei statt Datenbank +- Agent-Tokens in JSON-Datei statt Datenbank + +### v2.1.0 (2024-12-19) + +#### Neue Features +- **Link11 Kategorisierung** - Shops werden nach CDN/Direkt getrennt +- **Bulk Actions** - Massenaktivierung/-deaktivierung +- **Shop Detail Modal** - AusfΓΌhrliche Statistiken und Graph +- **Password Change** - Passwort im Dashboard Γ€ndern +- **Live Clock** - Echtzeit-Uhr im Header +- **Shop Link Button** - Direktlink zum Shop + +#### Fixes +- Agent Ctrl+C Shutdown funktioniert jetzt sofort +- Asyncio Signal Handler korrekt implementiert + +### v2.0.0 (2024-12-19) + +#### Komplett neu +- WebSocket-basierte Architektur +- Echtzeit-Updates ohne Polling +- Multi-Agent Support +- Neue moderne UI + +--- + +## πŸ“„ Lizenz + +MIT License - siehe [LICENSE](LICENSE) + +--- + +## 🀝 Contributing + +1. Fork erstellen +2. Feature Branch (`git checkout -b feature/AmazingFeature`) +3. Commit (`git commit -m 'Add AmazingFeature'`) +4. Push (`git push origin feature/AmazingFeature`) +5. Pull Request erstellen + +--- + +## πŸ“ž Support + +Bei Fragen oder Problemen: +- GitHub Issues ΓΆffnen +- Logs beifΓΌgen (`journalctl -u jtl-wafi -n 100`) + +--- + +**Made with ❀️ for JTL-Shop Hosting** \ No newline at end of file