redax-wp: Docker-Template fertiggestellt
- setup.sh: interaktives Ersteinrichtungs-Skript - Makefile: Komfort-Befehle (start/stop/logs/backup/wp-cli) - .env.example: vollständig dokumentiert - README.md: Quickstart, Architektur, Befehle Made-with: Cursor
This commit is contained in:
parent
b9eac9394f
commit
3e2598257e
4 changed files with 530 additions and 77 deletions
|
|
@ -1,32 +1,59 @@
|
||||||
# ─── Redax-WP Konfiguration ───────────────────────────────────────────────────
|
# ╔═══════════════════════════════════════════════════════════════════════════╗
|
||||||
# Kopiere diese Datei zu .env und fülle alle Werte aus.
|
# ║ Redax-WP — Konfigurationsvorlage (.env.example) ║
|
||||||
|
# ║ Kopiere diese Datei zu .env und fülle alle Pflichtfelder aus. ║
|
||||||
|
# ║ Oder nutze: ./setup.sh für automatische Konfiguration ║
|
||||||
|
# ╚═══════════════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
# ─── Dashboard Auth ───────────────────────────────────────────────────────────
|
# ─── Dashboard Zugang ─────────────────────────────────────────────────────────
|
||||||
|
# Pflicht: Login für das Redax-WP Dashboard
|
||||||
DASHBOARD_USER=admin
|
DASHBOARD_USER=admin
|
||||||
DASHBOARD_PASSWORD=changeme
|
DASHBOARD_PASSWORD=changeme
|
||||||
|
|
||||||
# ─── WordPress (intern via Docker-Netzwerk) ───────────────────────────────────
|
# ─── WordPress Verbindung ─────────────────────────────────────────────────────
|
||||||
WP_URL=http://wordpress
|
# Pflicht: URL unter der WordPress erreichbar ist (z.B. https://blog.example.com)
|
||||||
|
WP_URL=https://blog.example.com
|
||||||
|
|
||||||
|
# WordPress Admin-Benutzername
|
||||||
WP_USERNAME=admin
|
WP_USERNAME=admin
|
||||||
WP_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
|
|
||||||
WORDPRESS_DB_PASSWORD=wp_secret_123
|
|
||||||
|
|
||||||
# ─── KI (OpenRouter) ──────────────────────────────────────────────────────────
|
# Application Password (in WP-Admin unter Benutzer → Profil generieren,
|
||||||
OPENROUTER_API_KEY=sk-or-v1-...
|
# oder automatisch per setup.sh)
|
||||||
|
# Format: xxxx xxxx xxxx xxxx xxxx xxxx
|
||||||
|
WP_APP_PASSWORD=
|
||||||
|
|
||||||
# ─── Telegram ─────────────────────────────────────────────────────────────────
|
# Muss identisch mit MYSQL_PASSWORD sein
|
||||||
# Bot-Token für Benachrichtigungen nach Veröffentlichung
|
WORDPRESS_DB_PASSWORD=wp_secret_CHANGEME
|
||||||
|
|
||||||
|
# ─── KI-Artikel-Generierung (OpenRouter) ─────────────────────────────────────
|
||||||
|
# Pflicht für KI-Artikel. API-Key von https://openrouter.ai
|
||||||
|
OPENROUTER_API_KEY=sk-or-v1-CHANGEME
|
||||||
|
|
||||||
|
# ─── Telegram Integration ─────────────────────────────────────────────────────
|
||||||
|
# Optional: Bot-Token von @BotFather
|
||||||
TELEGRAM_BOT_TOKEN=
|
TELEGRAM_BOT_TOKEN=
|
||||||
# Kanal für KI-Artikel Teaser (z.B. @meinkanal oder -1001234567890)
|
|
||||||
|
# Kanal-ID für KI-Artikel Teaser (z.B. @meinkanal oder -1001234567890)
|
||||||
|
# Nur KI-generierte Artikel werden hier gepostet (keine RSS-Artikel)
|
||||||
TELEGRAM_CHANNEL_ID=
|
TELEGRAM_CHANNEL_ID=
|
||||||
# Reviewer Chat-IDs (kommagetrennt) für Fehler-Alarm + Morgen-Briefing
|
|
||||||
|
# Chat-IDs der Reviewer (kommagetrennt) für Fehler-Alarm + Morgen-Briefing
|
||||||
|
# Eigene Chat-ID herausfinden: Nachricht an @userinfobot
|
||||||
TELEGRAM_REVIEWER_IDS=
|
TELEGRAM_REVIEWER_IDS=
|
||||||
|
|
||||||
# ─── Zeitzone ─────────────────────────────────────────────────────────────────
|
# ─── System ───────────────────────────────────────────────────────────────────
|
||||||
|
# Zeitzone (IANA-Format)
|
||||||
TIMEZONE=Europe/Berlin
|
TIMEZONE=Europe/Berlin
|
||||||
|
|
||||||
# ─── WordPress Datenbank ──────────────────────────────────────────────────────
|
# Zufälliger geheimer Schlüssel für Flask-Sessions (mindestens 32 Zeichen)
|
||||||
MYSQL_ROOT_PASSWORD=root_secret_123
|
# Generieren: python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||||
|
SECRET_KEY=CHANGEME_mindestens_32_zeichen_lang
|
||||||
|
|
||||||
|
# Pfad zur SQLite-Datenbank (nicht ändern wenn Docker verwendet wird)
|
||||||
|
DB_PATH=/data/redax.db
|
||||||
|
|
||||||
|
# ─── MySQL Datenbank ──────────────────────────────────────────────────────────
|
||||||
|
# Starke Passwörter verwenden! Werden beim setup.sh automatisch generiert.
|
||||||
|
MYSQL_ROOT_PASSWORD=root_secret_CHANGEME
|
||||||
MYSQL_DATABASE=wordpress
|
MYSQL_DATABASE=wordpress
|
||||||
MYSQL_USER=wordpress
|
MYSQL_USER=wordpress
|
||||||
MYSQL_PASSWORD=wp_secret_123
|
MYSQL_PASSWORD=wp_secret_CHANGEME
|
||||||
|
|
|
||||||
96
redax-wp/Makefile
Normal file
96
redax-wp/Makefile
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
# Redax-WP — Makefile
|
||||||
|
# Verwendung: make <befehl>
|
||||||
|
|
||||||
|
.PHONY: help setup start stop restart logs status shell-web shell-wp shell-db \
|
||||||
|
reset-wp backup update clean
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo ""
|
||||||
|
@echo " Redax-WP — Verfügbare Befehle"
|
||||||
|
@echo " ─────────────────────────────────────────────"
|
||||||
|
@echo " make setup Ersteinrichtung (interaktiv)"
|
||||||
|
@echo " make start Stack starten"
|
||||||
|
@echo " make stop Stack stoppen"
|
||||||
|
@echo " make restart Web-Container neustarten"
|
||||||
|
@echo " make logs Alle Logs (live)"
|
||||||
|
@echo " make logs-web Nur Dashboard-Logs"
|
||||||
|
@echo " make logs-wp Nur WordPress-Logs"
|
||||||
|
@echo " make status Container-Status"
|
||||||
|
@echo " make shell-web Shell im Dashboard-Container"
|
||||||
|
@echo " make shell-wp Shell im WordPress-Container"
|
||||||
|
@echo " make shell-db MySQL-Shell"
|
||||||
|
@echo " make backup Daten sichern (./backups/)"
|
||||||
|
@echo " make update Docker-Images aktualisieren"
|
||||||
|
@echo " make clean Alle Daten löschen (VORSICHT!)"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
setup:
|
||||||
|
@chmod +x setup.sh && ./setup.sh
|
||||||
|
|
||||||
|
start:
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
stop:
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
restart:
|
||||||
|
docker compose up -d --no-deps --build web
|
||||||
|
|
||||||
|
restart-all:
|
||||||
|
docker compose down && docker compose up -d
|
||||||
|
|
||||||
|
logs:
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
logs-web:
|
||||||
|
docker compose logs -f web
|
||||||
|
|
||||||
|
logs-wp:
|
||||||
|
docker compose logs -f wordpress
|
||||||
|
|
||||||
|
status:
|
||||||
|
@echo ""
|
||||||
|
@docker compose ps
|
||||||
|
@echo ""
|
||||||
|
@echo " Ports:"
|
||||||
|
@docker compose ps --format "table {{.Name}}\t{{.Ports}}" 2>/dev/null || true
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
shell-web:
|
||||||
|
docker compose exec web /bin/bash
|
||||||
|
|
||||||
|
shell-wp:
|
||||||
|
docker compose exec wordpress /bin/bash
|
||||||
|
|
||||||
|
shell-db:
|
||||||
|
@source .env 2>/dev/null; \
|
||||||
|
docker compose exec db mysql -u$$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE
|
||||||
|
|
||||||
|
wp:
|
||||||
|
@source .env 2>/dev/null; \
|
||||||
|
docker run --rm \
|
||||||
|
--network "$$(basename $$(pwd))_redax-internal" \
|
||||||
|
-v "$$(pwd)/data/wordpress:/var/www/html" \
|
||||||
|
-e WORDPRESS_DB_HOST=redax-db \
|
||||||
|
-e WORDPRESS_DB_USER=$$MYSQL_USER \
|
||||||
|
-e WORDPRESS_DB_PASSWORD=$$MYSQL_PASSWORD \
|
||||||
|
-e WORDPRESS_DB_NAME=$$MYSQL_DATABASE \
|
||||||
|
--user root \
|
||||||
|
wordpress:cli $(filter-out $@,$(MAKECMDGOALS)) --allow-root
|
||||||
|
|
||||||
|
backup:
|
||||||
|
@mkdir -p backups
|
||||||
|
@STAMP=$$(date +%Y%m%d_%H%M%S); \
|
||||||
|
tar -czf backups/redax-wp-$$STAMP.tar.gz data/ .env && \
|
||||||
|
echo "✓ Backup erstellt: backups/redax-wp-$$STAMP.tar.gz"
|
||||||
|
|
||||||
|
update:
|
||||||
|
docker compose pull
|
||||||
|
docker compose up -d --build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo "WARNUNG: Alle Daten werden gelöscht!"
|
||||||
|
@read -rp "Sicher? (ja/N): " c; [ "$$c" = "ja" ] || exit 0
|
||||||
|
docker compose down -v
|
||||||
|
rm -rf data/ logs/
|
||||||
|
@echo "✓ Bereinigt"
|
||||||
|
|
@ -1,90 +1,186 @@
|
||||||
# Redax-WP
|
# Redax-WP
|
||||||
|
|
||||||
KI-gestütztes Redaktionssystem für WordPress mit integriertem RSS-Feed-Manager.
|
KI-gestützter WordPress-Redakteur mit Dashboard, RSS-Feed-Integration und Telegram-Anbindung.
|
||||||
|
|
||||||
## Was ist Redax-WP?
|
**Was ist Redax-WP?**
|
||||||
|
Ein selbst gehostetes System aus WordPress + einem Flask-Dashboard, das KI-Artikel generiert, einplant und veröffentlicht. RSS-Feeds können automatisch importiert werden. KI-Artikel landen in WordPress **und** Telegram, RSS-Artikel nur in WordPress.
|
||||||
|
|
||||||
Redax-WP ersetzt das WordPress-Admin-Backend für redaktionelle Arbeit. Es kombiniert:
|
---
|
||||||
|
|
||||||
- **KI-Artikelgenerierung** (OpenRouter) mit automatischen SEO-Feldern
|
|
||||||
- **RSS-Feed-Import** mit konfigurierbarem Auto-Publish und optionalem KI-Rewrite
|
|
||||||
- **Redaktionsplanung** mit Kalender, Zeitslots und direktem Umplanen
|
|
||||||
- **WordPress-Veröffentlichung** via REST API (Publish / Entwurf / Einplanen)
|
|
||||||
- **Telegram-Benachrichtigung** nach Veröffentlichung von KI-Artikeln
|
|
||||||
|
|
||||||
## Schnellstart
|
## Schnellstart
|
||||||
|
|
||||||
### 1. Repository klonen
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://git.orbitalo.net/orbitalo/redax-wp.git
|
# 1. Repository klonen
|
||||||
cd redax-wp
|
git clone https://github.com/DEIN_USER/redax-wp mein-blog
|
||||||
|
cd mein-blog
|
||||||
|
|
||||||
|
# 2. Interaktives Setup starten
|
||||||
|
chmod +x setup.sh
|
||||||
|
./setup.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Konfiguration
|
Das Setup-Skript erledigt automatisch:
|
||||||
|
- `.env` generieren (mit zufälligen Passwörtern)
|
||||||
|
- Docker Stack starten
|
||||||
|
- WordPress installieren (6.9+)
|
||||||
|
- Blocksy Theme + Yoast SEO installieren
|
||||||
|
- Kategorien & Navigation anlegen
|
||||||
|
- Application Password für REST-API generieren
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
|
||||||
|
| Software | Version |
|
||||||
|
|----------|---------|
|
||||||
|
| Docker | 24+ |
|
||||||
|
| Docker Compose | 2.x |
|
||||||
|
| Freie Ports | 80 (WordPress), 8080 (Dashboard) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Manuelle Konfiguration
|
||||||
|
|
||||||
|
Falls `setup.sh` nicht verwendet wird:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# .env mit eigenen Werten befüllen (Editor öffnen)
|
# .env anpassen
|
||||||
nano .env
|
docker compose up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Starten
|
---
|
||||||
|
|
||||||
|
## Nützliche Befehle
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
make help # Alle Befehle anzeigen
|
||||||
|
make start # Stack starten
|
||||||
|
make stop # Stack stoppen
|
||||||
|
make restart # Dashboard neustarten (nach .env-Änderung)
|
||||||
|
make logs # Live-Logs aller Container
|
||||||
|
make logs-web # Nur Dashboard-Logs
|
||||||
|
make status # Container-Status
|
||||||
|
make shell-web # Shell im Dashboard
|
||||||
|
make shell-db # MySQL-Shell
|
||||||
|
make backup # Datensicherung nach ./backups/
|
||||||
|
make update # Docker-Images aktualisieren
|
||||||
```
|
```
|
||||||
|
|
||||||
Dashboard: `http://localhost:8080`
|
---
|
||||||
|
|
||||||
### 4. WordPress einrichten
|
## WP-CLI Befehle
|
||||||
|
|
||||||
Nach dem ersten Start WordPress unter `http://localhost:81` (oder intern) einrichten:
|
```bash
|
||||||
|
# Beliebige WP-CLI Befehle ausführen:
|
||||||
|
make wp plugin list
|
||||||
|
make wp user list
|
||||||
|
make wp cache flush
|
||||||
|
```
|
||||||
|
|
||||||
1. WordPress-Installation abschließen
|
---
|
||||||
2. **Yoast SEO Plugin** installieren (für SEO-Meta-Tags)
|
|
||||||
3. In WordPress-Admin unter **Benutzer → Profil → Application Passwords** ein neues Passwort erstellen
|
|
||||||
4. Passwort in `.env` als `WP_APP_PASSWORD` eintragen
|
|
||||||
5. Container neu starten: `docker compose restart web`
|
|
||||||
|
|
||||||
## Konfiguration (.env)
|
|
||||||
|
|
||||||
| Variable | Beschreibung |
|
|
||||||
|----------|-------------|
|
|
||||||
| `DASHBOARD_USER` | Login-Name für das Dashboard |
|
|
||||||
| `DASHBOARD_PASSWORD` | Login-Passwort für das Dashboard |
|
|
||||||
| `WP_URL` | WordPress-URL (intern: `http://wordpress`) |
|
|
||||||
| `WP_USERNAME` | WordPress-Benutzername |
|
|
||||||
| `WP_APP_PASSWORD` | WordPress Application Password |
|
|
||||||
| `OPENROUTER_API_KEY` | API-Key von openrouter.ai |
|
|
||||||
| `TELEGRAM_BOT_TOKEN` | Telegram Bot-Token |
|
|
||||||
| `TELEGRAM_CHANNEL_ID` | Kanal für KI-Artikel Teaser |
|
|
||||||
| `TELEGRAM_REVIEWER_IDS` | Chat-IDs für Fehler-Alarm (kommagetrennt) |
|
|
||||||
| `TIMEZONE` | Zeitzone (Standard: `Europe/Berlin`) |
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
### KI-Artikel
|
|
||||||
1. Quelle eingeben + Ton wählen → KI generiert Artikel
|
|
||||||
2. In Vorschau prüfen, ggf. bearbeiten
|
|
||||||
3. Einplanen oder sofort veröffentlichen
|
|
||||||
4. → WordPress + automatischer Telegram-Teaser
|
|
||||||
|
|
||||||
### RSS-Artikel
|
|
||||||
1. Feed unter `/feeds` hinzufügen
|
|
||||||
2. Modus wählen: Manuell / Auto-Publish / KI-Rewrite
|
|
||||||
3. Neue Artikel landen in Queue oder werden direkt veröffentlicht
|
|
||||||
4. → Nur WordPress (kein Telegram)
|
|
||||||
|
|
||||||
## Architektur
|
## Architektur
|
||||||
|
|
||||||
```
|
```
|
||||||
docker-compose.yml
|
┌─────────────────────────────────────────────────┐
|
||||||
├── web Flask Dashboard (:8080)
|
│ Docker Stack │
|
||||||
├── wordpress WordPress + Apache (:80 intern)
|
│ │
|
||||||
└── db MySQL 8
|
│ ┌──────────────┐ ┌───────────────────────┐ │
|
||||||
|
│ │ redax-web │ │ redax-wordpress │ │
|
||||||
|
│ │ Flask :8080 │◄──►│ Apache/PHP :80 │ │
|
||||||
|
│ └──────┬───────┘ └──────────┬────────────┘ │
|
||||||
|
│ │ │ │
|
||||||
|
│ └──────────┬────────────┘ │
|
||||||
|
│ ▼ │
|
||||||
|
│ ┌──────────────┐ │
|
||||||
|
│ │ redax-db │ │
|
||||||
|
│ │ MySQL :3306│ │
|
||||||
|
│ └──────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────┘
|
||||||
|
│ │
|
||||||
|
▼ ▼
|
||||||
|
https://redax. https://blog.
|
||||||
|
example.com example.com
|
||||||
|
(Dashboard) (Blog)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cloudflare Tunnel einrichten
|
||||||
|
|
||||||
|
Für öffentliche Erreichbarkeit ohne offene Ports:
|
||||||
|
|
||||||
|
1. [Cloudflare Zero Trust](https://one.dash.cloudflare.com) → Networks → Tunnels → Create
|
||||||
|
2. **Tunnel 1** (Dashboard):
|
||||||
|
- Hostname: `redax.example.com`
|
||||||
|
- Service: `http://localhost:8080`
|
||||||
|
3. **Tunnel 2** (Blog):
|
||||||
|
- Hostname: `blog.example.com`
|
||||||
|
- Service: `http://localhost:80`
|
||||||
|
4. Docker-Befehle aus Cloudflare kopieren und ausführen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Nach dem Setup
|
||||||
|
|
||||||
|
### Pflichtfelder nachträglich setzen
|
||||||
|
|
||||||
|
Nach dem Setup unbedingt in `.env` eintragen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano .env
|
||||||
|
# OPENROUTER_API_KEY=sk-or-v1-...
|
||||||
|
# TELEGRAM_BOT_TOKEN=...
|
||||||
|
# TELEGRAM_CHANNEL_ID=...
|
||||||
|
|
||||||
|
make restart # Änderungen übernehmen
|
||||||
|
```
|
||||||
|
|
||||||
|
### WordPress konfigurieren
|
||||||
|
|
||||||
|
- **WP-Admin:** `https://blog.example.com/wp-admin`
|
||||||
|
- Kategorien umbenennen: WP-Admin → Beiträge → Kategorien
|
||||||
|
- Yoast SEO einrichten: SEO → Allgemein
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Daten & Verzeichnisse
|
||||||
|
|
||||||
|
```
|
||||||
|
redax-wp/
|
||||||
|
├── data/
|
||||||
|
│ ├── mysql/ # MySQL-Datenbank (persistent)
|
||||||
|
│ ├── wordpress/ # WordPress-Dateien + Uploads
|
||||||
|
│ └── db/ # Redax-WP SQLite-Datenbank
|
||||||
|
├── logs/ # Anwendungs-Logs
|
||||||
|
├── src/ # Dashboard-Quellcode (Flask)
|
||||||
|
├── .env # Konfiguration (nicht ins Git!)
|
||||||
|
├── .env.example # Vorlage
|
||||||
|
├── docker-compose.yml
|
||||||
|
├── setup.sh # Automatisches Ersteinrichtungs-Skript
|
||||||
|
└── Makefile # Komfort-Befehle
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
| Feature | Status |
|
||||||
|
|---------|--------|
|
||||||
|
| KI-Artikel generieren (OpenRouter) | ✅ |
|
||||||
|
| WordPress REST API Integration | ✅ |
|
||||||
|
| Yoast SEO Felder | ✅ |
|
||||||
|
| RSS Feed Import | ✅ |
|
||||||
|
| Redaktionskalender (7 Tage) | ✅ |
|
||||||
|
| Telegram Benachrichtigungen | ✅ |
|
||||||
|
| Morgen-Briefing (10:00 Uhr) | ✅ |
|
||||||
|
| Featured Image (og:image) | ✅ |
|
||||||
|
| Strukturierte Logs | ✅ |
|
||||||
|
| Multi-Reviewer Support | ✅ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Lizenz
|
## Lizenz
|
||||||
|
|
||||||
MIT
|
MIT — frei verwendbar, anpassbar, weitergabe erlaubt.
|
||||||
|
|
|
||||||
234
redax-wp/setup.sh
Executable file
234
redax-wp/setup.sh
Executable file
|
|
@ -0,0 +1,234 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ╔═══════════════════════════════════════════════════════════╗
|
||||||
|
# ║ Redax-WP — Automatisches Setup-Skript ║
|
||||||
|
# ╚═══════════════════════════════════════════════════════════╝
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BOLD='\033[1m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
ok() { echo -e "${GREEN}✓${NC} $1"; }
|
||||||
|
info() { echo -e "${BLUE}→${NC} $1"; }
|
||||||
|
warn() { echo -e "${YELLOW}!${NC} $1"; }
|
||||||
|
err() { echo -e "${RED}✗${NC} $1"; exit 1; }
|
||||||
|
ask() { echo -e "${BOLD}$1${NC}"; }
|
||||||
|
|
||||||
|
banner() {
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}╔═══════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BOLD}║ Redax-WP Setup-Assistent ║${NC}"
|
||||||
|
echo -e "${BOLD}╚═══════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_password() {
|
||||||
|
tr -dc 'A-Za-z0-9!@#' < /dev/urandom | head -c 16
|
||||||
|
}
|
||||||
|
|
||||||
|
wpcli() {
|
||||||
|
docker run --rm \
|
||||||
|
--network "$(basename "$PWD")_redax-internal" \
|
||||||
|
-v "$(pwd)/data/wordpress:/var/www/html" \
|
||||||
|
-e WORDPRESS_DB_HOST=redax-db \
|
||||||
|
-e WORDPRESS_DB_USER="$MYSQL_USER" \
|
||||||
|
-e WORDPRESS_DB_PASSWORD="$MYSQL_PASSWORD" \
|
||||||
|
-e WORDPRESS_DB_NAME="$MYSQL_DATABASE" \
|
||||||
|
--user root \
|
||||||
|
wordpress:cli "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─── Prüfungen ────────────────────────────────────────────────────────────────
|
||||||
|
banner
|
||||||
|
|
||||||
|
command -v docker >/dev/null 2>&1 || err "Docker nicht gefunden. Bitte Docker installieren."
|
||||||
|
docker compose version >/dev/null 2>&1 || err "Docker Compose nicht gefunden."
|
||||||
|
|
||||||
|
if [ -f ".env" ]; then
|
||||||
|
warn ".env existiert bereits."
|
||||||
|
read -rp " Überschreiben? (j/N): " overwrite
|
||||||
|
[[ "$overwrite" =~ ^[jJ]$ ]] || { info "Setup abgebrochen."; exit 0; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─── Eingaben sammeln ─────────────────────────────────────────────────────────
|
||||||
|
echo -e "${BOLD}── 1/5 Projekt-Name ──────────────────────────────────────${NC}"
|
||||||
|
read -rp " Projekt-Name (z.B. mein-blog): " PROJECT_NAME
|
||||||
|
PROJECT_NAME="${PROJECT_NAME:-redax-wp}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}── 2/5 Domains ───────────────────────────────────────────${NC}"
|
||||||
|
read -rp " WordPress-Domain (z.B. blog.example.com): " WP_DOMAIN
|
||||||
|
read -rp " Dashboard-Domain (z.B. redax.example.com): " DASH_DOMAIN
|
||||||
|
WP_URL="https://${WP_DOMAIN}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}── 3/5 Zugangsdaten ──────────────────────────────────────${NC}"
|
||||||
|
read -rp " Dashboard-Benutzer [admin]: " DASHBOARD_USER
|
||||||
|
DASHBOARD_USER="${DASHBOARD_USER:-admin}"
|
||||||
|
read -rsp " Dashboard-Passwort [auto]: " DASHBOARD_PASSWORD
|
||||||
|
echo ""
|
||||||
|
DASHBOARD_PASSWORD="${DASHBOARD_PASSWORD:-$(gen_password)}"
|
||||||
|
|
||||||
|
read -rp " WordPress Admin-Benutzer [admin]: " WP_ADMIN_USER
|
||||||
|
WP_ADMIN_USER="${WP_ADMIN_USER:-admin}"
|
||||||
|
read -rsp " WordPress Admin-Passwort [auto]: " WP_ADMIN_PASSWORD
|
||||||
|
echo ""
|
||||||
|
WP_ADMIN_PASSWORD="${WP_ADMIN_PASSWORD:-$(gen_password)}"
|
||||||
|
read -rp " WordPress Admin-E-Mail: " WP_ADMIN_EMAIL
|
||||||
|
WP_ADMIN_EMAIL="${WP_ADMIN_EMAIL:-admin@example.com}"
|
||||||
|
read -rp " Blog-Titel [DeutschlandBlog]: " WP_TITLE
|
||||||
|
WP_TITLE="${WP_TITLE:-DeutschlandBlog}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}── 4/5 API-Keys (optional — Enter zum Überspringen) ──────${NC}"
|
||||||
|
read -rp " OpenRouter API Key: " OPENROUTER_API_KEY
|
||||||
|
read -rp " Telegram Bot Token: " TELEGRAM_BOT_TOKEN
|
||||||
|
read -rp " Telegram Kanal-ID: " TELEGRAM_CHANNEL_ID
|
||||||
|
read -rp " Telegram Reviewer Chat-IDs (kommagetrennt): " TELEGRAM_REVIEWER_IDS
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}── 5/5 Kategorien ────────────────────────────────────────${NC}"
|
||||||
|
read -rp " Kategorien (kommagetrennt) [Rubrik 1,Rubrik 2,Rubrik 3,Rubrik 4]: " CATEGORIES_RAW
|
||||||
|
CATEGORIES_RAW="${CATEGORIES_RAW:-Rubrik 1,Rubrik 2,Rubrik 3,Rubrik 4}"
|
||||||
|
|
||||||
|
# ─── Passwörter generieren ────────────────────────────────────────────────────
|
||||||
|
MYSQL_ROOT_PASSWORD="$(gen_password)"
|
||||||
|
MYSQL_PASSWORD="$(gen_password)"
|
||||||
|
MYSQL_USER="wordpress"
|
||||||
|
MYSQL_DATABASE="wordpress"
|
||||||
|
SECRET_KEY="$(tr -dc 'a-f0-9' < /dev/urandom | head -c 48)"
|
||||||
|
DB_PATH="/data/redax.db"
|
||||||
|
|
||||||
|
# ─── .env schreiben ───────────────────────────────────────────────────────────
|
||||||
|
cat > .env <<EOF
|
||||||
|
# Redax-WP Konfiguration — generiert am $(date)
|
||||||
|
# Projekt: ${PROJECT_NAME}
|
||||||
|
|
||||||
|
# ─── Dashboard ────────────────────────────────────────────────────────────────
|
||||||
|
DASHBOARD_USER=${DASHBOARD_USER}
|
||||||
|
DASHBOARD_PASSWORD=${DASHBOARD_PASSWORD}
|
||||||
|
|
||||||
|
# ─── WordPress ────────────────────────────────────────────────────────────────
|
||||||
|
WP_URL=${WP_URL}
|
||||||
|
WP_USERNAME=${WP_ADMIN_USER}
|
||||||
|
WP_APP_PASSWORD=
|
||||||
|
WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD}
|
||||||
|
|
||||||
|
# ─── KI (OpenRouter) ──────────────────────────────────────────────────────────
|
||||||
|
OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
|
||||||
|
|
||||||
|
# ─── Telegram ─────────────────────────────────────────────────────────────────
|
||||||
|
TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
|
||||||
|
TELEGRAM_CHANNEL_ID=${TELEGRAM_CHANNEL_ID}
|
||||||
|
TELEGRAM_REVIEWER_IDS=${TELEGRAM_REVIEWER_IDS}
|
||||||
|
|
||||||
|
# ─── System ───────────────────────────────────────────────────────────────────
|
||||||
|
TIMEZONE=Europe/Berlin
|
||||||
|
SECRET_KEY=${SECRET_KEY}
|
||||||
|
DB_PATH=${DB_PATH}
|
||||||
|
|
||||||
|
# ─── Datenbank ────────────────────────────────────────────────────────────────
|
||||||
|
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
||||||
|
MYSQL_DATABASE=${MYSQL_DATABASE}
|
||||||
|
MYSQL_USER=${MYSQL_USER}
|
||||||
|
MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ok ".env erstellt"
|
||||||
|
|
||||||
|
# ─── Verzeichnisse anlegen ────────────────────────────────────────────────────
|
||||||
|
mkdir -p data/mysql data/wordpress data/db logs
|
||||||
|
ok "Verzeichnisse erstellt"
|
||||||
|
|
||||||
|
# ─── Docker Stack starten ─────────────────────────────────────────────────────
|
||||||
|
echo ""
|
||||||
|
info "Starte Docker Stack..."
|
||||||
|
docker compose up -d --build 2>&1 | grep -E "Started|Created|Building|Error" || true
|
||||||
|
|
||||||
|
info "Warte auf WordPress-Datenbank (30s)..."
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# ─── WordPress einrichten ─────────────────────────────────────────────────────
|
||||||
|
echo ""
|
||||||
|
info "Installiere WordPress..."
|
||||||
|
wpcli wp core install \
|
||||||
|
--url="$WP_URL" \
|
||||||
|
--title="$WP_TITLE" \
|
||||||
|
--admin_user="$WP_ADMIN_USER" \
|
||||||
|
--admin_password="$WP_ADMIN_PASSWORD" \
|
||||||
|
--admin_email="$WP_ADMIN_EMAIL" \
|
||||||
|
--allow-root 2>&1 | grep -v "sendmail"
|
||||||
|
|
||||||
|
info "Setze Permalink-Struktur..."
|
||||||
|
wpcli wp rewrite structure '/%postname%/' --allow-root 2>&1 | grep -v "^$"
|
||||||
|
|
||||||
|
info "Installiere Blocksy Theme..."
|
||||||
|
wpcli wp theme install blocksy --activate --allow-root 2>&1 | tail -2
|
||||||
|
|
||||||
|
info "Installiere Plugins..."
|
||||||
|
wpcli wp plugin install blocksy-companion --activate --allow-root 2>&1 | tail -2
|
||||||
|
wpcli wp plugin install wordpress-seo --activate --allow-root 2>&1 | tail -2
|
||||||
|
|
||||||
|
info "Erstelle Kategorien..."
|
||||||
|
wpcli wp term delete category 1 --allow-root 2>&1 | grep -v "^$" || true
|
||||||
|
IFS=',' read -ra CATS <<< "$CATEGORIES_RAW"
|
||||||
|
FIRST_CAT_ID=""
|
||||||
|
for cat in "${CATS[@]}"; do
|
||||||
|
cat=$(echo "$cat" | xargs)
|
||||||
|
slug=$(echo "$cat" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
|
||||||
|
result=$(wpcli wp term create category "$cat" --slug="$slug" --allow-root 2>&1)
|
||||||
|
cat_id=$(echo "$result" | grep -oP 'Created category \K[0-9]+' || echo "")
|
||||||
|
[ -z "$FIRST_CAT_ID" ] && [ -n "$cat_id" ] && FIRST_CAT_ID="$cat_id"
|
||||||
|
ok " Kategorie: $cat"
|
||||||
|
done
|
||||||
|
|
||||||
|
info "Erstelle Hauptmenü..."
|
||||||
|
wpcli wp menu create "Hauptmenue" --allow-root 2>&1 | grep -v "^$"
|
||||||
|
IFS=',' read -ra CATS <<< "$CATEGORIES_RAW"
|
||||||
|
CAT_ID=2
|
||||||
|
for cat in "${CATS[@]}"; do
|
||||||
|
wpcli wp menu item add-term hauptmenue category $CAT_ID --allow-root 2>&1 | grep -v "^$" || true
|
||||||
|
((CAT_ID++))
|
||||||
|
done
|
||||||
|
wpcli wp menu location assign hauptmenue menu_1 --allow-root 2>&1 | grep -v "^$"
|
||||||
|
wpcli wp menu location assign hauptmenue menu_mobile --allow-root 2>&1 | grep -v "^$"
|
||||||
|
|
||||||
|
info "Erstelle WordPress Application Password..."
|
||||||
|
APP_PASS=$(wpcli wp user application-password create "$WP_ADMIN_USER" redax-api --porcelain --allow-root 2>&1 | tail -1)
|
||||||
|
|
||||||
|
# Application Password in .env eintragen
|
||||||
|
sed -i "s|WP_APP_PASSWORD=|WP_APP_PASSWORD=${APP_PASS}|" .env
|
||||||
|
ok "Application Password gesetzt"
|
||||||
|
|
||||||
|
# ─── Berechtigungen setzen ────────────────────────────────────────────────────
|
||||||
|
mkdir -p data/wordpress/wp-content/uploads
|
||||||
|
chown -R 33:33 data/wordpress/wp-content/ 2>/dev/null || true
|
||||||
|
|
||||||
|
# ─── Dashboard neustarten mit aktualiserter .env ──────────────────────────────
|
||||||
|
info "Dashboard-Container neustarten..."
|
||||||
|
docker compose up -d --no-deps web 2>&1 | grep -E "Started|Created" || true
|
||||||
|
|
||||||
|
# ─── Zusammenfassung ──────────────────────────────────────────────────────────
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD}╔═══════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BOLD}║ Setup abgeschlossen ✓ ║${NC}"
|
||||||
|
echo -e "${BOLD}╚═══════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD} Blog:${NC} ${WP_URL}"
|
||||||
|
echo -e "${BOLD} WP-Admin:${NC} ${WP_URL}/wp-admin"
|
||||||
|
echo -e "${BOLD} Dashboard:${NC} https://${DASH_DOMAIN}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BOLD} WP Login:${NC} ${WP_ADMIN_USER} / ${WP_ADMIN_PASSWORD}"
|
||||||
|
echo -e "${BOLD} Dashboard:${NC} ${DASHBOARD_USER} / ${DASHBOARD_PASSWORD}"
|
||||||
|
echo ""
|
||||||
|
if [ -z "$OPENROUTER_API_KEY" ]; then
|
||||||
|
warn "OpenRouter API Key fehlt noch → .env anpassen und 'make restart' ausführen"
|
||||||
|
fi
|
||||||
|
if [ -z "$TELEGRAM_BOT_TOKEN" ]; then
|
||||||
|
warn "Telegram Bot Token fehlt noch → .env anpassen und 'make restart' ausführen"
|
||||||
|
fi
|
||||||
|
echo -e "${BOLD} Cloudflare Tunnel:${NC} Manuell einrichten (siehe README.md)"
|
||||||
|
echo ""
|
||||||
Loading…
Add table
Reference in a new issue