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
|
||||
**Stand: 26.02.2026**
|
||||
# STATE: Redax-WP
|
||||
**Stand: 27.02.2026**
|
||||
|
||||
---
|
||||
|
||||
## Status
|
||||
|
||||
🗓️ **In Planung — Umsetzung ab sofort**
|
||||
✅ **Rohzustand läuft — Basis-Setup abgeschlossen**
|
||||
|
||||
---
|
||||
|
||||
## Konzept
|
||||
## Infrastruktur
|
||||
|
||||
KI-gestützter WordPress-Artikel-Generator mit Dashboard.
|
||||
Eigenständiges System, unabhängig von FünfVorAcht (CT 112).
|
||||
Basis: ~70% Code-Übernahme aus FünfVorAcht, angepasst für WordPress statt Telegram-Kanal.
|
||||
| CT | Dienst | Host | IP | Status |
|
||||
|----|--------|------|----|--------|
|
||||
| 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 |
|
||||
|----|--------|------|-----------|--------|
|
||||
| 113 | Redakteur | pve-hetzner | 10.10.10.113 | ⏳ Noch nicht erstellt |
|
||||
|
||||
- **Stack:** Python/Flask + Docker (wie CT 112)
|
||||
- **Dashboard:** `https://redakteur.orbitalo.net` (Cloudflare Tunnel)
|
||||
- **Lokal:** `http://[Tailscale-IP]:8080`
|
||||
- **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://..."}
|
||||
```
|
||||
Docker Container:
|
||||
redax-db MySQL 8.0
|
||||
redax-wordpress WordPress 6.9.1 + Apache
|
||||
redax-web Flask/Gunicorn Dashboard (Port 8080)
|
||||
cloudflared Tunnel für redax.orbitalo.net
|
||||
cloudflared-wp Tunnel für deutschlandblog.orbitalo.net
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
wordpress:
|
||||
image: wordpress:6.7-apache
|
||||
image: wordpress:latest
|
||||
container_name: redax-wordpress
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80"
|
||||
depends_on:
|
||||
- db
|
||||
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="/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="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>
|
||||
</div>
|
||||
</nav>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue