#!/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 <&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 ""