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:
root 2026-02-27 10:45:20 +07:00
parent b9eac9394f
commit 3e2598257e
4 changed files with 530 additions and 77 deletions

View file

@ -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_PASSWORD=changeme
# ─── WordPress (intern via Docker-Netzwerk) ───────────────────────────────────
WP_URL=http://wordpress
# ─── WordPress Verbindung ─────────────────────────────────────────────────────
# 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_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
WORDPRESS_DB_PASSWORD=wp_secret_123
# ─── KI (OpenRouter) ──────────────────────────────────────────────────────────
OPENROUTER_API_KEY=sk-or-v1-...
# Application Password (in WP-Admin unter Benutzer → Profil generieren,
# oder automatisch per setup.sh)
# Format: xxxx xxxx xxxx xxxx xxxx xxxx
WP_APP_PASSWORD=
# ─── Telegram ─────────────────────────────────────────────────────────────────
# Bot-Token für Benachrichtigungen nach Veröffentlichung
# Muss identisch mit MYSQL_PASSWORD sein
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=
# 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=
# 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=
# ─── Zeitzone ─────────────────────────────────────────────────────────────────
# ─── System ───────────────────────────────────────────────────────────────────
# Zeitzone (IANA-Format)
TIMEZONE=Europe/Berlin
# ─── WordPress Datenbank ──────────────────────────────────────────────────────
MYSQL_ROOT_PASSWORD=root_secret_123
# Zufälliger geheimer Schlüssel für Flask-Sessions (mindestens 32 Zeichen)
# 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_USER=wordpress
MYSQL_PASSWORD=wp_secret_123
MYSQL_PASSWORD=wp_secret_CHANGEME

96
redax-wp/Makefile Normal file
View 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"

View file

@ -1,90 +1,186 @@
# 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
### 1. Repository klonen
```bash
git clone https://git.orbitalo.net/orbitalo/redax-wp.git
cd redax-wp
# 1. Repository klonen
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
cp .env.example .env
# .env mit eigenen Werten befüllen (Editor öffnen)
nano .env
# .env anpassen
docker compose up -d --build
```
### 3. Starten
---
## Nützliche Befehle
```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
```
docker-compose.yml
├── web Flask Dashboard (:8080)
├── wordpress WordPress + Apache (:80 intern)
└── db MySQL 8
┌─────────────────────────────────────────────────┐
│ Docker Stack │
│ │
│ ┌──────────────┐ ┌───────────────────────┐ │
│ │ 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
MIT
MIT — frei verwendbar, anpassbar, weitergabe erlaubt.

234
redax-wp/setup.sh Executable file
View 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 ""