#!/usr/bin/env bash # ═══════════════════════════════════════════════════════════════════════════ # notifications-demo.sh — Demo del sistema de notificaciones de alloy # Para el Episodio #834 — atareao con Linux # ═══════════════════════════════════════════════════════════════════════════ # Muestra cómo funcionan las notificaciones: Telegram, Matrix, Webhook # ═══════════════════════════════════════════════════════════════════════════ set -e VERDE='\033[0;32m' AMARILLO='\033[1;33m' AZUL='\033[0;34m' GRIS='\033[0;90m' NC='\033[0m' echo -e "${AZUL}╔══════════════════════════════════════════════════════════════╗${NC}" echo -e "${AZUL}║ 🔔 alloy — Sistema de notificaciones ║${NC}" echo -e "${AZUL}║ Canales: Telegram, Matrix, Webhook ║${NC}" echo -e "${AZUL}╚══════════════════════════════════════════════════════════════╝${NC}" echo "" # ── 1. State worker: detección de cambios ─────────────────────────────── echo -e "${VERDE}═══ 1. Detección de cambios de estado ═══${NC}" echo "" echo -e "${GRIS}El state_worker (workers/state.rs) ejecuta:${NC}" echo "" echo " loop {" echo " let stream = docker.events(Some(options));" echo " let mut fallback = tokio::time::interval(Duration::from_secs(30));" echo " loop {" echo " tokio::select! {" echo " event = stream.next() => { /* procesar evento Docker */ }" echo " _ = fallback.tick() => { refresh(...).await; }" echo " }" echo " }" echo " }" echo "" echo -e "${GRIS}Eventos Docker monitorizados:${NC}" echo " start, stop, die, kill, pause, unpause, restart, create, destroy" echo "" # ── 2. Transiciones detectadas ────────────────────────────────────────── echo -e "${VERDE}═══ 2. Transiciones de estado ═══${NC}" echo "" echo " running → exited → ⏹️ detenido" echo " running → paused → ⏸️ pausado" echo " running → dead → 💀 finalizado" echo " exited → running → ▶️ en ejecución" echo " * → restart → 🔄 reiniciando" echo "" # ── 3. Canales de notificación ────────────────────────────────────────── echo -e "${VERDE}═══ 3. Canales de notificación ═══${NC}" echo "" echo -e "${AMARILLO}Telegram:${NC}" echo " POST https://api.telegram.org/bot{token}/sendMessage" echo " Body: { \"chat_id\": \"...\", \"text\": \"🚨 alloy: nginx cambió a ⏹️ detenido\" }" echo " Config: TELEGRAM_TOKEN + TELEGRAM_CHAT_ID" echo "" echo -e "${AMARILLO}Matrix:${NC}" echo " PUT /_matrix/client/r0/rooms/{room}/send/m.room.message/{txn_id}" echo " Body: { \"msgtype\": \"m.text\", \"body\": \"🚨 alloy: nginx cambió a ⏹️ detenido\" }" echo " Config: MATRIX_TOKEN + MATRIX_HOMESERVER + MATRIX_ROOM" echo "" echo -e "${AMARILLO}Webhook:${NC}" echo " POST {url} con JSON:" echo ' {' echo ' "event": "state_change",' echo ' "container": "nginx",' echo ' "status": "running → exited",' echo ' "timestamp": "2026-08-29T12:00:00Z",' echo ' "source": "alloy"' echo ' }' echo " Config: WEBHOOK_URL" echo "" # ── 4. Código de notify_all ───────────────────────────────────────────── echo -e "${VERDE}═══ 4. Lógica de notificación (notifications.rs) ═══${NC}" echo "" echo -e "${GRIS}Cuando se detecta un cambio:${NC}" echo "" echo " 1. Verificar si el contenedor tiene notify_events=true en su política" echo " 2. Si sí:" echo " a. Enviar evento SSE a /api/notifications" echo " b. Llamar a notify_all() que itera sobre los canales configurados:" echo " - Si TELEGRAM_TOKEN configurado → enviar mensaje" echo " - Si MATRIX_TOKEN configurado → enviar mensaje" echo " - Si WEBHOOK_URL configurado → POST JSON" echo "" # ── 5. Configuración desde la UI ──────────────────────────────────────── echo -e "${VERDE}═══ 5. Configuración desde Settings ═══${NC}" echo "" echo " Desde la pestaña Settings puedes configurar:" echo "" echo " Notificaciones:" echo " - Telegram: token + chat_id" echo " - Matrix: homeserver + token + room" echo " - Webhook: URL" echo "" echo " Políticas de actualización:" echo " - Acción por defecto (none/pull/pull-restart/pull-restart-stack)" echo " - Cleanup old image (bool)" echo " - Rollback on failure (bool)" echo " - Notify events (bool)" echo "" echo " Auto-update:" echo " - Enabled (bool)" echo " - Cron expression" echo " - Notify on update (bool)" echo " - Pull timeout (segundos)" echo "" # ── 6. Comandos para probar ───────────────────────────────────────────── echo -e "${VERDE}═══ 6. Probar notificaciones ═══${NC}" echo "" echo " # Ver settings actuales" echo " curl http://localhost:3066/api/admin/settings \\" echo " -H \"Cookie: session=TU_TOKEN\"" echo "" echo " # Configurar Telegram (via PUT)" echo " curl -X PUT http://localhost:3066/api/admin/settings \\" echo " -H \"Cookie: session=TU_TOKEN\" \\" echo " -H \"Content-Type: application/json\" \\" echo ' -d '"'"'{"telegram_token":"...","telegram_chat_id":"..."}'"'"'" echo "" echo " # Ver SSE de notificaciones en tiempo real" echo " curl -N http://localhost:3066/api/notifications \\" echo " -H \"Cookie: session=TU_TOKEN\"" echo ""