Por qué auto-alojar Prometheus y Grafana en un VPS
A diferencia de una herramienta todo en uno, la stack Prometheus + Grafana separa con claridad la recopilación (Prometheus hace scrape de las métricas expuestas por los exporters), el almacenamiento (base de series temporales integrada) y la visualización (Grafana). Esa modularidad es precisamente lo que la convierte en un estándar: supervisa el propio VPS con Node Exporter, sus contenedores con cAdvisor, su base PostgreSQL o MySQL con el exporter correspondiente, e instrumenta sus propias aplicaciones en formato Prometheus.
Todo ello en un VPS que usted controla, lo que le evita enviar métricas de infraestructura sensibles a un SaaS facturado por ingesta. Conserva el historial tanto tiempo como se lo permita el disco, construye paneles específicos para su stack y define sus propias reglas de alerta con Alertmanager.
Con el lanzamiento de Prometheus 3.x (última versión estable: v3.15.0, septiembre de 2026), el motor de almacenamiento TSDB se ha optimizado para reducir el consumo de memoria entre un 15 y un 20%. Grafana 13.x (v13.2.3, finales de septiembre de 2026) trae un compositor de paneles renovado y un sistema de alertas unificado. Es el enfoque recomendado cuando va más allá del simple «¿responde el sitio?».
Lo que esta stack aporta a su VPS
- Métricas de sistema detalladas (CPU, RAM, E/S de disco, red) con Node Exporter v1.12.1, con historial a largo plazo.
- Supervisión de los contenedores Docker con cAdvisor: consumo por contenedor en tiempo real.
- Paneles Grafana a medida, importables desde una biblioteca comunitaria de miles de plantillas.
- Alertas potentes con Alertmanager v0.34.1: umbrales, agrupación, silencios y enrutado multicanal (correo, Slack, PagerDuty...).
- Supervisión de disponibilidad HTTP/TCP con Blackbox Exporter: detección de tiempos de respuesta y caducidad de certificados TLS.
- Recopilación de logs de aplicaciones con Loki (mismo fabricante que Grafana): correlación de logs y métricas en un solo panel.
- Lenguaje de consulta PromQL para crear indicadores derivados y tasas de evolución.
- Instrumentación de sus propias aplicaciones en formato Prometheus, sin coste de ingesta externo.
Requisitos del VPS y recursos a planificar
Esta stack es más exigente que un monitor simple, porque Prometheus mantiene las series temporales en memoria antes de escribirlas en disco. Calcule un VPS de 2 vCPU y 2 a 4 GB de RAM para supervisar de uno a varios servidores. Añada Loki y Alertmanager y apunte a 4 GB mínimo.
El almacenamiento es el punto crítico: Prometheus genera aproximadamente 1 a 2 MB por serie temporal al día. Para 500 series en 30 días, planifique entre 15 y 30 GB. Empiece con 40 GB de SSD y ajuste --storage.tsdb.retention.time según sus necesidades.
Requisitos de software: Docker 26+ y Docker Compose v2, un nombre de dominio apuntando a su VPS (para el reverse proxy HTTPS de Grafana), y ufw o equivalente para restringir puertos.
Desplegar la stack con Docker Compose
Crear la estructura de directorios del proyecto
En su VPS, cree una carpeta dedicada y la estructura de archivos:
mkdir -p ~/monitoring/{prometheus,alertmanager,loki} cd ~/monitoringEsta organización aísla cada configuración en su directorio, simplificando las actualizaciones.
Escribir el archivo docker-compose.yml
Defina los siguientes servicios en un archivo
docker-compose.yml:prometheus(imagenprom/prometheus:v3.15.0),grafana(imagengrafana/grafana:13.2.3),node-exporter(imagenprom/node-exporter:v1.12.1),cadvisor(imagengcr.io/cadvisor/cadvisor:latest),alertmanager(imagenprom/alertmanager:v0.34.1).Monte los archivos de configuración como volúmenes bind-mount y cree volúmenes con nombre para persistir los datos:
prometheus_data,grafana_data. Ejemplo de bind paranode-exporter:volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:roLuego ejecute
docker compose up -dpara arrancar la stack.Configurar prometheus.yml con todos los jobs de scrape
En
prometheus/prometheus.yml, declare los objetivos en la secciónscrape_configs. Cuatro jobs esenciales:scrape_configs: - job_name: 'node' static_configs: - targets: ['node-exporter:9100'] - job_name: 'cadvisor' static_configs: - targets: ['cadvisor:8080'] - job_name: 'alertmanager' static_configs: - targets: ['alertmanager:9093'] - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']Recargue la configuración sin reiniciar:
curl -X POST http://localhost:9090/-/reload.Configurar Alertmanager (alertmanager.yml)
Cree
alertmanager/alertmanager.yml. Una configuración mínima que enruta las alertas a Slack:route: receiver: 'slack-notifications' group_wait: 30s group_interval: 5m repeat_interval: 4h receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/SU/WEBHOOK' channel: '#alertas-vps' title: '{{ .CommonAnnotations.summary }}'Para correo electrónico, sustituya
slack_configsporemail_configscon los camposto,from,smarthost,auth_usernameyauth_password.Crear las reglas de alerta de Prometheus
En
prometheus/rules.yml, defina sus reglas. Tres imprescindibles para un VPS:groups: - name: vps rules: - alert: CPUAlto expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 5m annotations: summary: 'CPU > 85% durante 5 min' - alert: MemoriaBaja expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.10 for: 5m annotations: summary: 'Memoria disponible < 10%' - alert: DiscoLleno expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.85 for: 10m annotations: summary: 'Disco > 85%'Referencie este archivo en
prometheus.ymlbajorule_files: ['rules.yml'].Conectar Grafana con Prometheus (y Loki)
Abra Grafana en el puerto 3000. Credenciales predeterminadas: admin / admin — cámbielas de inmediato.
Añada un origen de datos Prometheus con la URL
http://prometheus:9090. Pruebe la conexión: debe devolver 'Data source is working'.Si añadió Loki al Compose (imagen
grafana/loki:3.3.2), añada un segundo origen de datos Loki con la URLhttp://loki:3100. Podrá correlacionar picos de CPU en un panel Prometheus con los logs de aplicación en Loki sin cambiar de herramienta.Exponer Grafana en HTTPS mediante un reverse proxy
Grafana no debe exponerse nunca en HTTP sin cifrar. Configure Nginx como reverse proxy:
server { listen 443 ssl; server_name grafana.mondomaine.com; ssl_certificate /etc/letsencrypt/live/grafana.mondomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/grafana.mondomaine.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } }Bloquee los puertos internos en el cortafuegos:
ufw deny 9090,ufw deny 9093,ufw deny 3000. Solo el puerto 443 (Nginx) debe estar abierto al público.Verificar que Prometheus recopila todos los objetivos
Acceda a
http://localhost:9090/targets(por SSH o mediante el reverse proxy). Todos los objetivos declarados deben mostrar el estado UP en verde. Un estado DOWN indica un problema de red Docker (nombre de servicio incorrecto), de puerto o de configuración. Corrija antes de continuar.
Importar paneles de la comunidad Grafana
Grafana ofrece una biblioteca de paneles listos para usar en grafana.com/grafana/dashboards. Dos identificadores imprescindibles para un VPS:
ID 1860 — Node Exporter Full: el panel de referencia para métricas del sistema. Muestra en tiempo real y a largo plazo: carga de CPU por núcleo, uso de memoria (incluyendo buffers/caché), E/S de disco por dispositivo, saturación de red y cola. Filtrable por instancia, lo que permite supervisar varios VPS desde un único Grafana.
ID 893 — cAdvisor: métricas por contenedor Docker — throttling de CPU, uso de memoria, E/S y errores de red. Útil para detectar un contenedor que consume de forma anormal sin ralentizar el VPS en su conjunto.
Para importar un panel: en Grafana, vaya a Dashboards → Import, introduzca el ID, seleccione su origen de datos Prometheus y confirme. El panel se importa en segundos, sin construir nada a mano.
Configurar las alertas con Alertmanager
Alertmanager es el componente que recibe las alertas de Prometheus y decide qué hacer con ellas: agruparlas, silenciarlas durante el mantenimiento, enrutarlas a diferentes canales según la severidad.
Agrupación: varias alertas disparadas al mismo tiempo se agrupan en una sola notificación, no en tres correos separados. Este es el campo group_by: ['alertname', 'instance'] en alertmanager.yml.
Silencios: antes de un mantenimiento planificado, cree un silencio en la interfaz de Alertmanager (http://localhost:9093) o mediante la API: amtool silence add --duration=2h alertname=~'.*'.
Enrutado multicanal: las alertas críticas (CPU > 95%) van a PagerDuty o Slack con mención @channel, las advertencias (CPU > 85%) a un canal de supervisión menos urgente.
Tras cada modificación de alertmanager.yml, recargue sin reiniciar: curl -X POST http://localhost:9093/-/reload.
Prometheus vs InfluxDB vs Zabbix: ¿cuál elegir?
Desplace la tabla
| Criterio | Prometheus | InfluxDB | Zabbix |
|---|---|---|---|
| Modelo de recopilación | Pull (scrape activo) | Push (agentes o API) | Agente + SNMP + JMX |
| Almacenamiento | TSDB integrado, eficiente en VPS | InfluxDB OSS o Cloud | PostgreSQL / MySQL, pesado |
| Lenguaje de consulta | PromQL (potente, curva pronunciada) | Flux / InfluxQL (similar a SQL) | Macros Zabbix (limitado) |
| Alertas | Alertmanager dedicado, flexible | Integrado (OSS limitado) | Integrado, rico pero complejo |
| Curva de aprendizaje | Moderada (PromQL) | Baja (similar a SQL) | Alta (UI densa, agentes) |
| Caso de uso ideal | Infra en contenedores, apps instrumentadas | IoT, series temporales de alta frecuencia | Redes empresariales, SNMP |
Bastionado: nunca exponga Prometheus públicamente
Prometheus no tiene sistema de autenticación nativo. Su interfaz web expone la lista de todos sus objetivos, sus etiquetas de infraestructura y sus reglas de alerta — información valiosa para un atacante que mapea su infraestructura.
Tres reglas no negociables:
1. Vincule Prometheus en 127.0.0.1:9090 únicamente (--web.listen-address=127.0.0.1:9090 en el Compose).
2. Bloquee los puertos 9090, 9093, 9100 y 8080 en el cortafuegos (ufw deny 9090).
3. Proteja Grafana con una contraseña fuerte y desactive la cuenta anónima (GF_AUTH_ANONYMOUS_ENABLED=false como variable de entorno).
Si necesita acceder a la interfaz de Prometheus desde el exterior para depuración, utilice un túnel SSH (ssh -L 9090:localhost:9090 [email protected]) en lugar de un reverse proxy público.
Añadir supervisión de contenedores Docker con cAdvisor
cAdvisor (Container Advisor) expone métricas por contenedor Docker en formato Prometheus: uso de CPU como proporción de la cuota asignada, consumo de memoria con y sin caché, E/S de red y disco, y reinicios.
En docker-compose.yml, añada el servicio:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- '127.0.0.1:8080:8080'
restart: unless-stoppedLuego añada el job correspondiente en prometheus.yml. El panel Grafana ID 893 (cAdvisor) mostrará entonces una vista por contenedor, con filtro por nombre de servicio Docker.
Resolución de problemas: los errores más frecuentes
Target DOWN en Prometheus (/targets): compruebe primero el nombre del servicio en docker-compose.yml — Prometheus resuelve los nombres por DNS interno de Docker. Si el servicio se llama node-exporter en el Compose, la URL de scrape debe ser node-exporter:9100, no localhost:9100.
Paneles vacíos tras la importación: la causa más frecuente es un job de scrape cuya etiqueta no coincide con la que espera el panel. Node Exporter Full (ID 1860) espera un job llamado node — si lo nombró node_exporter en prometheus.yml, filtre manualmente en las variables del panel o renombre el job.
Alertmanager no recibe las alertas: verifique que Prometheus puede alcanzar Alertmanager. En prometheus.yml, la sección alerting debe apuntar a alertmanager:9093 (nombre de servicio Docker). Pruebe con: docker compose exec prometheus curl http://alertmanager:9093/-/healthy.
Error 'context deadline exceeded' al recargar: Prometheus tarda más de 30 s en recargar si las reglas son numerosas o un objetivo es lento. Aumente el timeout de scrape en prometheus.yml: scrape_timeout: 20s bajo global.
Para ir más lejos
Esta stack cubre los fundamentos de la monitorización de un VPS. Para necesidades más avanzadas:
Retención a largo plazo: Prometheus almacena datos localmente, ideal para 30 a 90 días. Para un historial de 1 a 2 años sin saturar el disco, conecte Thanos (almacén de objetos compatible con S3) o VictoriaMetrics como reemplazo directo del almacenamiento. VictoriaMetrics es especialmente adecuado para VPS modestos: consume entre 5 y 10 veces menos memoria que Prometheus para el mismo volumen de series.
Supervisión de endpoints HTTP: añada Blackbox Exporter al Compose para probar la disponibilidad de sus URLs, el código HTTP devuelto, la latencia y la fecha de caducidad del certificado TLS.
Logs con Loki: si desea correlacionar métricas con logs de aplicación, añada Loki + Promtail al Compose. Grafana muestra métricas y logs en el mismo panel, reduciendo el tiempo de diagnóstico.
Para todas las opciones de configuración avanzadas, consulte la documentación oficial de Grafana y la documentación de Prometheus. ServOrbit ofrece una plantilla Docker preconfigurada para lanzar esta stack en un clic en un VPS Cloud.