Files
feadulta/scripts/cutover/01-traer-dump.sh
rafa 65359338f8 cutover: los scripts con los que se ejecuto, y lo que quedo pendiente
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>
2026-08-03 07:00:38 -04:00

55 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
#
# Paso 1-2 del cutover: traer el dump de BD del dia. CDMON -> WSL -> Hetzner.
#
# Dos saltos a proposito: scp/sftp no funcionan contra la jaula de CDMON, y no
# queremos dejar la contrasena de CDMON escrita en el Hetzner. Se verifica el
# sha256 en los tres puntos y la integridad del gzip en dos.
#
# Uso: bash 01-traer-dump.sh [nombre-del-dump]
# sin argumento coge el mas reciente de /web/wp-content/updraft/
#
set -euo pipefail
set -a; . ~/.hermes/profiles/feadulta/.env 2>/dev/null; set +a
WORK=/home/rafa/migracion-wp
SRV=root@188.40.120.157
ORIG=feadulta@134.0.10.170
mkdir -p "$WORK"
s() { sshpass -p "$FEA_PROD_SSH_PASS" ssh -o StrictHostKeyChecking=accept-new "$ORIG" "$@"; }
DUMP="${1:-}"
if [ -z "$DUMP" ]; then
# sin xargs ni basename: la jaula de CDMON tiene un PATH minimo
DUMP=$(s 'ls -t /web/wp-content/updraft/*-db.gz | head -1 | sed "s|.*/||"')
fi
echo "== dump elegido: $DUMP"
echo "== en origen:"
s "php -r \"\\\$p='/web/wp-content/updraft/$DUMP'; echo ' ',filesize(\\\$p),' bytes sha256=',hash_file('sha256',\\\$p),\\\"\n\\\";\""
echo "== descargando a la WSL:"
T0=$(date +%s)
s "cat /web/wp-content/updraft/$DUMP" > "$WORK/$DUMP"
T1=$(date +%s); echo " descarga: $((T1-T0))s"
echo "== integridad en la WSL:"
ls -l "$WORK/$DUMP" | awk '{print " ", $5, "bytes"}'
sha256sum "$WORK/$DUMP" | awk '{print " sha256=", $1}'
gzip -t "$WORK/$DUMP" && echo " gzip: integro"
echo "== subiendo al Hetzner:"
ssh -o BatchMode=yes "$SRV" 'mkdir -p /data/feadulta-migracion'
T2=$(date +%s)
scp -q "$WORK/$DUMP" "$SRV:/data/feadulta-migracion/"
T3=$(date +%s); echo " subida: $((T3-T2))s"
echo "== verificacion en destino:"
ssh -o BatchMode=yes "$SRV" "cd /data/feadulta-migracion && ls -l $DUMP | awk '{print \" \", \$5, \" bytes\"}' && sha256sum $DUMP | awk '{print \" sha256=\", \$1}' && gzip -t $DUMP && echo ' gzip: integro'"
echo ""
echo "== total: $(( $(date +%s) - T0 ))s"
echo "$DUMP" > "$WORK/DUMP-DEL-DIA"
echo " (nombre guardado en $WORK/DUMP-DEL-DIA para el paso siguiente)"