# 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.59` PW: Astral-Proxmox!2026 → `pct exec 115` - Asia (pve1): `ssh root@192.168.0.197` PW: astral66 → `pct exec 115` - Muldenstein: `ssh root@100.75.182.15` PW: astral66 (direkt, kein pct nötig) - helmut-pve: `ssh root@100.87.235.11` PW: 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 | | **Cathay Pacific direkt** | ✅ Aktiv | CX direkt buchen — FRA→KTI Roundtrip via cathaypacific.com | | 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) |