- WordPress 6.9.1 + Blocksy Theme deployed - Kategorien Rubrik 1-4 angelegt mit Navigation - Cloudflare Tunnel für deutschlandblog.orbitalo.net - WP Application Password in .env - STATE.md aktualisiert Made-with: Cursor
8.1 KiB
STATE: Flugpreisscanner
Stand: 26.02.2026
Status
🚀 In Betrieb — seit 25.02.2026
| Komponente | Status |
|---|---|
| flugscanner-hub | ✅ Läuft (Docker: web + scheduler) |
| flugscanner-asia | ✅ Läuft (Docker: agent + noVNC) |
| flugscanner-mu | ✅ Läuft (Docker: agent + noVNC) |
| Forgejo-Repo | ✅ http://100.89.246.60:3000/orbitalo/flugpreisscanner |
| Dashboard | ✅ http://100.92.161.97:8080 |
| Telegram Bot | ✅ @CX_HKG_Alert_bot — Alerts + /preis + /best + /status |
Kernidee
Täglich günstigste Flüge FRA → KTI (Frankfurt → Phnom Penh) automatisch finden. Kabine: Economy · Gepäck: 1 Koffer + Handgepäck · Aufenthalt: ~2 Monate Fokus: Cathay Pacific (CX) via Hong Kong — beste Preis-Leistung in Economy. KI wertet aus: jetzt buchen oder warten? Scraping läuft bewusst von Heimnetz-IPs — nicht von Hetzner (Datacenter-IPs werden geblockt).
Route: 🇭🇰 HKG Stopover — Multi-City FRA→HKG (1–2 Nächte) → KTI → FRA. Realistischer Preis: 900–1.050 EUR Roundtrip Economy.
Container
| CT | Name | Server | LAN-IP | Tailscale-IP | Aufgabe |
|---|---|---|---|---|---|
| 115 | flugscanner-hub |
pve-hetzner | 10.10.10.115 | 100.92.161.97 | Gehirn: Dashboard + Scheduler + KI-Auswertung (OpenRouter) + DB + Job-Koordination |
| 115 | flugscanner-asia |
pve1 Kambodscha | 192.168.0.131 | 100.112.190.22 | Scraping-Node A: SeleniumBase CDP + noVNC, Heimnetz-IP Asien |
| 145 | flugscanner-mu |
helmut-pve Muldenstein | 192.168.178.130 | 100.75.182.15 | Scraping-Node B: SeleniumBase CDP + noVNC, Heimnetz-IP Deutschland |
Zugänge:
- Hub (pve-hetzner):
ssh root@100.88.230.59PW: Astral-Proxmox!2026 →pct exec 115 - Asia (pve1):
ssh root@192.168.0.197PW: astral66 →pct exec 115 - Muldenstein:
ssh root@100.75.182.15PW: astral66 (direkt, kein pct nötig) - helmut-pve:
ssh root@100.87.235.11PW: astral66
Wichtig:
- Scraping läuft NIE von CT 115 / Hetzner aus
- CT 115 koordiniert nur — die Nodes führen aus
- Muldenstein = deutsche IP (beste Ergebnisse für Kayak, Momondo)
- Kambodscha = asiatische IP (Momondo/Traveloka werden übersprungen — Geo-Block)
- Tailscale auf allen Containern — sichere Kommunikation über Tailnet
CT 115 — Flugpreisscanner Hub
Nur Koordination, Auswertung, Dashboard — KEIN Scraping, KEIN noVNC hier.
Dienste (Docker)
| Service | Container | Port | Aufgabe |
|---|---|---|---|
| web | flugscanner-web |
8080 | Flask Dashboard |
| scheduler | flugscanner-scheduler |
— | Jobs verteilen, KI auslösen, Telegram Bot |
Pfade
/opt/flugscanner/
├── hub/
│ ├── docker-compose.yml
│ ├── .env
│ ├── Dockerfile
│ ├── data/
│ │ └── flugscanner.db ← SQLite Datenbank
│ └── src/
│ ├── web.py ← Flask Dashboard + API
│ ├── scheduler.py ← Job-Koordination + Telegram Bot
│ ├── ki.py ← OpenRouter Auswertung + Plausibilität
│ ├── db.py ← DB-Zugriff + Init
│ └── requirements.txt
└── node/ ← (auf Nodes ausgecheckt)
Scraping-Nodes (asia + mu)
Dienste (Docker)
| Service | Container | Port | Aufgabe |
|---|---|---|---|
| agent | flugscanner-agent |
5010 | Jobs empfangen, Selenium starten |
| novnc | flugscanner-novnc |
6080 | Chrome live im Browser sehen |
Pfade
/opt/flugscanner/node/
├── docker-compose.yml
├── .env ← NODE_NAME=flugscanner-asia/mu
├── Dockerfile
└── src/
├── agent.py ← Flask API (POST /job, GET /status)
├── worker.py ← SeleniumBase CDP Scraper
└── requirements.txt
Kommunikation
Hub Scheduler → POST http://[Node-Tailscale-IP]:5010/job
{ "scanner": "kayak_multicity", "von": "FRA", "nach": "KTI", "kabine": "economy", ... }
Node antwortet:
{ "results": [...], "node": "flugscanner-mu", "count": 10, "screenshot_b64": "..." }
Scanner
| Scanner | Status | Anmerkung |
|---|---|---|
| Kayak (Roundtrip) | ✅ Aktiv | Beste Datenquelle, GDPR-Consent automatisiert |
| Kayak Multi-City CX via HKG | ✅ Aktiv | Primärer Scanner — FRA→HKG→KTI→FRA |
| Trip.com | ✅ Aktiv | Gute Ergänzung, auch CX-Filter |
| Momondo | ✅ Aktiv | Nur auf Muldenstein (Geo-Block aus Asien) |
| Google Flights | ⚠ Eingeschränkt | Wenige Ergebnisse, Consent-Probleme |
| Traveloka | ⚠ Nur Muldenstein | Geo-Block aus Asien |
| Wego | ❌ Deaktiviert | |
| Skyscanner | ❌ Deaktiviert | Bot-Detection |
Node-spezifische Einschränkungen
Momondo und Traveloka werden auf flugscanner-asia automatisch übersprungen (Geo-Block).
Konfiguration: NODE_SCANNER_SKIP in scheduler.py.
Anti-Bot-Strategie
- Scan-Intervall: zufällig 25–45 Minuten (nicht regelmäßig)
- SeleniumBase UC/CDP Mode (undetected Chromium)
- GDPR-Consent automatisch wegklicken (Kayak, Momondo)
- Zwei verschiedene Geo-Locations (Kambodscha + Deutschland)
- Scrape-URL (.de) getrennt von Booking-URL (.com) — Nutzer sieht internationale Preise
Telegram Bot
Bot: @CX_HKG_Alert_bot
Token: 8693839370:AAEPG0t2gA5jkLFH3J8UmstZMkHPdp0aTG4
Chat-ID: 674951792
Befehle
| Befehl | Funktion |
|---|---|
| /preis | Aktueller CX-Preis via HKG |
| /best | Top 3 günstigste heute |
| /status | Systemstatus (Nodes, letzte Scan-Zeit) |
Automatische Nachrichten
| Wann | Was |
|---|---|
| Täglich 07:00 | Morgenbericht mit Preisübersicht |
| Bei CX < 900€ | Preis-Alert |
| Bei Anstieg > 50€ | Preisanstieg-Warnung |
| Nach 3x Null-Ergebnissen | Scanner-Problem-Alert (pro Node) |
Datenbank (SQLite auf CT 115)
Pfad: /opt/flugscanner/hub/data/flugscanner.db
| Tabelle | Inhalt |
|---|---|
| jobs | Geplante Scraping-Jobs (Route, Anbieter, Intervall, Airline-Filter) |
| prices | Rohe Preisdaten (Preis, Datum, Anbieter, Node, Booking-URL, plausibel) |
| screenshots | Vision-AI Screenshots mit Kabinenklassen-Erkennung |
| analyses | KI-Auswertungen mit Timestamp |
| prompts | Editierbare KI-Prompts |
| nodes | Registrierte Scraping-Nodes + Status |
| logs | System-Logs |
KI-Auswertung
- Läuft automatisch nach jedem Scraping-Durchlauf
- Vision AI: Screenshots werden per gpt-4o-mini klassifiziert (Economy/PE/Business)
- Plausibilitätsprüfung: Preise 700–12.000€ für Economy Roundtrip
- Marktanalyse: Prompt editierbar im Dashboard
- OpenRouter Guthaben wird im Dashboard angezeigt
OpenRouter
| Variable | Wert |
|---|---|
| OPENROUTER_API_KEY | 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 |
| AI_MODEL | openai/gpt-4o-mini |
Preiserwartung (Stand 26.02.2026)
FRA → HKG → Phnom Penh → FRA — Cathay Pacific Economy Roundtrip
| Metrik | Wert |
|---|---|
| Günstigster | ~726 EUR |
| Realistischer Schnitt | 900–1.050 EUR |
| Gute Airlines (CX/SQ/TG) Durchschnitt | ~1.030 EUR |
| Zum Vergleich: Reisebüro VA PE | ~2.000 EUR |
Repo
git.orbitalo.net/orbitalo/flugpreisscanner
API-Token (cursor-deploy-3): a6dd1ee58e091c894169c5ae15f6b74bb9461c56
Änderungslog
| Datum | Was |
|---|---|
| 25.02.2026 | System live geschaltet |
| 25.02.2026 | Cookie-Banner-Fix + Screenshot-Verbesserungen |
| 26.02.2026 | Umstellung PE → Economy, CX via HKG als Hauptroute |
| 26.02.2026 | Telegram Bot @CX_HKG_Alert_bot eingerichtet |
| 26.02.2026 | SeleniumBase 4.34 → 4.47 (CDP-Verbesserungen) |
| 26.02.2026 | _scrape_url / _booking_url Trennung (Scrape .de, Booking .com) |
| 26.02.2026 | GDPR-Consent-Handling für Kayak/Momondo |
| 26.02.2026 | NODE_SCANNER_SKIP: Momondo/Traveloka auf Asia deaktiviert |
| 26.02.2026 | Alert-Zähler jetzt pro Node (kein Spam durch Geo-Blocks) |
| 26.02.2026 | SSH-Fix Muldenstein (PermitRootLogin yes) |
| 26.02.2026 | Doku in CT999 ergänzt (ct-145-flugscanner-mu.md + index.md) |