TPTito Pinardo Gutiérrez
← Volver al rack
English
1U · LIVE TVDispatcharr · 52 canales · guía En pruebas

Posición 14 de 25 en el rack · Laboratorio

Unidad 1U · Multimedia

TV en directo

Configurado por API desde Ansible

Un gestor de canales de TV en directo en su propio contenedor. Carga una lista pública de canales de TDT con su guía de programación y la sirve de tres formas: a Plex, que lo ve como un sintonizador de antena; a las apps de casa, como una lista; y, más adelante, a gente de fuera con un usuario propio cada uno.

Por qué fuera de Plex
En Plex, la TV en directo solo la ve quien vive en casa, nunca los amigos con los que se comparte la biblioteca. Un gestor aparte puede dársela a quien yo quiera.
Por qué un contenedor propio
Cuando se abra a internet no debe compartir contenedor con la puerta interna ni con la biblioteca. Y el streaming queda aislado.
Cómo se configura
Nada a mano: Ansible crea el administrador, la lista, la guía y los canales por la API, y solo crea lo que falta.
  • 52canales elegidos en una lista explícita
  • 3.078programas en la guía
  • 0cambios en la segunda pasada del playbook
  • 2,5 %de CPU en reposo, sin GPU

La TV en directo por dentro

Un gestor de canales que Plex cree que es un sintonizador. Elige un recorrido.

Hermesde visita en la unidad

