65359338f8
Cutover hecho el 3-ago a las 10:50 UTC. feadulta.com y www.feadulta.com ya apuntan a 188.40.120.157, proxied. Ventana real ~3 min 10 s: dump 67 s, saneo 2 s, import 114 s, delta de uploads 6 s (0 ficheros, como estaba medido). Cuadro al digito con produccion: 43.893 posts, 1.228 usuarios, 4.416 terms, 135.959 postmeta. Los options salen 958 frente a 975 porque son transients (hay 580 y caducan solos). Con trafico real: 581 respuestas 200, 62 301, 16 302, cero 5xx y cero errores PHP en 20 minutos, 61 IPs distintas atendidas. Se anaden los cuatro scripts que faltaban, que hasta hoy solo existian como comandos sueltos del ensayo: 01-traer-dump, 02-sanear-dump, 03-importar, 04-delta-uploads y 05-mover-dns. El runbook ya los citaba por nombre. Tres cosas encontradas al ejecutar, anotadas en los propios scripts: - docker exec -i dentro de un ssh 'bash -s' <<EOF se come el resto del script, porque hereda el stdin del heredoc. Las consultas van sin -i y con </dev/null. - Smart Slider cachea el HTML del slider con URLs absolutas, una fila por idioma en wp_nextend2_section_storage con application='cache'. Al verificar el import con la constante del staging todavia puesta quedaron 5 filas apuntando a nuevo.feadulta.com. Se borran y se regeneran solas. - El cliente de MariaDB de la jaula de CDMON exige TLS y el servidor local no lo tiene: con --skip-ssl si se puede consultar la BD de produccion directamente, que es como se comprobo que no habia cambiado nada desde el dump de las 05:09. Pendiente y fuera de nuestro alcance: purgar la cache de Cloudflare (el token solo tiene permiso de DNS) y darle a Inma su contrasena nueva. Y los certificados de Let's Encrypt para www y el apex, que fallan porque el WAF de Cloudflare devuelve 403 a la validacion; no bloquea mientras la zona este en Full, pero por eso mismo no se puede subir a Full (strict) todavia. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
60 lines
2.8 KiB
Bash
Executable File
60 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Paso 5 del cutover: delta de uploads.
|
|
#
|
|
# El grueso (5,9 GB / 47.920 ficheros) se pre-sincronizo el 31-jul. Aqui solo viaja
|
|
# lo publicado desde entonces. Dos saltos igual que el dump: CDMON -> WSL -> Hetzner,
|
|
# para no dejar la contrasena de CDMON escrita en el servidor.
|
|
#
|
|
# --partial y ServerAliveInterval porque un rsync largo contra este enlace se corta
|
|
# EN SILENCIO (la primera pasada del 31-jul murio a 36.289 de 47.920 sin error en el
|
|
# log). Por eso al final se comparan los recuentos de los dos lados: no vale con que
|
|
# rsync diga que termino.
|
|
#
|
|
# Los .php se excluyen a proposito: en uploads solo hay 2 y son importadores de un
|
|
# solo uso, no tienen que viajar.
|
|
#
|
|
set -euo pipefail
|
|
set -a; . ~/.hermes/profiles/feadulta/.env 2>/dev/null; set +a
|
|
|
|
STAGE=/tmp/fea-uploads-staging
|
|
SRV=root@188.40.120.157
|
|
DEST=/var/lib/docker/volumes/r2ssjifwj0r0ghyoqd528uaa_wordpress-files/_data/wp-content/uploads
|
|
|
|
echo "== antes:"
|
|
printf " WSL : "; find "$STAGE" -type f | wc -l
|
|
printf " Hetzner : "; ssh -o BatchMode=yes "$SRV" "find $DEST -type f | wc -l"
|
|
printf " CDMON : "; sshpass -p "$FEA_PROD_SSH_PASS" ssh -o StrictHostKeyChecking=no feadulta@134.0.10.170 'find /web/wp-content/uploads -type f | wc -l'
|
|
|
|
echo ""
|
|
echo "== delta CDMON -> WSL:"
|
|
T0=$(date +%s)
|
|
sshpass -p "$FEA_PROD_SSH_PASS" rsync -a --partial --info=stats2 --exclude='*.php' \
|
|
-e "ssh -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=20 -o ServerAliveCountMax=6" \
|
|
feadulta@134.0.10.170:/web/wp-content/uploads/ "$STAGE/" \
|
|
| grep -E 'Number of (regular files transferred|deleted)|Total transferred file size' | sed 's/^/ /'
|
|
echo " $(( $(date +%s) - T0 ))s"
|
|
|
|
echo ""
|
|
echo "== delta WSL -> Hetzner (como www-data, uid 33):"
|
|
T1=$(date +%s)
|
|
rsync -a --partial --info=stats2 --exclude='*.php' --chown=33:33 \
|
|
-e "ssh -o BatchMode=yes -o ServerAliveInterval=20 -o ServerAliveCountMax=6" \
|
|
"$STAGE/" "$SRV:$DEST/" \
|
|
| grep -E 'Number of (regular files transferred|deleted)|Total transferred file size' | sed 's/^/ /'
|
|
echo " $(( $(date +%s) - T1 ))s"
|
|
|
|
echo ""
|
|
echo "== VERIFICACION por recuento (no fiarse de que rsync diga que termino):"
|
|
a=$(sshpass -p "$FEA_PROD_SSH_PASS" ssh -o StrictHostKeyChecking=no feadulta@134.0.10.170 'find /web/wp-content/uploads -type f ! -name "*.php" | wc -l')
|
|
b=$(find "$STAGE" -type f | wc -l)
|
|
c=$(ssh -o BatchMode=yes "$SRV" "find $DEST -type f | wc -l")
|
|
echo " CDMON (sin .php): $a"
|
|
echo " WSL : $b"
|
|
echo " Hetzner : $c"
|
|
[ "$a" = "$c" ] && echo " OK: origen y destino cuadran" || echo " !! NO CUADRAN, revisar antes de seguir"
|
|
|
|
echo ""
|
|
echo "== propietario en destino (no debe haber nada que no sea www-data):"
|
|
ssh -o BatchMode=yes "$SRV" "find $DEST ! -user 33 | head -5 | sed 's/^/ /'; echo ' ficheros con otro dueno: '\$(find $DEST ! -user 33 | wc -l)"
|