Files
geoip_shop_manager/README.md
2025-12-16 13:06:42 +01:00

580 lines
20 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# GeoIP Shop Blocker Manager - DACH & Eurozone Version
**PHP-basiertes System für temporäres GeoIP-Blocking und Bot-Rate-Limiting auf Plesk-Servern**
Dieses Tool ermöglicht es, einzelne oder alle Shops auf einem Plesk-Server temporär für alle Zugriffe außerhalb der konfigurierten Region zu sperren, oder Bots nach Bot-Typ zu rate-limitieren.
## 🎯 Features
-**Flexible Regionen**: DACH (DE, AT, CH) oder Eurozone+GB (22 Länder)
-**Bot-Rate-Limiting nach Bot-Typ**: Alle Requests eines Bot-Typs teilen sich EIN Limit
-**Umfangreiche Bot-Erkennung**: 321 bekannte Bot-Patterns + 32 generische Fallback-Patterns
-**Präzises Blocking**: PHP prüft gegen vollständige IP-Ranges (keine Fehlblockierungen)
-**Zwei Modi**: GeoIP-Blocking oder Bot-Rate-Limiting
-**Multi-Shop-Management**: Verwaltung mehrerer Shops auf einem Server
-**Bulk-Operationen**: Alle Shops gleichzeitig aktivieren/deaktivieren
-**Link11-Erkennung**: Automatische Erkennung ob Shop hinter Link11 CDN steht
-**Nur direkte Shops**: Option um nur Shops ohne CDN-Schutz zu aktivieren
-**Gesamtübersicht**: Logs und Statistiken über alle Shops hinweg
-**Auto-Deaktivierung**: Blocking läuft nach 72 Stunden automatisch ab
-**Sauberes Cleanup**: Vollständige Deinstallation bei Deaktivierung
-**Plesk-kompatibel**: Funktioniert mit Plesk-verwalteten Shops
-**CDN-kompatibel**: Funktioniert mit Link11, Cloudflare & Co.
-**Fail-Open**: Bei Cache-Fehlern wird Traffic durchgelassen (keine Ausfälle)
## 🏗️ Architektur
### Modus 1: GeoIP-Blocking 🌍
- PHP-Script wird in die `index.php` des Shops integriert
- Lädt IP-Ranges von ipdeny.com (konfigurierte Länder)
- Prüft jede Anfrage gegen diese Ranges
- Blockt nicht-erlaubte IPs sofort mit HTTP 403
- Loggt alle Blocks
### Modus 2: Bot-Rate-Limiting 🤖
- Shop bleibt weltweit erreichbar
- Erkennt Bots anhand von User-Agent Patterns
- **Rate-Limit gilt PRO BOT-TYP** (nicht pro IP!)
- Alle Googlebot-Requests teilen sich EIN Limit
- Bei Überschreitung: Gesamter Bot-Typ wird temporär gebannt
## 🚦 Rate-Limiting (Bot-Only Modus)
### Funktionsweise
```
Bot-Request kommt rein
┌───────────────────┐
│ Bot-Typ gebannt? │──── Ja ───▶ 403 + Exit (sofort)
└───────────────────┘
│ Nein
┌───────────────────┐
│ Bot erkannt? │──── Nein ──▶ Weiter (normaler Traffic)
└───────────────────┘
│ Ja
┌───────────────────┐
│ Bot-Typ Counter │
│ erhöhen │
│ Limit erreicht? │──── Ja ───▶ Bot-Typ bannen + 403
└───────────────────┘
│ Nein
Log + Weiter ✅
(Bot darf durch!)
```
### Wichtig: Rate-Limit pro Bot-Typ
**Alle Requests eines Bot-Typs teilen sich EINEN Zähler**, unabhängig von:
- Der IP-Adresse
- Der genauen User-Agent Variante
Beispiel mit Limit 30 req/min:
| Request | IP | User-Agent | Bot-Typ | Zähler |
|---------|-----|-----------|---------|--------|
| 1 | 1.1.1.1 | Googlebot/2.1 | Googlebot | 1/30 |
| 2 | 2.2.2.2 | Googlebot/2.1 (+http...) | Googlebot | 2/30 |
| 3 | 3.3.3.3 | Googlebot-Image/1.0 | Googlebot-Image | 1/30 |
| ... | ... | ... | ... | ... |
| 31 | 99.99.99.99 | Googlebot/2.1 | Googlebot | **31/30 → BAN** |
Nach dem Ban werden **ALLE** Googlebot-Requests geblockt (egal welche IP).
### Konfiguration bei Aktivierung
```
🚦 Rate-Limit Konfiguration:
(0 = Bots sofort bannen, kein Rate-Limiting)
⚠️ ACHTUNG: Limit gilt pro Bot-TYP, nicht pro IP!
Requests pro Minute bevor Ban [30]:
Ban-Dauer in Minuten [5]:
✅ Rate-Limit: 30 req/min pro Bot-Typ
✅ Ban-Dauer: 5 Minuten
```
### Technische Details
- **Identifier**: MD5-Hash des erkannten Bot-Namens (z.B. `md5("Googlebot")`)
- **Speicherung**: File-basiert in `geoip_ratelimit/` Verzeichnis
- **Ban-Format**: `timestamp|botname` (ermöglicht Anzeige des Bot-Namens)
- **Cleanup**: Probabilistisch (1% der Requests) um Overhead zu minimieren
- **Atomare Operationen**: File-Locking verhindert Race Conditions
### Verzeichnisstruktur
```
httpdocs/
├── geoip_ratelimit/
│ ├── bans/
│ │ └── {bot_hash}.ban # Format: unix_timestamp|bot_name
│ └── counts/
│ └── {bot_hash}.count # Format: window_start|count
```
## 🤖 Erkannte Bot-Patterns
Das System erkennt **321 verschiedene Bots** in 12 Kategorien, plus **32 generische Fallback-Patterns** für unbekannte Bots.
### Bot-Kategorien
| Kategorie | Anzahl | Beispiele |
|-----------|--------|-----------|
| **AI/LLM Services** | 61 | ChatGPT-User, GPTBot, ClaudeBot, Anthropic, PerplexityBot, Gemini-Deep-Research, Google-NotebookLM, Cohere, MistralAI, DeepSeekBot, Bytespider, HuggingFace, Diffbot, BedrockBot, Firecrawl, Crawl4AI |
| **Suchmaschinen** | 36 | Googlebot, Googlebot-Image/Video/News, Google-Extended, Bingbot, BingPreview, MSNBot, Baiduspider, YandexBot, DuckDuckBot, Applebot, Yahoo Slurp, Sogou, NaverBot, BraveBot, QwantBot, PetalBot |
| **SEO & Marketing** | 15 | AhrefsBot, SemrushBot, MJ12Bot, DotBot, RogerBot, Screaming Frog, BLEXBot, DataForSEOBot, Linkdex, SearchmetricsBot |
| **Social Media** | 21 | FacebookBot, Meta-ExternalAgent, Twitterbot, Instagram, LinkedInBot, Pinterestbot, WhatsApp, TelegramBot, DiscordBot, Slackbot, RedditBot, Snapchat |
| **E-Commerce** | 15 | Amazonbot, Amazon-Kendra, AmazonBuyForMe, Shopify, Idealo, Billiger.de, Guenstiger.de, Ladenzeile, Kelkoo, PriceRunner, PriceGrabber |
| **Archiv & Research** | 6 | Archive.org Bot, Internet Archive, Wayback Machine, Heritrix, Apache Nutch, Common Crawl |
| **Monitoring & Uptime** | 9 | UptimeRobot, Pingdom, StatusCake, Site24x7, NewRelic, Datadog, GTmetrix, PageSpeed Insights, Chrome Lighthouse |
| **Download & Scraper** | 48 | HTTrack, Teleport Pro, WebCopier, SiteSucker, ScrapeBox, Xenu, Grabber, Harvest, Collector, WebZIP, BlackWidow |
| **HTTP Libraries** | 32 | Python-Requests, Python-urllib, cURL, Wget, Go-HTTP-Client, Axios, Node-Fetch, Scrapy, OkHttp, Guzzle, libwww-perl, Mechanize |
| **Security Scanner** | 11 | Nessus, SQLMap, Netsparker, Nikto, Acunetix, Burp Suite, OWASP ZAP, OpenVAS, Nmap, Masscan, WPScan |
| **Headless & Automation** | 7 | PhantomJS, Headless Chrome, Selenium, Puppeteer, Playwright, Cypress |
| **Feed Reader & RSS** | 5 | FeedFetcher, FeedParser, Feedly, Inoreader, NewsBlur |
| **Weitere Bots** | 55 | OmgiliBot, Webzio, Linguee, QuillBot, TurnitinBot, Brandwatch, Meltwater, BitlyBot, Mail.ru Bot, und viele mehr |
### Generische Fallback-Patterns
Falls ein Bot nicht in der spezifischen Liste ist, wird er trotzdem erkannt wenn sein User-Agent eines dieser Schlüsselwörter enthält:
```
bot, crawler, spider, scraper, fetch, scan, check, monitor, probe, index,
archive, capture, reader, download, mirror, ripper, collector, extractor,
siphon, copier, sucker, bandit, stripper, whacker, reaper, robot, agent,
seeker, finder, walker, roam, snagger
```
Diese werden dann als `Bot (crawler)`, `Bot (spider)`, etc. angezeigt.
## 📋 Voraussetzungen
- **Betriebssystem**: Ubuntu Server (getestet auf 24.04)
- **Webserver**: Apache mit mod_rewrite (oder nginx)
- **PHP**: Version 8.0 oder höher
- **Python**: Version 3.8 oder höher
- **Plesk**: Optional, aber empfohlen
- **Root-Zugriff**: Erforderlich für Installation und Verwaltung
## 🚀 Installation
### 1. Script herunterladen
```bash
# Als root
cd /root
wget https://git.jtl-hosting.de/thomasciesla/geoip_shop_manager/raw/branch/main/geoip_shop_manager.py
chmod +x geoip_shop_manager.py
```
### 2. Script ausführen
```bash
python3 geoip_shop_manager.py
```
Das war's! Das Script ist vollständig selbstverwaltend.
## 📖 Verwendung
### Hauptmenü
```
============================================================
GeoIP Shop Blocker Manager v4.0.0
🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Rate-Limiting
🛡️ Mit Cache-Validierung und Fail-Open
🚦 Rate-Limiting nach BOT-TYP (nicht IP)
============================================================
[1] Aktivieren (einzeln)
[2] Deaktivieren (einzeln)
[3] Logs anzeigen
[4] Status
────────────────────────────────────────
[5] 🚀 ALLE aktivieren
[6] 🛑 ALLE deaktivieren
[7] 🎯 Nur DIREKTE aktivieren (ohne Link11)
────────────────────────────────────────
[0] Beenden
```
### Modus-Auswahl
Bei jeder Aktivierung wird nach dem Modus gefragt:
```
🔧 Wähle den Blocking-Modus:
[1] 🌍 GeoIP-Blocking (nur erlaubte Regionen)
[2] 🤖 Bot-Rate-Limiting (weltweit erreichbar, Bots limitiert)
Modus wählen [1/2]:
```
**Wann welchen Modus wählen?**
| Situation | Empfohlener Modus |
|-----------|-------------------|
| Nur bestimmte Länder erlauben | GeoIP-Blocking 🌍 |
| Weltweit erreichbar bleiben, nur Bots bremsen | Bot-Rate-Limiting 🤖 |
| Aggressive Bots stoppen (verteilt über viele IPs) | Bot-Rate-Limiting 🤖 |
### Geo-Region wählen (nur GeoIP-Modus)
```
🌍 Wähle die Geo-Region:
[1] 🇩🇪🇦🇹🇨🇭 DACH - Deutschland, Österreich, Schweiz
[2] 🇪🇺 Eurozone+GB - 22 Länder
Region wählen [1/2]:
```
### Beispielausgabe: Bot-Only Aktivierung
```
🔧 Aktiviere 🤖 Bot-Only für: shop.example.com
Modus: Bot-Rate-Limiting nach Bot-Typ (weltweit erreichbar)
Rate-Limit: 30 req/min pro Bot-Typ, Ban: 5 min
============================================================
[1/3] Aktiviere PHP-Blocking...
✅ PHP-Blocking aktiviert
[2/3] Cache-Generierung nicht erforderlich (Bot-Only)
[3/3] Registriere Shop...
============================================================
✅ 🤖 Bot-Only aktiviert
Shop: shop.example.com
Modus: Bot-Rate-Limiting 🤖
🤖 321 Bot-Patterns + 32 generische Patterns
🚦 Rate-Limit: 30 req/min PRO BOT-TYP
⏱️ Ban-Dauer: 5 min
Alle Googlebot-Requests teilen sich EIN Limit!
Gültig bis: 2025-12-19 19:30:00 CET
============================================================
```
### Logs anzeigen - Gesamtübersicht
```
══════════════════════════════════════════════════════════════════════
📊 GESAMTÜBERSICHT ALLER SHOPS
══════════════════════════════════════════════════════════════════════
Grün = hinter Link11 | Rot = Direkt
🚫 AKTUELL GEBANNTE BOT-TYPEN: AhrefsBot, Bytespider (TikTok/ByteDance), SemrushBot
📝 Log-Einträge gesamt: 1,234 (⌀ 5.2 req/min, Laufzeit: 3h 57m)
├─ shop1.example.com 🤖 🤖: 456 (3.8 req/min, seit 2h 0m) ███████
│ ├─➤ Googlebot: 234x, 1.9 req/min
│ ├─➤ Bingbot (Microsoft): 123x, 1.0 req/min
│ └─➤ AhrefsBot: 99x, 0.8 req/min
├─ shop2.example.com 🤖 🤖: 778 (6.5 req/min, seit 2h 0m) █████████████
│ ├─➤ Bytespider (TikTok/ByteDance): 456x, 3.8 req/min
│ ├─➤ GPTBot (OpenAI): 189x, 1.6 req/min
│ └─➤ ClaudeBot (Anthropic): 133x, 1.1 req/min
🚫 Rate-Limit Bans: 5 ausgelöst, 3 Bot-Typen aktuell gebannt
├─ shop1.example.com: 2 bans (1 Bot-Typen aktiv) █
│ └─🚫 AhrefsBot
├─ shop2.example.com: 3 bans (2 Bot-Typen aktiv) █
│ └─🚫 Bytespider (TikTok/ByteDance)
│ └─🚫 SemrushBot
🤖 Bot-Statistik nach Bot-Typ (alle Shops):
Googlebot: 456x ███████████████████████████████████████
Bytespider (TikTok/ByteDance): 389x ████████████████████████████████
Bingbot (Microsoft): 234x ███████████████████
GPTBot (OpenAI): 189x ███████████████
...
```
### Logs anzeigen - Einzelner Shop
```
══════════════════════════════════════════════════════════════════════
📊 shop.example.com | 🤖 Bot-Only 🤖
══════════════════════════════════════════════════════════════════════
⏱️ Laufzeit: 2h 15m
📈 Log-Einträge: 1,234 (9.1 req/min)
🤖 Bot-Patterns: 321 + 32 generische
🚦 Rate-Limit: 30 req/min PRO BOT-TYP, Ban: 5 min
🚫 Bans: 3 ausgelöst, 2 Bot-Typen aktuell gebannt
Gebannt: AhrefsBot, Bytespider (TikTok/ByteDance)
🤖 Bot-Statistik (nach Bot-Typ):
Googlebot: 456x ███████████████████████████████████████
Bingbot (Microsoft): 234x ███████████████████
GPTBot (OpenAI): 189x ███████████████
AhrefsBot: 123x ██████████
...
```
### Status anzeigen
```
📊 5/15 Shops aktiv
shop1.example.com [Link11] 🇩🇪🇦🇹🇨🇭 🌍
523 blocks, 1h 41m, Cache: ✅8,234
shop2.example.com [Direkt] 🤖 🤖
1,234 log entries, 2h 15m, 321 Patterns, 30 req/min/Bot-Typ, 🚫 AhrefsBot, SemrushBot
shop3.example.com [Direkt] 🇪🇺 🌍
312 blocks, 1h 39m, Cache: ✅12,456
```
## 🔧 Erweiterte Verwendung
### Rate-Limit Dateien prüfen
```bash
# Aktive Bans anzeigen (mit Bot-Namen)
for f in /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban; do
[ -f "$f" ] && echo "$(cat $f)"
done
# Request-Counter anzeigen
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/ -name "*.count" -exec cat {} \;
# Anzahl aktiver Bans
find /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/ -name "*.ban" | wc -l
```
### Manuell einen Bot-Typ entbannen
```bash
# Alle Bans löschen für einen Shop
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/bans/*.ban
# Alle Counter zurücksetzen
rm -f /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/counts/*.count
```
## 📁 Dateistruktur
### Pro Shop (in `/var/www/vhosts/SHOP/httpdocs/`)
**GeoIP-Modus:**
- `index.php.geoip_backup` - Backup der Original index.php
- `geoip_blocking.php` - PHP-Blocking-Script
- `geoip_ip_ranges.cache` - Gecachte IP-Ranges (erneuert alle 24h)
- `geoip_blocked.log` - Log der Blocks
**Bot-Only Modus:**
- `index.php.geoip_backup` - Backup der Original index.php
- `geoip_blocking.php` - PHP-Blocking-Script
- `geoip_blocked.log` - Log der Bot-Requests und Bans
- `geoip_ratelimit/` - Rate-Limit Verzeichnis
- `bans/` - Aktive Bans (`.ban` Dateien, Format: `timestamp|botname`)
- `counts/` - Request-Counter (`.count` Dateien)
### System-weit
- `/var/lib/geoip/active_shops.json` - Tracking aktiver Shops
## ⚙️ Konfiguration
### Blocking-Dauer ändern
Standardmäßig 72 Stunden. Zum Ändern editiere das Python-Script:
```python
expiry = datetime.now() + timedelta(hours=72) # Hier ändern
```
### Rate-Limit Defaults ändern
```python
# Am Anfang des Scripts
DEFAULT_RATE_LIMIT = 30 # Requests pro Minute pro Bot-Typ
DEFAULT_BAN_DURATION = 5 # Minuten
```
### Weitere Länder hinzufügen
Editiere `GEO_REGIONS` im Python-Script:
```python
GEO_REGIONS = {
"dach": {
"countries": ["de", "at", "ch"], # Hier Länder hinzufügen
...
},
...
}
```
### Link11-IP ändern
```python
# Am Anfang des Scripts
LINK11_IP = "128.65.223.106" # Hier ändern
```
## 🛡️ Sicherheit
### Was wird geblockt?
**GeoIP-Modus:**
- ✅ Alle IPs außerhalb der konfigurierten Region
- ✅ Sofortiger 403 Response
**Bot-Only Modus:**
- ✅ Erkannte Bot-Typen die das Rate-Limit überschreiten
- ✅ Temporärer Ban für den gesamten Bot-Typ
- ❌ Bots unter dem Limit werden durchgelassen (gewollt!)
### Was wird NICHT geblockt?
- ✅ Alle IPs aus den erlaubten Ländern (GeoIP-Modus)
- ✅ Normaler User-Traffic (Bot-Only Modus)
- ✅ Bots unter dem Rate-Limit (Bot-Only Modus)
- ✅ Private IPs (192.168.x.x, 10.x.x.x, etc.)
- ✅ Localhost (127.0.0.1)
## 🐛 Troubleshooting
### Shop zeigt 500 Error
```bash
# Prüfe PHP-Fehler-Log
tail -50 /var/www/vhosts/SHOP/logs/error_log
# Stelle Original-Index wieder her
cd /var/www/vhosts/SHOP/httpdocs
mv index.php.geoip_backup index.php
```
### Rate-Limit funktioniert nicht
```bash
# Prüfe Verzeichnis-Berechtigungen
ls -la /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
# Sollte 777 sein (PHP läuft als anderer User)
# Falls nicht:
chmod -R 777 /var/www/vhosts/SHOP/httpdocs/geoip_ratelimit/
```
### Bots werden nicht erkannt
Prüfe ob der User-Agent in den Bot-Patterns enthalten ist:
```bash
# Im Log nach unbekannten Bots suchen
grep "Bot (.*)" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
```
Unbekannte Bots werden als `Bot (crawler)`, `Bot (spider)`, etc. erkannt, wenn sie generische Keywords enthalten.
### Rate-Limit Verzeichnisse sind leer trotz Bot-Traffic
**Berechtigungsproblem!** Das Python-Script läuft als root, aber PHP läuft als Domain-User.
```bash
# Quick-Fix für alle Shops:
for dir in /var/www/vhosts/*/httpdocs/geoip_ratelimit; do
[ -d "$dir" ] && chmod -R 777 "$dir" && echo "Fixed: $dir"
done
```
## 📊 Performance
### PHP-Level Blocking (GeoIP)
- **Overhead pro Request**: ~2-8ms (bei gecachten IP-Ranges)
- **Erster Request**: ~400-800ms (beim Download der IP-Ranges)
- **Cache-Dauer**: 24 Stunden
- **RAM-Verbrauch**: ~5-10 MB pro Shop
### Bot-Rate-Limiting
- **Overhead pro Request**: ~1-3ms (File-I/O)
- **Ban-Check**: ~0.5ms (schneller Pfad)
- **Cleanup**: Probabilistisch (1% der Requests)
## 📝 Logs und Monitoring
### PHP-Level Logs
```bash
# Alle Log-Einträge für einen Shop
tail -f /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BANNED Einträge (Rate-Limit überschritten)
grep "BANNED:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BOT Einträge (unter Limit, durchgelassen)
grep "BOT:" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
# Nur BLOCKED Einträge (bereits gebannter Bot)
grep "BLOCKED (banned):" /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log
```
### Bot-Statistik erstellen
```bash
# Top 10 Bots (aus Log)
grep -oP '(BOT|BANNED): \K[^|]+' /var/www/vhosts/SHOP/httpdocs/geoip_blocked.log | \
sed 's/ //g' | sort | uniq -c | sort -rn | head -10
```
## 📚 Changelog
### v4.0.0
- **BREAKING**: CrowdSec-Integration komplett entfernt
- **BREAKING**: Rate-Limiting jetzt nach **Bot-Typ** statt IP+UA
- **NEU**: Alle Requests eines Bot-Typs teilen sich EIN Limit
- **NEU**: Ban-Dateien speichern Bot-Namen (`timestamp|botname`)
- **NEU**: Anzeige der aktuell gebannten Bot-Typen mit Namen
- **NEU**: Top 3 Bot-Typen pro Shop in Gesamtübersicht
- **NEU**: Vereinfachte Modi: nur noch `geoip` und `bot`
- **ENTFERNT**: Watcher-Service (nicht mehr benötigt)
- **ENTFERNT**: CrowdSec Queue-Dateien
- **ENTFERNT**: Alle CrowdSec-Funktionen
### v3.5.0
- Erweiterte Bot-Erkennung mit **321 Bot-Patterns**
- 12 Bot-Kategorien
- **32 generische Fallback-Patterns**
### v3.4.x
- Rate-Limit Logik korrigiert
- Verzeichnis-Berechtigungen (0o777)
- Bot-Namen in Statistiken
### v3.3.0
- Option [7] - Nur direkte Shops aktivieren
- Link11-Erkennung per DNS-Lookup
- Farbcodierung im Menü
### v3.2.0
- Bot-Only Blocking Modus
- 4 Blocking-Modi
### v3.1.0
- Eurozone+GB Region (22 Länder)
- Cache-Validierung
- Fail-Open Mechanismus
### v3.0.0
- DACH-Support
- CrowdSec-Integration
- Multi-Shop-Management
---
**Version**: 4.0.0
**Letztes Update**: Dezember 2025
**Status**: Production Ready ✅
**Bot-Patterns**: 321 spezifisch + 32 generisch = 353 total
**Rate-Limiting**: Pro Bot-Typ (nicht pro IP)
**Erlaubte Regionen**: 🇩🇪🇦🇹🇨🇭 DACH | 🇪🇺 Eurozone+GB | 🤖 Bot-Only (weltweit)