TTS carta 734: sync de audio local→prod + runbook de rollback (para Hermes) #163

Closed
opened 2026-07-08 13:49:36 +00:00 by rafa · 1 comment
Owner

Qué se hizo (2026-07-08)

Se locutaron con MiniMax (voz NicoFeadulta2026, modelo speech-2.8-hd) los 28 artículos ES de la carta 734 (WP post local #54254, «Echar raíces») con scripts/tts_produce.py, y se publicó el resultado en prod (www.feadulta.com) con un script nuevo: scripts/sync_audio_to_prod.py.

Bug encontrado y arreglado

wp-content/uploads/tts/ en el contenedor local (wordpress-web) había quedado con dueño uid 21165 sin permiso de escritura para rafa. Fix: docker exec wordpress-web chown -R 1000:1000 /var/www/html/wp-content/uploads/tts/ (el contenedor corre como root, puede chown sin problema).

Sync a prod — script nuevo

scripts/sync_audio_to_prod.py sube los mp3 y fija el meta fea_audio_url en prod. Importante: prod (134.0.10.170) tiene la glibc rota conocida (ver issue de [[feadulta-server-glibc-rota]] en memoria / ticket hosting #cdmoncc263268) y scp/sftp no funcionan («Connection closed»). El script sube el binario por ssh ... "cat > ruta" (stdin crudo) y verifica el tamaño con wc -c tras subir, porque no hay stat tampoco.

Uso:

cd /home/rafa/joomla-migration
~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --carta 54254            # sincroniza toda la cola de la carta
~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --ids 912,919            # ids concretos
~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --carta 54254 --dry-run  # solo plan, no toca prod

Se encadenó automáticamente tras el orquestador local (tts_produce.py, PID 70729): un wrapper en background espera a que termine y lanza el sync completo solo, sin intervención. Log: logs/feadulta-audio-sync.log. Estado (ids ya sincronizados): logs/feadulta-audio-sync-state.json.

⚠️ ROLLBACK — cómo despublicar los audios en prod

Si algo suena mal, se corta el audio a mitad, la voz no es la esperada, etc., y hay que quitarlos de prod sin esperar a que Rafa vuelva:

cd /home/rafa/joomla-migration
~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --rollback --carta 54254

Esto, para cada post de la carta 734:

  • borra el mp3 en prod (/web/wp-content/uploads/tts/<id>.mp3)
  • borra los meta fea_audio_url, fea_audio_voice, fea_audio_done, fea_audio_error del post en prod (vía fea_post_io.php unsetaudio, acción nueva añadida a ese helper)

Para despublicar solo algunos posts concretos en vez de toda la carta:

~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --rollback --ids 54245,54246

El rollback no toca nada en local (ni el mp3 ni el meta local); solo revierte lo publicado en prod. Probado end-to-end antes de encadenar el sync real (subida+verificación+rollback+reverificación sobre el post #912).

Notas para Hermes

  • Requiere que esta máquina (WSL, farmer) esté encendida — el script corre aquí, no en prod.
  • Credenciales prod ya están en el script (mismas que sync_translations_to_prod.py); no hace falta pedirlas.
  • Si el comando de rollback falla con Connection closed en la subida/verificación, es la glibc rota de siempre — reintentar suele bastar; si persiste, avisar a Rafa en vez de insistir en bucle.
## Qué se hizo (2026-07-08) Se locutaron con MiniMax (voz `NicoFeadulta2026`, modelo `speech-2.8-hd`) los 28 artículos ES de la carta 734 (WP post local #54254, «Echar raíces») con `scripts/tts_produce.py`, y se publicó el resultado en prod (www.feadulta.com) con un script nuevo: **`scripts/sync_audio_to_prod.py`**. ### Bug encontrado y arreglado `wp-content/uploads/tts/` en el contenedor local (`wordpress-web`) había quedado con dueño `uid 21165` sin permiso de escritura para `rafa`. Fix: `docker exec wordpress-web chown -R 1000:1000 /var/www/html/wp-content/uploads/tts/` (el contenedor corre como root, puede chown sin problema). ### Sync a prod — script nuevo `scripts/sync_audio_to_prod.py` sube los mp3 y fija el meta `fea_audio_url` en prod. **Importante:** prod (134.0.10.170) tiene la glibc rota conocida (ver issue de `[[feadulta-server-glibc-rota]]` en memoria / ticket hosting `#cdmoncc263268`) y **`scp`/`sftp` no funcionan** («Connection closed»). El script sube el binario por `ssh ... "cat > ruta"` (stdin crudo) y verifica el tamaño con `wc -c` tras subir, porque no hay `stat` tampoco. Uso: ``` cd /home/rafa/joomla-migration ~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --carta 54254 # sincroniza toda la cola de la carta ~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --ids 912,919 # ids concretos ~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --carta 54254 --dry-run # solo plan, no toca prod ``` Se encadenó automáticamente tras el orquestador local (`tts_produce.py`, PID 70729): un wrapper en background espera a que termine y lanza el sync completo solo, sin intervención. Log: `logs/feadulta-audio-sync.log`. Estado (ids ya sincronizados): `logs/feadulta-audio-sync-state.json`. ## ⚠️ ROLLBACK — cómo despublicar los audios en prod Si algo suena mal, se corta el audio a mitad, la voz no es la esperada, etc., y hay que quitarlos de prod **sin esperar a que Rafa vuelva**: ```bash cd /home/rafa/joomla-migration ~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --rollback --carta 54254 ``` Esto, para cada post de la carta 734: - borra el mp3 en prod (`/web/wp-content/uploads/tts/<id>.mp3`) - borra los meta `fea_audio_url`, `fea_audio_voice`, `fea_audio_done`, `fea_audio_error` del post en prod (vía `fea_post_io.php unsetaudio`, acción nueva añadida a ese helper) Para despublicar solo algunos posts concretos en vez de toda la carta: ```bash ~/tts-local/xtts-venv/bin/python scripts/sync_audio_to_prod.py --rollback --ids 54245,54246 ``` El rollback **no toca nada en local** (ni el mp3 ni el meta local); solo revierte lo publicado en prod. Probado end-to-end antes de encadenar el sync real (subida+verificación+rollback+reverificación sobre el post #912). ## Notas para Hermes - Requiere que esta máquina (WSL, `farmer`) esté encendida — el script corre aquí, no en prod. - Credenciales prod ya están en el script (mismas que `sync_translations_to_prod.py`); no hace falta pedirlas. - Si el comando de rollback falla con `Connection closed` en la subida/verificación, es la glibc rota de siempre — reintentar suele bastar; si persiste, avisar a Rafa en vez de insistir en bucle.
Author
Owner

Confirmado y verificado en prod (no solo por el log, por datos reales del servidor) — 2026-07-08 09:57

21/21 audios publicados correctamente: tamaño local=remoto byte a byte + meta fea_audio_url fijado en cada post. Los 7 artículos sin contenido locutable (54233, 54235, 54236, 54238, 54240, 54244, 54246) correctamente ausentes en prod, tal y como se esperaba.

Tarea cerrada. El runbook de rollback de este issue sigue vigente por si hiciera falta más adelante.

**Confirmado y verificado en prod (no solo por el log, por datos reales del servidor) — 2026-07-08 09:57** 21/21 audios publicados correctamente: tamaño local=remoto byte a byte + meta `fea_audio_url` fijado en cada post. Los 7 artículos sin contenido locutable (54233, 54235, 54236, 54238, 54240, 54244, 54246) correctamente ausentes en prod, tal y como se esperaba. Tarea cerrada. El runbook de rollback de este issue sigue vigente por si hiciera falta más adelante.
rafa closed this issue 2026-07-08 13:56:27 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#163