====== Monitoreo ======
Como servicio de monitoreo implementamos **Grafana** y **Prometheus**, dos herramientas complementarias que permiten recopilar, almacenar y visualizar métricas del servidor y de los servicios que lo componen.
**Prometheus** actúa como base de datos de series temporales, recolectando información desde distintos endpoints de métricas (**exporters**).
**Grafana**, por su parte, ofrece un entorno gráfico avanzado para visualizar esos datos mediante paneles personalizados, facilitando la supervisión del rendimiento, disponibilidad y estado general del sistema.
----
===== docker-compose.yml =====
El archivo **docker-compose.yml** se compone de la siguiente manera:
# Creamos los volumenes para guardar datos persistentes y que no se pierdan al eliminar la máquina.
volumes:
prometheus-data: {} # Guarda metricas
grafana-data: {}
# Conectamos los contenedores en la misma red
networks:
net_backend:
external: true
# Declaramos los sevicios
services:
############################## GRAFANA ##############################
grafana:
image: grafana/grafana:12.1.1 # Utilizo la version 12.1.1
container_name: grafana # Nombro al contenedor
restart: unless-stopped
volumes:
- ./config/grafana/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml:ro # Para que linkee automaticamente el prometheus a grafana
- grafana-data:/var/lib/grafana
ports:
- '3000:3000' # Grafana utiliza el puerto 3000
env_file:
- path: ./config/grafana.env # Archivo que contiene las variables de entorno
depends_on: # Va a levantar cuando levante prometheus
- prometheus
networks:
- net_backend
############################## PROMETHEUS ##############################
prometheus:
image: prom/prometheus:latest
container_name: prometheus # Nombro al contenedor
restart: unless-stopped # Si se reinicie, salvo cuando lo detengo
volumes:
- ./config/prometheus.yaml:/etc/prometheus/prometheus.yml:ro # Pone el archivo prometheus.yaml en esa ruta para que tenga esa configuración
- prometheus-data:/prometheus # Asigno espacio al volumen dentro de docker
command:
- '--config.file=/etc/prometheus/prometheus.yml' # Utilizo esta configuracion
- '--storage.tsdb.path=/prometheus' # Persistir los datos en donde prometheus crea su DB
- '--storage.tsdb.retention.time=1y' # Guardo la info por 1 año
depends_on: # Va a levantar cuando levante node-exporter
- node-exporter
networks:
- net_backend
ports:
- "9090:9090"
############################## NODE - EXPORTER ##############################
node-exporter: # No depende de nadie asi que levanta primero
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
user: "0"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
networks:
- net_backend
############################## CADVISOR ##############################
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- net_backend
----
===== Variables de entorno =====
Las variables de entorno definidas en el archivo **.env** son:
GF_SECURITY_ADMIN_USER =
GF_SECURITY_ADMIN_PASSWORD =
GF_SERVER_DOMAIN = grafana.TUDOMINIO.com.ar
Estas variables permiten establecer las credenciales iniciales de acceso a Grafana.
----
===== Datasources =====
Como vemos, los **datasources** se vinculan con el archivo **datasources.yml**, que contiene la configuración de Prometheus:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
Este archivo define la conexión principal de Grafana hacia Prometheus, de modo que los paneles puedan visualizar las métricas recolectadas automáticamente.
----
===== Endpoints Prometheus =====
Los endpoints de los cuales Prometheus obtiene métricas se encuentran declarados en el archivo **prometheus.yml** de la siguiente manera:
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
scrape_interval: 1m
static_configs:
- targets: ["localhost:9090"]
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["cadvisor:8080"]
- job_name: "nextcloud"
static_configs:
- targets: ["nextcloud-exporter:9205"]
- job_name: "homeassistant"
metrics_path: '/api/prometheus'
scheme: 'http'
bearer_token: "TOKEN" # Credenciales de un usuario exclusivo para monitoreo
static_configs:
- targets: [":8123"]
- job_name: "postgres"
static_configs:
- targets: ["postgres_exporter:9187"]
----
===== Targets configurados =====
Los siguientes son los **targets** monitoreados por Prometheus:
* **Prometheus:** se scrapea a sí mismo para monitorear su propio estado y rendimiento, asegurando visibilidad completa del sistema de monitoreo.
* **Node-exporter:** recopila métricas del host donde se ejecutan los contenedores (CPU, memoria, disco, red).
* **cAdvisor:** monitoriza los contenedores Docker del host, proporcionando información de consumo y estado.
* **Nextcloud:** a través del **nextcloud-exporter**, expone métricas específicas como usuarios activos y uso de almacenamiento.
* **Home Assistant:** se ejecuta en **network_mode: host** y expone métricas en ///api/prometheus//, las cuales se recolectan mediante token de acceso.
* **Postgres:** mediante **postgres-exporter**, expone métricas de base de datos como conexiones, consultas activas y tamaño de tablas.
----
===== Acceso y configuración =====
Una vez levantado el servicio, accedemos mediante la URL:
http://:3000
Cuando configuramos el acceso mediante **Nginx Proxy Manager**:
* Este actúa como **proxy inverso**, recibiendo solicitudes externas y redirigiéndolas al contenedor correcto (grafana).
* Generamos el certificado **SSL** mediante Let’s Encrypt, asegurando que el dominio //grafana.TUDOMINIO.com.ar// sea accesible por HTTPS.
* NPM redirige el tráfico externo hacia el host y puerto de **Grafana** (3000) sin necesidad de exponer directamente los puertos al exterior.
De esta forma, podés acceder a **Grafana** desde cualquier lugar usando:
https://grafana.TUDOMINIO.com.ar
con una conexión segura y gestionada por el proxy.
Una vez que ingresamos al portal, nos logueamos con nuestras credenciales de administrador previamente definidas en el archivo **grafana.env**.
Al iniciar sesión, estaremos listos para comenzar a crear y configurar nuestros **dashboards**, explorando las métricas y visualizaciones disponibles.