Web de Gure Ametsa Bi Lagun en WordPress para Dokploy

- Docker Compose (WordPress + MariaDB) listo para Dokploy, con instalación
  automática por etapas: idiomas, páginas, menús y plugins recomendados.
- Web bilingüe castellano / euskera con Polylang.
- Tema propio «gure-ametsa»: diseño inspirado en Beargrass Animal Rescue,
  personalizable desde Apariencia → Personalizar (paletas, tipografías,
  secciones de portada ordenables) y patrones de bloques propios.
- Plugin mu «gure-ametsa-core»: animales en adopción con ficha y filtros,
  carrusel y formulario de contacto/adopción.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 16:21:26 +02:00
parent 97b8c1be31
commit 0b2c9f271f
64 changed files with 4561 additions and 0 deletions

160
docker/setup.sh Normal file
View File

@@ -0,0 +1,160 @@
#!/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
<IfModule mod_rewrite.c>
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]
</IfModule>
# 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"