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.
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
Las variables de entorno definidas en el archivo .env son:
GF_SECURITY_ADMIN_USER = <USER> GF_SECURITY_ADMIN_PASSWORD = <PASSWORD> GF_SERVER_DOMAIN = grafana.TUDOMINIO.com.ar
Estas variables permiten establecer las credenciales iniciales de acceso a Grafana.
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.
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: ["<IP_PRIVADA>:8123"] - job_name: "postgres" static_configs: - targets: ["postgres_exporter:9187"]
Los siguientes son los targets monitoreados por Prometheus:
Una vez levantado el servicio, accedemos mediante la URL:
http://<IP_SERVIDOR>:3000
Cuando configuramos el acceso mediante Nginx Proxy Manager:
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.