# backups/ — inventario Directorio para backups pesados (GBs), excluido de git (`.gitignore: backups/*`). Solo este README se trackea. ## prod-mirror/ Dumps de la base de datos de prod (`wp-nuevo.feadulta.com`, servidor `134.0.10.170`), para que el WP local Docker (`docker-compose.yml`) sea un espejo funcional de prod por si hay una caída o se borra algo por accidente. - **Cómo generarlo:** `mysqldump` **directo por SSH** (no vía `wp-cli`, que tiene `proc_open()` deshabilitado en prod): `ssh feadulta@134.0.10.170 "mysqldump -h 127.0.0.1 -u myfeadulta -p'' --skip-ssl --single-transaction --quick --default-character-set=utf8mb4 "`. `DB_NAME` cambia — leerlo de `/web/wp-nuevo/wp-config.php`. Credenciales en memoria `master-feadulta.md`. - **⚠️ El backup diario de UpdraftPlus (`wp-content/updraft/*-db.gz` en prod) NO sirve como fuente para este espejo si necesitas el estado de HOY** — es un cron nocturno (~03:09 GMT), puede tener hasta 24h de retraso frente al contenido publicado ese mismo día. - **⚠️ Colación MariaDB incompatible con MySQL 8** (el Docker local usa `mysql:8.0`, prod es MariaDB 11.8): el dump trae `utf8mb3_uca1400_ai_ci` / `utf8mb4_uca1400_ai_ci`, que MySQL 8 no reconoce (falla el import). Sustituir antes de importar: ```bash sed -e 's/utf8mb4_uca1400_ai_ci/utf8mb4_0900_ai_ci/g' \ -e 's/utf8mb3_uca1400_ai_ci/utf8mb3_general_ci/g' \ dump.sql > dump.mysql8.sql ``` - **Importar:** `docker exec -i wordpress-mysql mysql -uroot -pwordpress_root_pass --default-character-set=utf8mb4 wordpress_db < dump.mysql8.sql` - **Tras importar**, `siteurl`/`home` en `wp_options` quedan con el valor de prod (`wp-nuevo.feadulta.com`) — para que el WP local sea navegable en su propia URL, actualizar a `https://farmer.taild3aaf6.ts.net/fea` (Tailscale HTTPS; Application Passwords/login solo funcionan sobre SSL o localhost). ## local-pre-mirror/ Backup de seguridad de la BD local **antes** de sobrescribirla con un import de prod (por si el import sale mal o hacía falta algo que solo estaba en local). `mysqldump` dentro del contenedor: `docker exec wordpress-mysql sh -c 'exec mysqldump -uroot -pwordpress_root_pass wordpress_db'`. ## uploads/ (no es un dump, es el propio bind mount) `wp-content/uploads/` del WP local **no** se respalda aquí — se sincroniza directamente sobre `wordpress/wp-content/uploads/` vía `rsync` desde prod. Los ficheros del volumen quedan propiedad de `www-data` (creados por el contenedor) — si `rsync` falla con "Permission denied" al escribir desde el host (usuario `rafa`), ejecutar el rsync **desde dentro del contenedor** como root en vez de desde el host: ```bash docker exec -u 0 wordpress-web bash -c "apt-get update -qq && apt-get install -y -qq rsync openssh-client sshpass" docker exec -u 0 -e SSHPASS='' wordpress-web bash -c " sshpass -e rsync -e 'ssh -o StrictHostKeyChecking=accept-new' -avz \ feadulta@134.0.10.170:/web/wp-nuevo/wp-content/uploads/ \ /var/www/html/wp-content/uploads/" ``` ## Histórico - **2026-07-07:** primer espejo completo prod→local de esta ronda. mu-plugins (24 ficheros, diff por checksum — 1 sumado que faltaba en local: `fea-cloudflare-realip.php`, desplegado a prod directamente en su día sin bajar copia; 1 sobrante local-only sin desplegar: `fea-support-campaign.php`, WIP, se deja). DB: dump fresco directo (no el de UpdraftPlus, desactualizado). uploads/: rsync completo, 5.6GB, 45.879 ficheros.