====== 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.