#!/bin/bash # Configuración inicial idempotente de WordPress para Gure Ametsa Bi Lagun. # Se ejecuta en segundo plano en cada arranque del contenedor. set -uo pipefail log() { echo "[ga-setup] $*"; } WP_PATH=/var/www/html SRC=/usr/src/gure-ametsa export WP_CLI_CACHE_DIR=/tmp/wp-cli-cache wp_() { runuser -u www-data -- wp --path="$WP_PATH" "$@"; } # 1. Esperar a que el entrypoint oficial copie WordPress y genere wp-config.php for _ in $(seq 1 120); do [[ -f "$WP_PATH/wp-config.php" && -f "$WP_PATH/wp-includes/version.php" ]] && break sleep 1 done # 2. Sincronizar tema y mu-plugins propios (siempre, para que las actualizaciones de imagen se apliquen) mkdir -p "$WP_PATH/wp-content/themes" "$WP_PATH/wp-content/mu-plugins" "$WP_PATH/wp-content/uploads" rm -rf "$WP_PATH/wp-content/themes/gure-ametsa" cp -r "$SRC/themes/gure-ametsa" "$WP_PATH/wp-content/themes/" cp -r "$SRC/mu-plugins/." "$WP_PATH/wp-content/mu-plugins/" # Polylang: se copia solo si no existe (después se actualiza desde el panel) if [[ ! -d "$WP_PATH/wp-content/plugins/polylang" ]]; then mkdir -p "$WP_PATH/wp-content/plugins" cp -r "$SRC/plugins/polylang" "$WP_PATH/wp-content/plugins/" fi chown -R www-data:www-data "$WP_PATH/wp-content" log "Tema y mu-plugins sincronizados" # .htaccess para enlaces permanentes bonitos if [[ ! -f "$WP_PATH/.htaccess" ]]; then cat > "$WP_PATH/.htaccess" <<'EOF' # BEGIN WordPress RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress EOF chown www-data:www-data "$WP_PATH/.htaccess" fi # 3. Esperar a la base de datos for i in $(seq 1 60); do if php -r ' $h = getenv("WORDPRESS_DB_HOST") ?: "db"; $p = 3306; if (strpos($h, ":") !== false) { [$h, $p] = explode(":", $h, 2); } $m = @new mysqli($h, getenv("WORDPRESS_DB_USER"), getenv("WORDPRESS_DB_PASSWORD"), getenv("WORDPRESS_DB_NAME"), (int) $p); exit($m->connect_errno ? 1 : 0);'; then break fi [[ $i -eq 60 ]] && { log "La base de datos no responde; se aborta la configuración"; exit 1; } sleep 2 done # 4. Instalar WordPress si hace falta if ! wp_ core is-installed 2>/dev/null; then : "${WP_URL:?Falta WP_URL}" "${WP_ADMIN_USER:?Falta WP_ADMIN_USER}" "${WP_ADMIN_PASSWORD:?Falta WP_ADMIN_PASSWORD}" "${WP_ADMIN_EMAIL:?Falta WP_ADMIN_EMAIL}" log "Instalando WordPress en $WP_URL" wp_ core install \ --url="$WP_URL" \ --title="${WP_TITLE:-Gure Ametsa Bi Lagun}" \ --admin_user="$WP_ADMIN_USER" \ --admin_password="$WP_ADMIN_PASSWORD" \ --admin_email="$WP_ADMIN_EMAIL" \ --skip-email || { log "Fallo en la instalación"; exit 1; } fi # 5. Configuración por etapas (cada etapa se ejecuta una sola vez) VERSION=$(wp_ option get ga_setup_version 2>/dev/null || echo 0) [[ "$VERSION" =~ ^[0-9]+$ ]] || VERSION=0 # Etapa 2: idiomas, tema, contenido inicial if (( VERSION < 2 )); then log "Configurando el sitio por primera vez" # Idiomas, zona horaria y ajustes generales { wp_ language core install es_ES && wp_ site switch-language es_ES; } || log "No se pudo instalar es_ES (¿sin internet?)" wp_ language core install eu || log "No se pudo instalar eu (¿sin internet?)" wp_ option update blogdescription "Adopta y cambia dos mundos · Hondarribia" wp_ option update timezone_string "Europe/Madrid" wp_ option update start_of_week 1 wp_ option update default_comment_status closed wp_ option update default_ping_status closed wp_ rewrite structure '/%postname%/' wp_ theme activate gure-ametsa # Limpiar contenido de ejemplo y extras wp_ post delete 1 2 3 --force 2>/dev/null || true wp_ plugin delete hello akismet 2>/dev/null || true # Polylang: web bilingüe castellano / euskera wp_ plugin activate polylang || log "No se pudo activar Polylang: la web quedará solo en castellano" wp_ language plugin install polylang es_ES eu 2>/dev/null || true # Idiomas, páginas, especies, menús y (opcional) animales de ejemplo if ! wp_ eval-file "$SRC/setup-content.php"; then log "Fallo creando el contenido inicial" exit 1 fi wp_ rewrite flush wp_ option update ga_setup_version 2 fi # Etapa 3: plugins recomendados if (( VERSION < 3 )); then log "Instalando plugins recomendados" # Activos desde el principio ACTIVE=( wp-mail-smtp # Envío de correo fiable (SMTP) updraftplus # Copias de seguridad limit-login-attempts-reloaded # Bloqueo de ataques al login two-factor # Verificación en dos pasos webp-converter-for-media # Fotos más ligeras (WebP) wordpress-seo # Yoast SEO instagram-feed # Feed de Instagram koko-analytics # Estadísticas sin cookies kadence-blocks # Bloques visuales: carruseles, pestañas, acordeones… blocks-animation # Animaciones de entrada para cualquier bloque ) # Instalados pero desactivados: se activan cuando se necesiten INACTIVE=( give # Donaciones online (GiveWP) mailpoet # Newsletter complianz-gdpr # Aviso de cookies (solo si se añaden cookies de terceros) wp-super-cache # Caché de páginas ) for plugin in "${ACTIVE[@]}"; do wp_ plugin install "$plugin" --activate >/dev/null 2>&1 && log " ✓ $plugin" || log " ✗ No se pudo instalar $plugin" done for plugin in "${INACTIVE[@]}"; do wp_ plugin install "$plugin" >/dev/null 2>&1 && log " ✓ $plugin (desactivado)" || log " ✗ No se pudo instalar $plugin" done wp_ language plugin install --all es_ES eu >/dev/null 2>&1 || true # Sin pantallas de bienvenida de los plugins al entrar por primera vez al panel wp_ transient delete --all >/dev/null 2>&1 || true wp_ option delete sbi_plugin_do_activation_redirect >/dev/null 2>&1 || true # Copias de seguridad: base de datos a diario, archivos cada semana wp_ option update updraft_interval weekly wp_ option update updraft_interval_database daily wp_ option update updraft_retain 4 wp_ option update updraft_retain_db 14 wp_ option update ga_setup_version 3 fi log "Configuración completada"