# πŸ›‘οΈ JTL-WAFi v2.3 **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**