<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>Blog de Rodolfo Ulloa</title>
  <link>https://ulloa.cc/blog/</link>
  <description>Notas sobre DevOps, servidores, desarrollo de software e inteligencia artificial.</description>
  <language>es-cl</language>
  
  <item>
    <title>Por qué las portadas de este blog no las genera una IA</title>
    <link>https://ulloa.cc/blog/portadas-blog-svg-codigo-no-ia.html</link>
    <guid>https://ulloa.cc/blog/portadas-blog-svg-codigo-no-ia.html</guid>
    <description>Cómo terminé generando las portadas de este blog con SVG y código en vez de una API de imágenes con IA, y qué aprendí sobre cuándo conviene usar cada una.</description>
    <pubDate>Mon, 21 Sep 2026 12:48:40 GMT</pubDate>
  </item>
  <item>
    <title>Fiestas Patrias y el servidor que se queda solo: probando qué tan resiliente es de verdad</title>
    <link>https://ulloa.cc/blog/servidor-sin-supervision-fiestas-patrias-restart-policies-backups.html</link>
    <guid>https://ulloa.cc/blog/servidor-sin-supervision-fiestas-patrias-restart-policies-backups.html</guid>
    <description>Cómo preparé mi servidor casero en Docker para sobrevivir sin supervisión el fin de semana largo de Fiestas Patrias: restart policies, disco y backups puestos a prueba.</description>
    <pubDate>Fri, 18 Sep 2026 02:17:16 GMT</pubDate>
  </item>
  <item>
    <title>De escribir posts a leer logs: usando claude -p para triage en mi propio servidor</title>
    <link>https://ulloa.cc/blog/diagnostico-logs-claude-p-json-schema-servidor.html</link>
    <guid>https://ulloa.cc/blog/diagnostico-logs-claude-p-json-schema-servidor.html</guid>
    <description>Cómo reutilicé la misma técnica que genera este blog (claude -p con --json-schema) para triage de logs de Docker y systemd en mi servidor casero, y dónde no confío en ella.</description>
    <pubDate>Mon, 07 Sep 2026 14:30:29 GMT</pubDate>
  </item>
  <item>
    <title>El cambio de hora y los timers de mi servidor: por qué todo corre en UTC</title>
    <link>https://ulloa.cc/blog/cambio-de-hora-timers-servidor-utc-systemd-docker.html</link>
    <guid>https://ulloa.cc/blog/cambio-de-hora-timers-servidor-utc-systemd-docker.html</guid>
    <description>Cada cambio de hora en Chile es un buen recordatorio de un problema real de DevOps: los timers con hora local pueden saltarse o duplicar ejecuciones. Cómo lo resolví con UTC.</description>
    <pubDate>Mon, 07 Sep 2026 14:30:27 GMT</pubDate>
  </item>
  <item>
    <title>El backup que nunca probé restaurar (hasta que tuve que hacerlo)</title>
    <link>https://ulloa.cc/blog/backup-restic-restauracion-en-frio-servidor-casero.html</link>
    <guid>https://ulloa.cc/blog/backup-restic-restauracion-en-frio-servidor-casero.html</guid>
    <description>Automaticé backups de todo mi servidor casero con restic y cron, pero nunca los probé de verdad. La primera restauración en frío mostró lo que faltaba.</description>
    <pubDate>Mon, 24 Aug 2026 15:15:00 GMT</pubDate>
  </item>
  <item>
    <title>Cómo creamos una máquina de generar contenido para este mismo blog</title>
    <link>https://ulloa.cc/blog/maquina-de-contenido-blog-claude-p-json-schema.html</link>
    <guid>https://ulloa.cc/blog/maquina-de-contenido-blog-claude-p-json-schema.html</guid>
    <description>Cómo armé un sistema que genera borradores para este blog con claude -p y json-schema, portadas SVG por código y aprobación manual, incluyendo un bug real de duplicados.</description>
    <pubDate>Sun, 23 Aug 2026 18:20:12 GMT</pubDate>
  </item>
  <item>
    <title>Actualizaciones automáticas y IA: el parche de seguridad que casi reinicia Home Assistant a medianoche</title>
    <link>https://ulloa.cc/blog/unattended-upgrades-ia-reinicios-home-assistant.html</link>
    <guid>https://ulloa.cc/blog/unattended-upgrades-ia-reinicios-home-assistant.html</guid>
    <description>Cómo configuré unattended-upgrades en Debian 13 para parchear seguridad sin reinicios sorpresa, y por qué conversar con un asistente de IA sobre los flags me hizo ver una interacción que se me había pasado.</description>
    <pubDate>Sun, 23 Aug 2026 18:18:34 GMT</pubDate>
  </item>
  <item>
    <title>El MOTD de SSH que terminó siendo un dashboard vivo de mi servidor</title>
    <link>https://ulloa.cc/blog/motd-ssh-dashboard-vivo.html</link>
    <guid>https://ulloa.cc/blog/motd-ssh-dashboard-vivo.html</guid>
    <description>Cómo transformé el aburrido mensaje de bienvenida de SSH en un dashboard que lee la configuración real del túnel y muestra qué servicios están arriba.</description>
    <pubDate>Sun, 23 Aug 2026 18:16:07 GMT</pubDate>
  </item>
  <item>
    <title>Cero puertos abiertos, un firewall inútil: la capa de seguridad que sí importaba</title>
    <link>https://ulloa.cc/blog/cero-puertos-abiertos-firewall-inutil-capa-seguridad.html</link>
    <guid>https://ulloa.cc/blog/cero-puertos-abiertos-firewall-inutil-capa-seguridad.html</guid>
    <description>Armé mi servidor casero sin un solo puerto abierto al público, con fail2ban y actualizaciones automáticas. Igual hubo un hueco que el firewall nunca pudo tapar.</description>
    <pubDate>Sun, 23 Aug 2026 18:16:05 GMT</pubDate>
  </item>
  <item>
    <title>Un bingo en tiempo real, un servidor casero y la presión de que no puede fallar en vivo</title>
    <link>https://ulloa.cc/blog/bingo-tiempo-real-servidor-casero-presion-de-un-evento-en-vivo.html</link>
    <guid>https://ulloa.cc/blog/bingo-tiempo-real-servidor-casero-presion-de-un-evento-en-vivo.html</guid>
    <description>Construí un llamador de bingo con Node.js y Socket.IO para un evento presencial de más de 80 personas. La parte difícil no fue el código: fue aceptar que corría en mi propio servidor, sin margen de error.</description>
    <pubDate>Sun, 23 Aug 2026 18:16:03 GMT</pubDate>
  </item>
  <item>
    <title>Por qué terminé escribiendo mi propio dashboard de monitoreo (y no usando el de Netdata)</title>
    <link>https://ulloa.cc/blog/mini-dashboard-monitoreo-netdata-docker.html</link>
    <guid>https://ulloa.cc/blog/mini-dashboard-monitoreo-netdata-docker.html</guid>
    <description>Netdata es excelente para métricas de servidor, pero su interfaz no sirve en el celular. Por qué terminé construyendo mi propio mini-dashboard con Node.js, consumiendo su API y el socket de Docker.</description>
    <pubDate>Sun, 23 Aug 2026 18:16:01 GMT</pubDate>
  </item>
  <item>
    <title>Docker, mDNS y el error 400 que casi me hace abandonar Home Assistant</title>
    <link>https://ulloa.cc/blog/docker-mdns-home-assistant-error-400.html</link>
    <guid>https://ulloa.cc/blog/docker-mdns-home-assistant-error-400.html</guid>
    <description>Cómo el aislamiento de red por defecto de Docker rompe el descubrimiento IoT, y por qué un archivo de configuración que se regenera solo puede simular un bug de red durante días.</description>
    <pubDate>Sun, 23 Aug 2026 18:15:59 GMT</pubDate>
  </item>
  <item>
    <title>Dos cámaras IP, dos protocolos, una sola lección sobre integrar lo que no controlas</title>
    <link>https://ulloa.cc/blog/camaras-ip-dvrip-rtsp-go2rtc-docker.html</link>
    <guid>https://ulloa.cc/blog/camaras-ip-dvrip-rtsp-go2rtc-docker.html</guid>
    <description>Por qué una Reolink y una cámara genérica se comportaron distinto en Home Assistant, y cómo go2rtc en un contenedor Docker resolvió lo que la configuración nunca iba a resolver.</description>
    <pubDate>Sun, 23 Aug 2026 18:15:57 GMT</pubDate>
  </item>
</channel>
</rss>
