- 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
234 lines
12 KiB
Bash
Executable file
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 ""
|