- 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
243 lines
8.1 KiB
Markdown
243 lines
8.1 KiB
Markdown
# 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 |
|
||
| 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) |
|