Skip to content

Automatismos y errores ocultos — 19 octubre 2026

Lectura viva23:04–23:09CEST. No se han disparado jobs, limpiadores, actualizaciones, pulls Docker, DELETE SQL ni timers. Única preparación local: hacer visibles errores de la tarea AudioMuse en la fuente Ansible; pendiente de despliegue.

AudioMuse: dependencia migrada y error oculto

RunWisp2080.14.0 está healthy, scheduling_active=true, config_stale=false,19tareas, NRestarts0. Consulta realizada con sus rutas reales RUNWISP_CONFIG y RUNWISP_DATA; usar el directorio por defecto .runwisp devuelve falsamente daemon ausente.

audiomuse_dedup_cleanup falló19oct05:17 exit1 en72ms;17/18oct había terminado0. Fuente viva /home/monxas/scripts/audiomuse_dedup_cleanup.sh; no se localizó una copia mantenida en homelab-infra. La declaración de tarea sí está en ansible/host_vars/media-208.yml y coincide con el TOML vivo.

El primer comando hace docker exec navidrome sqlite3 … en VM208. Inspect demuestra que ese contenedor existe pero está exited; el Navidrome de CT218 está running. set -euo pipefail aborta ahí antes de copiar IDs o borrar filas. No se ejecutó el script para reproducir porque su fase posterior modifica BD.

La tarea redirige stdout/stderr a /dev/null; RunWisp conserva exit1 pero pierde el diagnóstico. Preparado cambio local: quitar únicamente esa redirección. YAML validado y comando, horario05:17 y lógica de borrado conservados. No se desplegó ni recargó RunWisp. No se ha trasladado el DELETE a otra fuente.

Actualización posterior del coordinador: retiró la redirección en el TOML vivo y recargó sin reinicio ni ejecución del job. RunWisp confirmó solo el cambio de comando de esa tarea; healthy y config_stale=false. También corrigió el role para proporcionar RUNWISP_CONFIG/RUNWISP_DATA: --socket por sí solo devolvía éxito con «No daemon is running» en el directorio por defecto. Ese resultado ahora se considera fallo. Fuente YAML y playbook syntax-check correctos; no se ejecutó el role completo. Detalle/rollback en coordinación.

Antes de reparar el flujo hay que resolver el contrato Navidrome218→AudioMuse208: origen autoritativo, biblioteca/provider y formato de IDs, rechazar fuente vacía, conteo razonable y límite de borrados, transacción y modo de estimación previo. La lógica actual compara todos los provider_track_id con una lista y DELETE global de no coincidentes; redirigirla sin esos controles puede convertir una lista equivocada/vacía en borrado masivo de mappings. La biblioteca no se borra por ese SQL, pero perder los mappings perjudicaría sus asociaciones.

Actualización automática: fallos de registro visibles

homelab-ctl-2 falló17,18y19oct04:00 exit1. El último duró194,98s. Log19oct: pull de Sonarr/Radarr agotó espera de cabeceras en lscr.io; Bazarr/Prowlarr devolvieron toomanyrequests. No demuestra un fallo de las aplicaciones. homelab-ctl watch23:05 terminó0; Sonarr/Radarr/Bazarr/Prowlarr están healthy. Update/watch son funciones distintas con lock compartido, no tareas duplicadas.

Fuente local cmd_update hace pulls seriales, timeout300s por servicio, sin reintento específico para429/timeout. Remediación siguiente acotada: backoff limitado y jitter para esos errores, respetar Retry-After cuando sea interpretable, mantener errores definitivos y límites del job. No cambiar imagen/tag ni recrear contenedores como prueba de diagnóstico. No se tocó homelab-ctl.py; hay cambios locales ajenos que deben preservarse.

pg_dumps terminó0 los tres días17–19oct; último19oct01:30,33,78s. El script fuente publica atómicamente tras CRC, preserva la salida previa ante fallos y evita retención si falla alguna BD. No hay evidencia nueva que requiera rerun. service_contracts conserva último exit1 de22:23, anterior a la corrección documentada de contratos; no se presenta como regresión actual. originals_backup no tiene aún ejecución RunWisp: fue registrada hoy y la primera copia se lanzó manualmente; el observador independiente demuestra que sigue viva.

PBS sync-check: recuperado, con fragilidad en su criterio

CT186 no tiene unidades failed ni errores recientes de2h. pbs-sync-check 07:00 los días17,18y19 terminó0, fails_consecutivos0. Hubo JSONDecodeError en 17oct00:26 durante un arranque previo; las ejecuciones posteriores lo superan. GET de salud del Pushgateway por208:9092 devuelve200; el salto está operativo. No se ha hecho POST ni cambiado métricas en esta auditoría.

Fuente viva /usr/local/bin/pbs-sync-check.sh; no se localizó versión mantenida en scripts/ansible. Obtiene solo20tareas y busca main-to-archive en ellas: actividad reciente abundante puede expulsar el sync bueno de la ventana y crear falso fallo. También admite statusNone como éxito: un sync activo todavía no ha demostrado terminar. La corrección siguiente debería consultar estado del job/última tarea completada o paginar suficientemente, exigir statusOK y endtime, separar fallo de colección de fallo de sync y poner timeout/fallo HTTP explícito al POST. Mantener el timer07:00, contador y canal existentes. La anotación de alerta fuente aún dice06:25, dato documental a reconciliar.

GitOps y límites

Ansible-pull.timer estaba activo en ambos hosts y el servicio real ansible-pull.service se encontraba activating desde23:05:13, durante la coordinación del padre. No se toma Result=success con ExecMainExitTimestamp vacío como una ejecución terminada y no se ha lanzado otro pull concurrente. La evidencia previa ya acreditaba persistencia; confirmar su cierre en el coordinador después de las mutaciones pendientes.

VM208 root crontab vacío y RunWisp como propietario de19tareas; los timers systemd de salud siguen siendo fuentes separadas. La revisión no certifica todos los crons de cada invitado ni propone unificar calendarios por estética.