vps-monitor

Componentes principales

  • update_status.py genera index.html y status.json desde /srv/projects/infra-monitor.
  • status.json centraliza systemd, puertos y health-checks de cada servicio.
  • index.html publica la tabla con semáforos (infra.illanes00.cl).
  • Caddy sirve /status.json y proxies /health públicos.

Estructura de status.json

status.json

Documento JSON consumido por el infra-monitor para pintar el estado. Debe incluir cada servicio con systemd y HTTP (local/público) cuando aplique.

Servicios monitoreados

import json
from pathlib import Path
from IPython.display import Markdown

status_path = Path("/srv/projects/infra-monitor/status.json")
rows = []
status_missing = False

if status_path.exists():
    data = json.loads(status_path.read_text(encoding="utf-8"))
    services = data.get("services", [])
else:
    services = []
    status_missing = True

def pill(val):
    if val is True:
        return "🟢"
    if val is False:
        return "🔴"
    return "—"

table = [
    "| Servicio | Systemd | Run.py | Caddy | Público | URL | Repo |",
    "|---|:---:|:---:|:---:|:---:|---|---|",
]

for svc in sorted(services, key=lambda s: s.get("slug", "")):
    systemd = {"active": "🟢 active", "inactive": "🔴 inactive", "failed": "🔴 failed"}.get(svc.get("systemd"), "—")
    row = [
        svc.get("slug", "—"),
        systemd,
        pill(svc.get("http_local_run")),
        pill(svc.get("http_local_caddy")),
        pill(svc.get("http_public")),
        svc.get("url") or "—",
        svc.get("repo") or "—",
    ]
    table.append("| " + " | ".join(row) + " |")

if len(table) == 2:
    if status_missing:
        Markdown("> No se encontró `/srv/projects/infra-monitor/status.json`; sin datos de monitoreo.")
    else:
        Markdown("> `status.json` no tiene servicios registrados.")
else:
    Markdown("\n".join(table))

🟢 indica éxito del chequeo; 🔴 apunta a fallas que deben revisarse en el servicio o en Caddy.

Observabilidad complementaria

  • Grafana (/grafana/), Prometheus (/prometheus/) y Netdata (/netdata/) aportan métricas y dashboards.
  • La página Salud de gráficos ejecuta notebooks que validan assets críticos.
  • Cualquier nuevo servicio debe exponer /health y declararse en SERVICES dentro de update_status.py.

Procedimiento de mantenimiento

  1. Actualiza SERVICES, URL_MAP y HEALTH_PATHS en update_status.py cuando agregues servicios.
  2. Ejecuta python3 update_status.py para regenerar status.json e index.html.
  3. Publica los cambios (rsync o flujo CI) para que infra.illanes00.cl refleje el nuevo estado.