Monitorización self-hosted: monta tu stack con herramientas open-source

Guía paso a paso para desplegar un stack de monitorización: Prometheus, Grafana, Loki, Node Exporter y Uptime Kuma.

Vigilar servidores, servicios y sitios web es necesario. Pero pagar a Datadog $15 por host al mes duele, especialmente cuando tienes cinco VPS y una decena de aplicaciones self-hosted. Buena noticia: un stack de monitorización open-source se monta en una hora y cubre el 90% de las necesidades de un proyecto medio.

En esta guía montaremos el stack: Prometheus (métricas), Grafana (dashboards), Loki (logs), Node Exporter (métricas del sistema), Uptime Kuma (estado de sitios). Todo en Docker Compose, con persistencia y alertas.

Paso 1: Docker Compose

Crea un directorio monitoring y un archivo docker-compose.yml:

version: "3.8"
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=30d"
    ports:
      - "9090:9090"
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.sysfs=/host/sys"
      - "--path.rootfs=/rootfs"
    ports:
      - "9100:9100"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=changeme
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

Paso 2: Prometheus — recolección de métricas

Crea prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["node-exporter:9100"]

  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

Node Exporter recopila CPU, RAM, disco, red — todo lo del sistema. Para monitorizar varios servidores, ejecuta Node Exporter en cada uno y añade sus IPs en targets.

Paso 3: Grafana — visualización

Accede a http://tu-servidor:3000 (usuario: admin, contraseña: changeme). Añade Prometheus como fuente de datos (URL http://prometheus:9090).

Importa el dashboard 1860 (Node Exporter Full) — es la plantilla más popular para métricas del sistema. Tras la importación verás gráficos atractivos.

Paso 4: Loki — logs

Añade Loki y Promtail al docker-compose.yml:

  loki:
    image: grafana/loki:latest
    volumes:
      - loki_data:/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    restart: unless-stopped

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    restart: unless-stopped

En Grafana añade Loki como fuente de datos y usa Explore para buscar en los logs. Todos los logs de contenedores y del sistema — en un solo lugar, con búsqueda y filtrado.

Paso 5: Uptime Kuma — estado de sitios

Para monitorizar la disponibilidad de sitios y APIs, lanza Uptime Kuma en un contenedor separado:

  uptime-kuma:
    image: louislam/uptime-kuma:latest
    volumes:
      - uptime_kuma_data:/app/data
    ports:
      - "3001:3001"
    restart: unless-stopped

Uptime Kuma puede hacer ping, comprobar estados HTTP, certificados SSL, puertos TCP, registros DNS. Configura alertas en Telegram, Discord o Email.

Paso 6: Alertas

Prometheus soporta Alertmanager para notificaciones. Configuración mínima — regla en prometheus.yml:

rule_files:
  - "alert.rules.yml"

Y en alert.rules.yml:

groups:
  - name: node
    rules:
      - alert: HighCPU
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU por encima del 80% en {{ $labels.instance }}"

Alertmanager se puede conectar a Telegram, Email, Slack.

Cuánto cuesta en recursos

Stack completo en un VPS de 2 GB de RAM:

  • Prometheus: ~200 MB de RAM + disco para datos (según retención)
  • Grafana: ~150 MB de RAM
  • Loki: ~200 MB de RAM
  • Node Exporter: ~50 MB de RAM
  • Promtail: ~100 MB de RAM
  • Uptime Kuma: ~100 MB de RAM

Total: unos 800 MB de RAM para el stack completo de monitorización. Los 1.2 GB restantes bastan para tus aplicaciones.

Próximos pasos

Con este stack obtienes:

  • Métricas de todos los servidores en tiempo real
  • Logs centralizados con búsqueda
  • Dashboards atractivos en Grafana
  • Alertas sobre problemas
  • Monitorización de disponibilidad de sitios

Cuando el proyecto crezca, puedes añadir: cAdvisor (métricas de contenedores), Blackbox Exporter (verificaciones HTTP/DNS/TCP), Grafana Tempo (tracing).

Nada de $15 por host. Solo tus datos en tu servidor.

Sitio oficial de Prometheus | Sitio oficial de Grafana | Uptime Kuma en GitHub