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))vps-monitor
Componentes principales
update_status.pygeneraindex.htmlystatus.jsondesde/srv/projects/infra-monitor.status.jsoncentraliza systemd, puertos y health-checks de cada servicio.index.htmlpublica la tabla con semáforos (infra.illanes00.cl).- Caddy sirve
/status.jsony proxies/healthpú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
🟢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
/healthy declararse enSERVICESdentro deupdate_status.py.
Procedimiento de mantenimiento
- Actualiza
SERVICES,URL_MAPyHEALTH_PATHSenupdate_status.pycuando agregues servicios. - Ejecuta
python3 update_status.pypara regenerarstatus.jsoneindex.html. - Publica los cambios (
rsynco flujo CI) para queinfra.illanes00.clrefleje el nuevo estado.