2
Sincronizacion local prod
rafa edited this page 2026-06-15 15:57:39 -04:00

Sincronización local → producción (wp-nuevo)

Actualizado 2026-06-15. Prod = /web/wp-nuevo/ en 134.0.10.170 (mismo server que el Joomla). El método con paramiko + base64 del .org viejo ya no se usa: ahora sshpass y tar están disponibles.

Antes de tocar nada, lee Limitaciones del servidor de producción.

Regla general: los IDs y el código viven en paralelo entre local y prod (misma migración). Replica los cambios del mismo modo y mantén los IDs sincronizados.

Acceso

export SSHPASS='C6c2A!mAl3Wj.BQF'
SSH="sshpass -e ssh -o StrictHostKeyChecking=accept-new feadulta@134.0.10.170"
WP="cd /web/wp-nuevo && wp --skip-plugins --skip-themes"

Subir ficheros (scp/sftp NO funcionan)

Fichero único (binario-safe):

$SSH 'cat > /web/wp-nuevo/wp-content/.../destino.png' < /local/fichero.png
$SSH 'wc -c /web/wp-nuevo/wp-content/.../destino.png'   # verificar tamaño (no hay stat)

Muchos ficheros → empaquetar y extraer con tar (sí existe en prod):

tar czf /tmp/bundle.tgz -C /local/dir subcarpeta/   # ojo a las rutas relativas del tar
$SSH 'cat > /web/wp-nuevo/wp-content/uploads/bundle.tgz' < /tmp/bundle.tgz
$SSH 'cd /web/wp-nuevo/wp-content/uploads && tar xzf bundle.tgz && rm bundle.tgz'

mu-plugins (fea-homepage.php, carta-semana-plugin.php)

# backup primero (no hay mysqldump/stat; cp sí)
$SSH 'cp /web/wp-nuevo/wp-content/mu-plugins/fea-homepage.php /entrada/fea-homepage.php.bak-$(date +%Y%m%d-%H%M)'
# subir
$SSH 'cat > /web/wp-nuevo/wp-content/mu-plugins/fea-homepage.php' < wordpress/wp-content/mu-plugins/fea-homepage.php

⚠️ No copiar post_content local→prod: mete URLs de farmer.taild3aaf6.ts.net. Transformar siempre sobre el contenido descargado de prod (wp post get ID --field=content), preservando sus URLs wp-nuevo.feadulta.com.

Posts / metas / opciones

Vía wp eval-file (sube el .php con cat > y ejecútalo). proc_open off → no wp db query/import; usar wp eval, wp post update ID /ruta/fichero, o mysql directo.

$SSH 'cat > /web/wp-nuevo/script.php' < script.php
$SSH 'cd /web/wp-nuevo && APPLY=1 wp --skip-plugins --skip-themes eval-file script.php'

Verificar (Cloudflare bloquea curl/headless)

Server-side únicamente, o pedir a Rafa que mire en el navegador:

$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes post get ID --field=content'
$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes eval "echo wp_get_attachment_url(ID);"'
$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes cache flush'

Sincronizar IDs entre local y prod

Los IDs de objetos suelen coincidir local↔prod (menú 1, archive 26561, cabecera 42366, pie 42370, template single 42359). Si difieren, mover con offset temporal +99000 para evitar conflictos de PK:

UPDATE wp_posts SET ID = ID + 99000 WHERE ID IN (...);
UPDATE wp_postmeta SET post_id = post_id + 99000 WHERE post_id IN (...);
UPDATE wp_term_relationships SET object_id = object_id + 99000 WHERE object_id IN (...);
-- luego mover a los IDs finales

Ejemplo real: despliegue de avatares (issue #62, 2026-06-15)

Patrón completo de referencia (genera PNGs en local → tar → ssh cattar xzfwp eval-file que crea attachments y reapunta foto_perfil, con backup en _foto_perfil_pre62):

  1. Generar ficheros en local (/tmp/...uploads/avatares/autores/).
  2. tar czf con rutas relativas correctas + manifest uids.json + script importer.
  3. ssh 'cat > .../bundle.tgz' < bundle · tar xzf.
  4. APPLY=1 wp eval-file import_prod_62.php (dry-run sin APPLY).
  5. Verificar server-side con wp eval (contar reapuntados); limpiar caché.

Scripts en wordpress/wp-content/uploads/avatares/ (local). Ver master-feadulta.md para detalle.