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:
160
docker/setup.sh
Normal file
160
docker/setup.sh
Normal 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"
|
||||
Reference in New Issue
Block a user