redax-wp: Rohzustand abgeschlossen
- 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
This commit is contained in:
parent
6734757598
commit
d7140168e3
5 changed files with 553 additions and 157 deletions
212
VISION.md
Normal file
212
VISION.md
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
# VISION — Orbitalo Content & Intelligence System
|
||||||
|
**Stand: 24.02.2026**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Die Kernidee
|
||||||
|
|
||||||
|
Ein persönliches Informations-Radar das selbstständig beobachtet, filtert, aufbereitet
|
||||||
|
und verteilt. Nicht ein weiteres CMS-Tool — sondern ein System das mich informiert hält
|
||||||
|
und bei Bedarf daraus Inhalte für andere erstellt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Die drei Rollen
|
||||||
|
|
||||||
|
```
|
||||||
|
BEOBACHTEN ENTSCHEIDEN VERTEILEN
|
||||||
|
───────────── ──────────── ──────────
|
||||||
|
Research Hub → Redakteur → WordPress
|
||||||
|
(CT 109) (CT 113) (CT 101)
|
||||||
|
│
|
||||||
|
FünfVorAcht → Telegram Kanal
|
||||||
|
(CT 112) (@DeinKanal)
|
||||||
|
│
|
||||||
|
Persönlicher → Telegram privat
|
||||||
|
Feed (nur für mich)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Was das System täglich tut
|
||||||
|
|
||||||
|
```
|
||||||
|
Nachts / morgens:
|
||||||
|
Research Hub scannt alle Themengebiete
|
||||||
|
→ Neue Artikel, Videos, Repos, Diskussionen gefunden
|
||||||
|
→ Gefiltert nach Relevanz + Quellen-Score
|
||||||
|
|
||||||
|
Morgens:
|
||||||
|
Telegram-Nachricht: "7 neue interessante Quellen"
|
||||||
|
→ Ich öffne Redakteur oder FünfVorAcht
|
||||||
|
→ Vorschläge warten auf mich
|
||||||
|
|
||||||
|
Ich entscheide:
|
||||||
|
→ Interessant für WordPress → Redakteur → Artikel
|
||||||
|
→ Interessant für Kanal → FünfVorAcht → Post
|
||||||
|
→ Nur für mich → Ich lese, kein Post
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Themengebiete (Ausgangslage)
|
||||||
|
|
||||||
|
| Thema | Scanner-Profil | Quellen |
|
||||||
|
|-------|---------------|---------|
|
||||||
|
| Medizin / Gesundheit | topic-scanner | Substack, PubMed, Blogs |
|
||||||
|
| Neue KI-Entwicklungen | hf-scanner + github-scanner | HuggingFace, GitHub, arXiv |
|
||||||
|
| Selfhosting | reddit-scanner + rss-scanner | r/selfhosted, GitHub, Blogs |
|
||||||
|
| Allgemein | rss-scanner | Konfigurierbare RSS-Feeds |
|
||||||
|
|
||||||
|
Themengebiete sind jederzeit erweiterbar — neues Profil = neue Zeile in der Config.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module
|
||||||
|
|
||||||
|
### 1. Research Hub (CT 109) — Das Herzstück
|
||||||
|
- Scannt kontinuierlich alle Themengebiete
|
||||||
|
- Jeder Scanner läuft isoliert (ein Bug bricht nicht alles)
|
||||||
|
- Gemeinsame Quellen-Datenbank mit Score-System
|
||||||
|
- Quellen-Score: bevorzugt Quellen die ich oft nutze
|
||||||
|
- Dashboard: welche Quellen wurden heute gefunden
|
||||||
|
- API: liefert Vorschläge an Redakteur + FünfVorAcht
|
||||||
|
|
||||||
|
### 2. Redakteur (CT 113) — Für andere
|
||||||
|
- Vom Link zum WordPress-Artikel in 2 Minuten
|
||||||
|
- Mehrere Quellen zu einem Artikel kombinierbar
|
||||||
|
- Automatisches Featured Image (og:image)
|
||||||
|
- HTML-Ausgabe mit Struktur (H2, H3, Listen)
|
||||||
|
- SEO automatisch mitgeneriert
|
||||||
|
- Kalender: Planung der Veröffentlichungen
|
||||||
|
- Quellen-Score: lernt welche Quellen gut funktionieren
|
||||||
|
- Verbindung zu Research Hub optional
|
||||||
|
|
||||||
|
### 3. FünfVorAcht (CT 112) — Für den Kanal
|
||||||
|
- Täglicher Post um 19:55 Uhr
|
||||||
|
- Review via Telegram Bot (✅ / ✏️)
|
||||||
|
- Verbindung zu Research Hub optional
|
||||||
|
- Läuft bereits produktiv seit 24.02.2026
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Zweite Instanz (Zukunft)
|
||||||
|
|
||||||
|
Für unabhängigen Blog außerhalb Deutschland/EU:
|
||||||
|
- Redakteur-Klon mit anderer .env
|
||||||
|
- Eigene WordPress-Installation
|
||||||
|
- Hosting außerhalb EU (Contabo USA/Singapur)
|
||||||
|
- Kein Bezug zu orbitalo.net
|
||||||
|
- Gleicher Code, andere Konfiguration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Goldene Regeln
|
||||||
|
|
||||||
|
1. **Jedes Modul kann alleine stehen** — keine harten Abhängigkeiten
|
||||||
|
2. **Kein Code anfassen** für Konfiguration — alles per Dashboard
|
||||||
|
3. **Inhalt vor Optik** — erst funktionieren, dann verschönern
|
||||||
|
4. **Einfach vor clever** — die simpelste Lösung die funktioniert
|
||||||
|
5. **Quellen nicht blind vertrauen** — Score-System lernt mit der Zeit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rollenverteilung
|
||||||
|
|
||||||
|
| Modul | Rolle | Steuerung | Ziel |
|
||||||
|
|-------|-------|-----------|------|
|
||||||
|
| Research Hub | Autopilot | Vollautomatisch | WordPress füllt sich täglich selbst |
|
||||||
|
| Redakteur | Handarbeit mit Turbo | Du entscheidest | Hochwertige, kuratierte Artikel |
|
||||||
|
| FünfVorAcht | Kanal-Poster | Halbautomatisch | Täglicher Telegram-Post mit Review |
|
||||||
|
|
||||||
|
**Research Hub = Breite** (viel, täglich, automatisch)
|
||||||
|
**Redakteur = Tiefe** (wenig, gezielt, hochwertig — aber automatisierbar per Zeitplan)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bauprinzipien
|
||||||
|
|
||||||
|
1. **Erst bauen, dann erweitern** — Ein Modul fertig und stabil bevor das nächste beginnt
|
||||||
|
2. **Jedes Modul muss alleine funktionieren** — Mindestens eine Woche solo im Echtbetrieb
|
||||||
|
3. **Keine harten Abhängigkeiten** — Verbindungen sind Bonus, nie Pflicht
|
||||||
|
4. **Logging von Tag 1** — Gleiche Struktur in jedem Modul
|
||||||
|
5. **STATE.md vor dem ersten Start** — Nicht danach
|
||||||
|
6. **Ein laufendes einfaches System schlägt ein geplantes komplexes System immer**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stufenplan
|
||||||
|
|
||||||
|
### Stufe 1 — Flugpreisscanner (Priorität)
|
||||||
|
**Ziel:** Täglich günstigste Flüge FRA→PNH finden + KI-Empfehlung
|
||||||
|
|
||||||
|
→ Eigenständiges Projekt, vollständig dokumentiert in:
|
||||||
|
**`flugpreisscanner/STATE.md`**
|
||||||
|
|
||||||
|
**Erfolgskriterium:** Täglich automatisch: günstigster Preis + KI sagt ob jetzt buchen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Stufe 2 — Fundament & core-Repo
|
||||||
|
**Ziel:** Gemeinsame Basis für alle zukünftigen Module
|
||||||
|
|
||||||
|
| Was | Details | Status |
|
||||||
|
|-----|---------|--------|
|
||||||
|
| core-Repo anlegen | logging, health, base_db | ⏳ |
|
||||||
|
| Basis-CT Template | Snapshot "base-template" auf pve-hetzner | ⏳ |
|
||||||
|
|
||||||
|
**Erfolgskriterium:** Neuer Container in 5 Minuten startklar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Stufe 3 — Redakteur (CT 113)
|
||||||
|
**Ziel:** Manuelle hochwertige WordPress-Artikel, automatisierbar
|
||||||
|
|
||||||
|
| Was | Details | Status |
|
||||||
|
|-----|---------|--------|
|
||||||
|
| CT 113 einrichten | Clone von base-template | ⏳ |
|
||||||
|
| Dashboard | Editor, WP-Vorschau, Kalender | ⏳ |
|
||||||
|
| WordPress REST API | Artikel posten + planen | ⏳ |
|
||||||
|
| KI-Generierung | HTML-Output + SEO automatisch | ⏳ |
|
||||||
|
| og:image Extraktion | Automatischer Bild-Vorschlag | ⏳ |
|
||||||
|
| Quellen-Score | Lernt welche Quellen gut funktionieren | ⏳ |
|
||||||
|
|
||||||
|
**Erfolgskriterium:** Vom Link zum veröffentlichten Artikel in unter 3 Minuten
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Stufe 4 — Research Hub (CT 109)
|
||||||
|
**Ziel:** RSS + Scanner sauber, Auto-Posting WordPress
|
||||||
|
|
||||||
|
| Was | Details | Status |
|
||||||
|
|-----|---------|--------|
|
||||||
|
| Alten Code aufräumen | Jeder Scanner eigene Datei | ⏳ |
|
||||||
|
| RSS-Scanner stabil | Eine Woche Echtbetrieb | ⏳ |
|
||||||
|
| KI-Zusammenfassung | Artikel verstehen, nicht nur sammeln | ⏳ |
|
||||||
|
| Auto-Posting WordPress | CT 101 via REST API | ⏳ |
|
||||||
|
| Telegram-Zusammenfassung | Morgens: "X neue Artikel heute" | ⏳ |
|
||||||
|
|
||||||
|
**Erfolgskriterium:** WordPress füllt sich täglich ohne mein Zutun
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Stufe 5 — Verbinden & Verfeinern
|
||||||
|
**Ziel:** Alle Module als Einheit
|
||||||
|
|
||||||
|
| Was | Details | Status |
|
||||||
|
|-----|---------|--------|
|
||||||
|
| Redakteur + Research Hub | Quellen-Vorschläge im Dashboard | ⏳ |
|
||||||
|
| FünfVorAcht + Research Hub | Quellen-Vorschläge optional | ⏳ |
|
||||||
|
| WordPress MCP | Offizielles Plugin für CT 101 | ⏳ |
|
||||||
|
| WordPress Bühnenbild | Theme anpassen — eigene Session | ⏳ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Stufe 6 — Zweite Instanz (kein Datum)
|
||||||
|
**Ziel:** Unabhängiger Blog außerhalb EU
|
||||||
|
|
||||||
|
| Was | Details | Status |
|
||||||
|
|-----|---------|--------|
|
||||||
|
| Server außerhalb EU | Contabo USA/Singapur | ⏳ |
|
||||||
|
| Redakteur klonen | .env anpassen, fertig | ⏳ |
|
||||||
|
| Kein Bezug zu orbitalo.net | Eigene Domain, eigener Tailnet | ⏳ |
|
||||||
243
flugpreisscanner/STATE.md
Normal file
243
flugpreisscanner/STATE.md
Normal file
|
|
@ -0,0 +1,243 @@
|
||||||
|
# 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) |
|
||||||
|
|
@ -1,171 +1,105 @@
|
||||||
# STATE: Redakteur
|
# STATE: Redax-WP
|
||||||
**Stand: 26.02.2026**
|
**Stand: 27.02.2026**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
🗓️ **In Planung — Umsetzung ab sofort**
|
✅ **Rohzustand läuft — Basis-Setup abgeschlossen**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Konzept
|
## Infrastruktur
|
||||||
|
|
||||||
KI-gestützter WordPress-Artikel-Generator mit Dashboard.
|
| CT | Dienst | Host | IP | Status |
|
||||||
Eigenständiges System, unabhängig von FünfVorAcht (CT 112).
|
|----|--------|------|----|--------|
|
||||||
Basis: ~70% Code-Übernahme aus FünfVorAcht, angepasst für WordPress statt Telegram-Kanal.
|
| 113 | Redax-WP Dashboard | pve-hetzner | 10.10.10.113 | ✅ Läuft |
|
||||||
|
| 113 | WordPress (DeutschlandBlog) | pve-hetzner | 10.10.10.113 | ✅ Läuft |
|
||||||
|
|
||||||
|
### URLs
|
||||||
|
- **Dashboard:** `https://redax.orbitalo.net` (Cloudflare Tunnel → Port 8080)
|
||||||
|
- **Blog:** `https://deutschlandblog.orbitalo.net` (Cloudflare Tunnel → Port 80)
|
||||||
|
- **WP-Admin:** `https://deutschlandblog.orbitalo.net/wp-admin`
|
||||||
|
|
||||||
|
### Zugangsdaten
|
||||||
|
- Dashboard: `admin` / `astral66`
|
||||||
|
- WP-Admin: `admin` / `Redax2026!`
|
||||||
|
- WP Application Password: `YJ7L4CFAxDPszGLXpamJmzl6`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Geplante Infrastruktur
|
## Stack auf CT 113
|
||||||
|
|
||||||
| CT | Dienst | Host | IP geplant | Status |
|
```
|
||||||
|----|--------|------|-----------|--------|
|
Docker Container:
|
||||||
| 113 | Redakteur | pve-hetzner | 10.10.10.113 | ⏳ Noch nicht erstellt |
|
redax-db MySQL 8.0
|
||||||
|
redax-wordpress WordPress 6.9.1 + Apache
|
||||||
- **Stack:** Python/Flask + Docker (wie CT 112)
|
redax-web Flask/Gunicorn Dashboard (Port 8080)
|
||||||
- **Dashboard:** `https://redakteur.orbitalo.net` (Cloudflare Tunnel)
|
cloudflared Tunnel für redax.orbitalo.net
|
||||||
- **Lokal:** `http://[Tailscale-IP]:8080`
|
cloudflared-wp Tunnel für deutschlandblog.orbitalo.net
|
||||||
- **Repo:** `git.orbitalo.net/orbitalo/redakteur`
|
|
||||||
- **Ziel-WordPress:** CT 101 (arakava-news-2.orbitalo.net)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Was aus FünfVorAcht übernommen wird
|
|
||||||
|
|
||||||
### Direkt kopieren (0 Änderungen)
|
|
||||||
|
|
||||||
| Datei | Beschreibung |
|
|
||||||
|-------|-------------|
|
|
||||||
| `logger.py` | Strukturiertes JSON-Logging |
|
|
||||||
| `openrouter.py` | OpenRouter API-Wrapper |
|
|
||||||
| `Dockerfile.web` | Tailwind self-hosted, Gunicorn |
|
|
||||||
| `requirements-web.txt` | Flask, APScheduler, pytz, ... |
|
|
||||||
|
|
||||||
### Stark übernehmen, leicht anpassen
|
|
||||||
|
|
||||||
| Datei | Was übernommen wird | Was sich ändert |
|
|
||||||
|-------|---------------------|-----------------|
|
|
||||||
| `database.py` | articles, settings, reviewers, prompts | Neue Felder: wp_post_id, category, featured_image, seo_* |
|
|
||||||
| `app.py` | Auth, Settings, Prompt-Verwaltung, Scheduling-Logik | WordPress REST API Routen statt Bot-Routen |
|
|
||||||
| `settings.html` | Reviewer-Management, API-Key | WP URL + Application Password |
|
|
||||||
| `prompts.html` | Prompt-Editor | Neue Variablen: Ton, SEO, Kategorie |
|
|
||||||
| `history.html` | Post-Historie | Spalte WP-URL statt Telegram-ID |
|
|
||||||
| `hilfe.html` | Struktur + Layout | Neue Inhalte für WP-Workflow |
|
|
||||||
|
|
||||||
### Komplett neu bauen
|
|
||||||
|
|
||||||
| Was | Warum neu |
|
|
||||||
|-----|-----------|
|
|
||||||
| `templates/index.html` | Zwei-Spalten-Editor, Medien-Manager, WP-Vorschau |
|
|
||||||
| `wordpress.py` | WordPress REST API Client (Artikel, Kategorien, Medien) |
|
|
||||||
| Telegram-Notifier | Nur Post-Bestätigung nach Veröffentlichung, kein Bot-Scheduler |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Funktionsumfang
|
|
||||||
|
|
||||||
### Dashboard
|
|
||||||
|
|
||||||
| Feature | Status |
|
|
||||||
|---------|--------|
|
|
||||||
| KI-Artikel generieren (OpenRouter) | ✅ übernommen |
|
|
||||||
| Prompt-System (anpassbar) | ✅ übernommen |
|
|
||||||
| Zwei-Spalten-Editor: Markdown links, WP-Vorschau rechts | 🆕 neu |
|
|
||||||
| Ton wählbar: Informativ / Meinungsstark / Reportage | 🆕 neu |
|
|
||||||
| SEO automatisch mitgeneriert (Meta-Title, Description, Keyword) | 🆕 neu |
|
|
||||||
| Featured Image: og:image aus Quell-URL oder manuell | 🆕 neu |
|
|
||||||
| YouTube: als Hero oder im Text einbindbar | 🆕 neu |
|
|
||||||
| WP-Kategorien zuweisbar | 🆕 neu |
|
|
||||||
| Kalender-Ansicht (Nächste 7 Tage, mehrere Slots) | ✅ übernommen |
|
|
||||||
| Umplanen / Löschen im Board | ✅ übernommen |
|
|
||||||
| Redakteure-Verwaltung (Telegram-Benachrichtigung) | ✅ übernommen |
|
|
||||||
| Strukturiertes JSON-Logging | ✅ übernommen |
|
|
||||||
| Fehler-Alarm per Telegram | ✅ übernommen |
|
|
||||||
| Anleitung (/hilfe) | ✅ übernommen |
|
|
||||||
|
|
||||||
### Veröffentlichung
|
|
||||||
|
|
||||||
| Option | Details |
|
|
||||||
|--------|---------|
|
|
||||||
| Sofort | POST an WordPress REST API → direkt live |
|
|
||||||
| Entwurf | Speichern als WP-Entwurf, kein Publish |
|
|
||||||
| Geplant | Datum + Uhrzeit → WP scheduled post oder lokaler Scheduler |
|
|
||||||
|
|
||||||
### Telegram-Benachrichtigung (nach Veröffentlichung)
|
|
||||||
- Kein Freigabe-Workflow wie bei FünfVorAcht
|
|
||||||
- Nur Bestätigungs-Ping: "✅ Artikel veröffentlicht: [Titel] → [URL]"
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## WordPress REST API
|
|
||||||
|
|
||||||
- **Endpoint:** `https://arakava-news-2.orbitalo.net/wp-json/wp/v2/`
|
|
||||||
- **Auth:** Application Password (in Settings-UI konfigurierbar)
|
|
||||||
- **Operationen:**
|
|
||||||
- Artikel erstellen/aktualisieren (POST/PUT `/posts`)
|
|
||||||
- Kategorien abrufen (GET `/categories`)
|
|
||||||
- Featured Image hochladen (POST `/media`)
|
|
||||||
- Artikel-Status: `draft`, `publish`, `future` (geplant)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Sprint-Plan
|
|
||||||
|
|
||||||
### Sprint 1 — Infrastruktur + Grundgerüst
|
|
||||||
|
|
||||||
| Prio | Task |
|
|
||||||
|------|------|
|
|
||||||
| 1 | CT 113 auf pve-hetzner erstellen (wie CT 112) |
|
|
||||||
| 2 | Forgejo-Repo `redakteur` anlegen |
|
|
||||||
| 3 | `logger.py`, `openrouter.py`, Dockerfiles, requirements kopieren |
|
|
||||||
| 4 | `database.py` mit WP-Feldern ableiten |
|
|
||||||
| 5 | `app.py` Grundstruktur + Auth übernehmen |
|
|
||||||
| 6 | MOTD + Tailscale + Cloudflare Tunnel einrichten |
|
|
||||||
|
|
||||||
### Sprint 2 — WordPress-Anbindung
|
|
||||||
|
|
||||||
| Prio | Task |
|
|
||||||
|------|------|
|
|
||||||
| 7 | `wordpress.py` — REST API Client (Artikel, Kategorien, Medien-Upload) |
|
|
||||||
| 8 | Settings-UI: WP URL + Application Password konfigurierbar |
|
|
||||||
| 9 | Publish-Workflow: Sofort / Entwurf / Geplant |
|
|
||||||
| 10 | Telegram-Bestätigungs-Ping nach Veröffentlichung |
|
|
||||||
|
|
||||||
### Sprint 3 — Editor + Medien
|
|
||||||
|
|
||||||
| Prio | Task |
|
|
||||||
|------|------|
|
|
||||||
| 11 | Zwei-Spalten-Editor mit Echtzeit-WP-Vorschau |
|
|
||||||
| 12 | SEO-Felder (Meta-Title, Description, Keyword) automatisch aus KI |
|
|
||||||
| 13 | Featured Image aus og:image oder manuell eingeben |
|
|
||||||
| 14 | YouTube-Einbindung (Hero oben / im Text) |
|
|
||||||
| 15 | WP-Kategorien zuweisbar |
|
|
||||||
|
|
||||||
### Sprint 4 — Polish
|
|
||||||
|
|
||||||
| Prio | Task |
|
|
||||||
|------|------|
|
|
||||||
| 16 | Ton-Auswahl (Informativ / Meinungsstark / Reportage) |
|
|
||||||
| 17 | Mehrere Quellen kombinierbar für einen Artikel |
|
|
||||||
| 18 | Zweite Instanz vorbereiten (Contabo USA/Singapur, eigene .env) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Abhängigkeiten
|
|
||||||
|
|
||||||
- CT 101: WordPress REST API muss erreichbar sein
|
|
||||||
- CT 111: Forgejo für Code-Verwaltung
|
|
||||||
- OpenRouter API Key (aus credentials.md)
|
|
||||||
- Telegram Bot Token für Benachrichtigungen
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Logging
|
|
||||||
|
|
||||||
Identisch mit FünfVorAcht (`logger.py`):
|
|
||||||
```json
|
|
||||||
{"ts": "2026-02-26T14:00:00Z", "level": "INFO", "event": "article_published", "wp_post_id": 1234, "url": "https://..."}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Events: `article_generated`, `article_saved`, `article_published`, `article_failed`, `media_uploaded`, `wp_error`
|
### Installed Plugins
|
||||||
|
- **Yoast SEO** (aktiviert)
|
||||||
|
- **Blocksy Companion** (aktiviert)
|
||||||
|
|
||||||
|
### Installed Theme
|
||||||
|
- **Blocksy** (aktiviert)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## WordPress Zustand
|
||||||
|
|
||||||
|
| Element | Status |
|
||||||
|
|---------|--------|
|
||||||
|
| WordPress Version | 6.9.1 |
|
||||||
|
| Domain | https://deutschlandblog.orbitalo.net |
|
||||||
|
| Theme | Blocksy |
|
||||||
|
| Yoast SEO | installiert & aktiv |
|
||||||
|
| Kategorien | Rubrik 1–4 (je 1 Platzhalterbeitrag) |
|
||||||
|
| Navigation | Hauptmenü → Header Menu 1 + Mobile |
|
||||||
|
| Permalink-Struktur | `/%postname%/` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## .env Konfiguration (CT 113: /opt/redax-wp/.env)
|
||||||
|
|
||||||
|
| Variable | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| `WP_URL` | ✅ `https://deutschlandblog.orbitalo.net` |
|
||||||
|
| `WP_USERNAME` | ✅ `admin` |
|
||||||
|
| `WP_APP_PASSWORD` | ✅ gesetzt |
|
||||||
|
| `OPENROUTER_API_KEY` | ⏳ noch einzutragen |
|
||||||
|
| `TELEGRAM_BOT_TOKEN` | ⏳ noch einzutragen |
|
||||||
|
| `TELEGRAM_CHANNEL_ID` | ⏳ noch einzutragen |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Offene Aufgaben
|
||||||
|
|
||||||
|
- [ ] OpenRouter API Key in `.env` eintragen
|
||||||
|
- [ ] Telegram Bot Token + Channel ID in `.env` eintragen
|
||||||
|
- [ ] Rubriken umbenennen (aktuell: Rubrik 1–4)
|
||||||
|
- [ ] Redax-WP Dashboard: KI-Artikel generieren & veröffentlichen testen
|
||||||
|
- [ ] RSS Feeds konfigurieren
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
### 27.02.2026
|
||||||
|
- WordPress 6.9.1 installiert (Update von 6.7)
|
||||||
|
- Blocksy Theme + Companion Plugin installiert
|
||||||
|
- Yoast SEO installiert
|
||||||
|
- 4 Kategorien angelegt (Rubrik 1–4)
|
||||||
|
- Hauptmenü mit allen Rubriken im Header
|
||||||
|
- Cloudflare Tunnel für WordPress eingerichtet
|
||||||
|
- WP Application Password generiert, in .env eingetragen
|
||||||
|
- Rohzustand der Website abgeschlossen
|
||||||
|
|
||||||
|
### 26.02.2026
|
||||||
|
- CT 113 auf pve-hetzner erstellt
|
||||||
|
- Docker Stack deployed (DB + WordPress + Flask + cloudflared)
|
||||||
|
- Dashboard unter redax.orbitalo.net erreichbar
|
||||||
|
- Cloudflare Tunnel für Dashboard eingerichtet
|
||||||
|
- Login-Seite Fix (inline CSS)
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,11 @@ services:
|
||||||
- redax-internal
|
- redax-internal
|
||||||
|
|
||||||
wordpress:
|
wordpress:
|
||||||
image: wordpress:6.7-apache
|
image: wordpress:latest
|
||||||
container_name: redax-wordpress
|
container_name: redax-wordpress
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
environment:
|
environment:
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,11 @@
|
||||||
<a href="/prompts" class="{% if request.endpoint == 'prompts_page' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">Prompts</a>
|
<a href="/prompts" class="{% if request.endpoint == 'prompts_page' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">Prompts</a>
|
||||||
<a href="/settings" class="{% if request.endpoint == 'settings' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">Einstellungen</a>
|
<a href="/settings" class="{% if request.endpoint == 'settings' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">Einstellungen</a>
|
||||||
<a href="/hilfe" class="{% if request.endpoint == 'hilfe' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">❓ Hilfe</a>
|
<a href="/hilfe" class="{% if request.endpoint == 'hilfe' %}text-blue-400 font-semibold{% else %}text-slate-400 hover:text-white{% endif %}">❓ Hilfe</a>
|
||||||
|
<a href="https://deutschlandblog.orbitalo.net/wp-admin/" target="_blank"
|
||||||
|
class="text-slate-400 hover:text-emerald-400 transition flex items-center gap-1">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg>
|
||||||
|
WP-Admin
|
||||||
|
</a>
|
||||||
<a href="/logout" class="text-slate-600 hover:text-red-400 text-xs transition">Abmelden</a>
|
<a href="/logout" class="text-slate-600 hover:text-red-400 text-xs transition">Abmelden</a>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue