Tutorial TIG Stack con Docker
El stack TIG (Telegraf + InfluxDB + Grafana) es el punto de entrada más popular para monitoreo IoT. Con tres servicios Docker y unos pocos archivos de configuración tendrás un dashboard en vivo.
Arquitectura del stack
Sección titulada «Arquitectura del stack»[Dispositivos IoT / Sensores] │ │ MQTT / HTTP / escritura directa ▼ ┌─────────────┐ │ Telegraf │ ← 300+ plugins de entrada, corre como agente └──────┬──────┘ │ envía métricas ▼ ┌─────────────┐ │ InfluxDB │ ← base de datos de series de tiempo └──────┬──────┘ │ consulta (Flux) ▼ ┌─────────────┐ │ Grafana │ ← dashboards, alertas, visualización └─────────────┘ │ ▼ [Tu navegador / celular]Prerrequisitos
Sección titulada «Prerrequisitos»- Docker y Docker Compose instalados
- Conocimientos básicos de terminal
Paso 1: Crear la carpeta del proyecto
Sección titulada «Paso 1: Crear la carpeta del proyecto»mkdir iot-tig-stackcd iot-tig-stackmkdir telegrafPaso 2: Crear la configuración de Telegraf
Sección titulada «Paso 2: Crear la configuración de Telegraf»Crea el archivo telegraf/telegraf.conf:
[agent] interval = "10s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = "10s" flush_jitter = "0s" precision = "" hostname = "telegraf" omit_hostname = false
# ──────────────────────────────────────────────# SALIDA: Enviar datos a InfluxDB 2.x# ──────────────────────────────────────────────[[outputs.influxdb_v2]] urls = ["http://influxdb:8086"] token = "$DOCKER_INFLUXDB_INIT_ADMIN_TOKEN" organization = "$DOCKER_INFLUXDB_INIT_ORG" bucket = "$DOCKER_INFLUXDB_INIT_BUCKET"
# ──────────────────────────────────────────────# ENTRADA: Métricas de CPU del host (para pruebas)# ──────────────────────────────────────────────[[inputs.cpu]] percpu = true totalcpu = true collect_cpu_time = false report_active = false
[[inputs.mem]]
[[inputs.disk]] ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.net]]
# ──────────────────────────────────────────────# ENTRADA: MQTT — descomenta para recibir datos de sensores# ──────────────────────────────────────────────# [[inputs.mqtt_consumer]]# servers = ["tcp://tu-broker-mqtt:1883"]# topics = ["sensors/#"]# data_format = "json"Paso 3: Crear el docker-compose.yml
Sección titulada «Paso 3: Crear el docker-compose.yml»version: '3.8'
# ── Variables compartidas para InfluxDB ────────────────────────────────────x-influx-env: &influx-env DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: supersecretpassword # ← ¡Cambia esto! DOCKER_INFLUXDB_INIT_ORG: mi-org-iot DOCKER_INFLUXDB_INIT_BUCKET: iot-data DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: mi-token-secreto # ← ¡Cambia esto!
networks: tig-net: driver: bridge
volumes: influxdb-data: influxdb-config: grafana-data:
services:
# ── 1. InfluxDB — Base de datos de series de tiempo ───────────────────── influxdb: image: influxdb:2.7 container_name: influxdb restart: unless-stopped networks: - tig-net ports: - "8086:8086" # UI y API de InfluxDB environment: <<: *influx-env volumes: - influxdb-data:/var/lib/influxdb2 - influxdb-config:/etc/influxdb2 healthcheck: test: ["CMD", "influx", "ping"] interval: 10s timeout: 5s retries: 5
# ── 2. Telegraf — Agente recolector de datos ───────────────────────────── telegraf: image: telegraf:1.30 container_name: telegraf restart: unless-stopped networks: - tig-net depends_on: influxdb: condition: service_healthy environment: <<: *influx-env HOST_PROC: /rootfs/proc HOST_SYS: /rootfs/sys HOST_ETC: /rootfs/etc volumes: - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /sys:/rootfs/sys:ro - /proc:/rootfs/proc:ro - /etc:/rootfs/etc:ro
# ── 3. Grafana — Visualización y Dashboards ────────────────────────────── grafana: image: grafana/grafana:10.4.0 container_name: grafana restart: unless-stopped networks: - tig-net ports: - "3000:3000" # UI de Grafana depends_on: - influxdb environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: grafana-password # ← ¡Cambia esto! GF_USERS_ALLOW_SIGN_UP: "false" volumes: - grafana-data:/var/lib/grafanaLa estructura final de tu carpeta debe verse así:
iot-tig-stack/├── docker-compose.yml└── telegraf/ └── telegraf.confPaso 4: Iniciar el stack
Sección titulada «Paso 4: Iniciar el stack»docker compose up -dEspera ~20 segundos para que todo arranque, luego verifica:
docker compose ps # Todos deben estar en estado "running"docker compose logs # Revisa si hay erroresPaso 5: Conectar Grafana a InfluxDB
Sección titulada «Paso 5: Conectar Grafana a InfluxDB»- Abre http://localhost:3000 en tu navegador
- Inicia sesión con
admin/grafana-password - Ve a ⚙️ Configuración → Data Sources → Add data source
- Elige InfluxDB
- Completa los campos:
- Query Language:
Flux - URL:
http://influxdb:8086 - Organization:
mi-org-iot - Token:
mi-token-secreto - Default Bucket:
iot-data
- Query Language:
- Haz clic en Save & Test — deberías ver ✅ verde
Paso 6: Importar un dashboard preconstruido
Sección titulada «Paso 6: Importar un dashboard preconstruido»- En Grafana, ve a Dashboards → Import
- Ingresa el ID de dashboard 928 (métricas de sistema con Telegraf) y haz clic en Load
- Selecciona tu fuente de datos InfluxDB y haz clic en Import
- 🎉 ¡Ahora tienes un dashboard en vivo con CPU, Memoria y Disco!
Otros IDs de dashboard útiles:
| ID | Descripción |
|---|---|
928 | Telegraf: resumen del sistema |
1443 | Telegraf + InfluxDB detallado |
15117 | Métricas del host (tema oscuro) |
Paso 7: Enviar datos de tus sensores IoT
Sección titulada «Paso 7: Enviar datos de tus sensores IoT»Opción A: MQTT (lo más común en IoT)
Sección titulada «Opción A: MQTT (lo más común en IoT)»Descomenta la sección [[inputs.mqtt_consumer]] en telegraf.conf:
[[inputs.mqtt_consumer]] servers = ["tcp://192.168.1.100:1883"] topics = ["hogar/sensores/+/temperatura", "hogar/sensores/+/humedad"] data_format = "json" json_time_key = "timestamp" json_time_format = "unix"Opción B: HTTP Push (desde cualquier script)
Sección titulada «Opción B: HTTP Push (desde cualquier script)»Agrega a telegraf.conf:
[[inputs.http_listener_v2]] service_address = ":8080" data_format = "influx"Envía datos desde tu dispositivo:
# Desde una Raspberry Pi o cualquier dispositivo:curl -X POST http://ip-de-tu-servidor:8080/write \ --data-binary 'temperatura,ubicacion=invernadero value=23.5'Opción C: Escribir directamente a la API de InfluxDB (Python)
Sección titulada «Opción C: Escribir directamente a la API de InfluxDB (Python)»from influxdb_client import InfluxDBClient, Pointfrom influxdb_client.client.write_api import SYNCHRONOUS
client = InfluxDBClient( url="http://localhost:8086", token="mi-token-secreto", org="mi-org-iot")write_api = client.write_api(write_options=SYNCHRONOUS)
point = Point("temperatura").tag("sensor", "sensor-01").field("value", 23.5)write_api.write(bucket="iot-data", record=point)Paso 8: Configurar alertas en Grafana
Sección titulada «Paso 8: Configurar alertas en Grafana»- Abre el panel de un dashboard → Edit → pestaña Alert
- Haz clic en Create alert rule
- Define tu condición (ej: CPU > 90% durante 5 minutos)
- Agrega un Contact Point (email, Slack, Telegram, PagerDuty, etc.)
- ¡Listo! Grafana maneja las alertas sin necesitar Kapacitor.
Comandos útiles
Sección titulada «Comandos útiles»# Detener tododocker compose down
# Detener y borrar todos los datos (reinicio limpio)docker compose down -v
# Ver logs de un servicio específicodocker compose logs -f telegraf
# Reiniciar solo Grafanadocker compose restart grafana