Pulsa una pieza o elige un recorrido. Si vienes de una habilidad, ya están encendidas las piezas donde la uso.

      Veo un canal en Plex
      1. La tele — Elijo un canal en la tele.
      2. Plex — Plex se lo pide a su «sintonizador».
      3. Sintonizador emulado — El sintonizador emulado lo recibe.
      4. Reempaquetado — El gestor pide el vídeo a la fuente.
      5. Lista pública de TDT — La fuente lo manda.
      6. Reempaquetado — Se reempaqueta, sin convertir.
      7. Plex — Plex lo recibe; si la tele lo necesita, lo convierte en la GPU.
      8. La tele — Y se ve, con la guía.
      Lo veo en una app
      1. Apps de IPTV de casa — Una app de IPTV de casa carga la lista.
      2. Lista para apps — La lista del gestor.
      3. Guía de programación — Con su guía emparejada.
      4. Lista para apps — Elijo un canal.
      5. Reempaquetado — Se reempaqueta.
      6. Apps de IPTV de casa — Y se ve en la app.
      Se monta desde cero
      1. Terraform — Terraform crea el contenedor.
      2. Rol de Ansible — Ansible instala el gestor.
      3. Configuración por API — Y lo configura por la API.
      4. Lista de canales — La lista.
      5. Guía de programación — La guía.
      6. Canales elegidos — Los 52 canales elegidos.
      7. Recarga diaria — La recarga cada 24 horas.
      8. Dos pasadas — Segunda pasada: sin cambios. Es idempotente.
      La siguiente fase: gente de fuera
      1. Gente de fuera (pendiente) — Un amigo, fuera de casa.
      2. Puerta interna — Entrará por una puerta propia.
      3. Usuarios y permisos — Con su usuario y sus canales.
      4. Lista para apps — Recibirá su lista.
      5. Reempaquetado — Y el vídeo, reempaquetado desde casa.
      1. Lista pública de TDT

        Canales de TDT española en abierto, con identificadores para emparejar la guía.

      2. Plex

        Lo ve como un sintonizador de antena y añade su TV en directo y su grabador.

      3. Apps de IPTV de casa

        En el móvil o la tele, con la lista y la guía.

      4. La tele

        Viendo un canal desde Plex.

      5. Gente de fuera (pendiente)

        La fase siguiente: cada uno con su usuario y sus canales.

      6. Lista de canales

        La lista de origen, cargada en el gestor.

        • Docker
      7. Guía de programación

        La guía de origen, emparejada canal a canal.

        • Docker
      8. Canales elegidos

        Una lista explícita en el repositorio, en vez de importar grupos enteros.

        • Ansible
      9. Recarga diaria

        La lista y la guía se vuelven a descargar cada día.

      10. Sintonizador emulado

        El gestor se hace pasar por un sintonizador de red: Plex lo descubre y lo usa como si fuera una antena.

      11. Lista para apps

        Una lista con la guía incluida, para cualquier app de IPTV.

      12. Usuarios y permisos

        Cada usuario puede tener su selección de canales.

      13. Reempaquetado

        El gestor no convierte el vídeo, solo lo reempaqueta. Si hace falta convertir, lo hace Plex con su GPU.

        • Docker
      14. Terraform

        Crea el contenedor sin privilegios.

        • Terraform
      15. Rol de Ansible

        Instala el gestor en Docker y lo configura.

        • Ansible
      16. Configuración por API

        Administrador, lista, guía, recarga y canales, por la API del gestor. Si algo ya existe, no lo pisa.

        • Ansible
      17. Dos pasadas

        El playbook se pasa dos veces: la segunda no debe cambiar nada.

        • Ansible
      18. Puerta interna

        La web del gestor, solo desde casa o la VPN, con doble factor y después su login.

        • Linux / SSH hardening
      19. Cortafuegos del contenedor

        La administración solo desde mis equipos y la VPN; el servicio, solo desde la red de casa y la VPN.

        • Proxmox VE
        • Linux / SSH hardening
      20. Monitorización

        Como el resto de la flota.

        • Zabbix
      21. Seguridad

        Como el resto de la flota.

        • Wazuh

      Lo que uso de mi árbol

      Pulsa una habilidad: se encienden en el mapa las piezas donde la uso y te cuento para qué.

      Terraform
      Crea el contenedor.
      Ansible
      Instala el gestor y lo configura por su API: administrador, lista, guía, recarga y canales, sin pisar lo que ya existe.
      Proxmox VE
      Cortafuegos del contenedor con la administración y el servicio acotados.
      LXC
      Contenedor sin privilegios con anidamiento para Docker.
      Docker
      El gestor de canales en Docker, con su base de datos y su cola dentro.
      Zabbix
      Vigila el contenedor como al resto.
      Wazuh
      Vigila el contenedor como al resto.
      Linux / SSH hardening
      Web solo detrás de la puerta interna con doble factor y puertos acotados a casa y la VPN.

      Bitácora de incidencias

      Averías reales. Lee el síntoma, elige la causa que creas y mira cómo se arregló.

      1. #1

        Una lista que nunca se actualizaba

        03-10-2026 · configuración

        La lista de canales creada por la API se cargaba una vez y nunca más se volvía a descargar.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        Desde la web, la recarga diaria viene puesta. Creada por la API, el intervalo es cero: nunca.
        Solución
        Fijar las 24 horas al crearla y corregirlo también en las que ya existían.
        Lección
        Automatizar por API no es lo mismo que hacer clic: los valores por defecto pueden ser otros. Hay que comprobar el resultado, no solo que respondió 200.
      2. #2

        Un 400 con «'str' object has no attribute 'get'»

        03-10-2026 · Ansible

        Al enviar la selección de grupos de canales, la API respondía 400 con un error de Python.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        Un bucle dentro de una plantilla de Ansible devuelve una cadena que parece una lista. La API esperaba objetos y recibió texto.
        Solución
        Construir la lista solo con filtros, que devuelven estructuras de verdad.
        Lección
        En Ansible, lo que parece una lista no siempre lo es. Los filtros mantienen el tipo; las plantillas lo convierten en texto.
      3. #3

        El cortafuegos cambiaba en cada pasada

        03-10-2026 · idempotencia

        Cada vez que se pasaba el playbook, el fichero del cortafuegos del contenedor salía como modificado, aunque nada había cambiado.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        Ese fichero se escribe a través de la entrada estándar de un comando, y Ansible añade un salto de línea al final. La comparación nunca daba igual.
        Solución
        Decirle al módulo que no añada ese salto. La segunda pasada ya da cero cambios.
        Lección
        Si la segunda pasada cambia algo, no es idempotente aunque el resultado sea el mismo. Y el mismo patrón probablemente esté en otros roles: queda apuntado para revisarlos.

      Cómo se construyó

      1. Septiembre de 2026

        Un intento anterior

        • Un primer stack de TV en directo que nunca llegó a funcionar y se retiró en una migración.
      2. 03-10-2026

        Contenedor propio desde código

        • Contenedor sin privilegios con Terraform y el gestor configurado por API desde Ansible.
        • Plex llega al sintonizador y recibe vídeo válido.
        • Lista explícita de 52 canales en el repositorio.

      Decisiones (y por qué)

      • Qué gestor

        Uno activo, con usuarios

        El anterior se había quedado parado. Este junta fuentes, empareja la guía, tiene permisos por canal y habla los tres formatos que hacen falta.

      • ¿Convertir en el servidor?

        No, solo reempaquetar

        Con buena subida, cada uno puede recibir la calidad original. Si una tele de casa la necesita convertida, ya lo hace Plex con su GPU.

      Lo que aprendí

      • Configurar por API exige comprobar el resultado: los valores por defecto no son los de la web.
      • Dos pasadas del playbook: la segunda dice si de verdad es idempotente.

      Lo siguiente

      • Probarlo de verdad en una tele con el grabador de Plex.
      • Abrirlo a gente de fuera, cada uno con su usuario, por una puerta propia.

      ¿Hablamos?

      Puedo contar cualquiera de estas decisiones en detalle en una entrevista.

      Descargar CV Contactar ← Volver al rack

      Solo canales de TDT española en abierto. Sin direcciones ni nombres internos.