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