homelab-brain/redax-wp/setup.sh
root 3e2598257e 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
2026-02-27 10:45:34 +07:00

234 lines
12 KiB
Bash
Executable file

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