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:
root 2026-02-27 10:34:58 +07:00
parent 6734757598
commit d7140168e3
5 changed files with 553 additions and 157 deletions

212
VISION.md Normal file
View 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
View 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 (12 Nächte) → KTI → FRA.
Realistischer Preis: **9001.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 **2545 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 70012.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 | **9001.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) |

View file

@ -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 14 (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 14)
- [ ] 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 14)
- 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)

View file

@ -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:

View file

@ -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>