Ir al contenido

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.

[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]
  • Docker y Docker Compose instalados
  • Conocimientos básicos de terminal

Ventana de terminal
mkdir iot-tig-stack
cd iot-tig-stack
mkdir telegraf

Crea el archivo telegraf/telegraf.conf:

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"

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/grafana

La estructura final de tu carpeta debe verse así:

iot-tig-stack/
├── docker-compose.yml
└── telegraf/
└── telegraf.conf

Ventana de terminal
docker compose up -d

Espera ~20 segundos para que todo arranque, luego verifica:

Ventana de terminal
docker compose ps # Todos deben estar en estado "running"
docker compose logs # Revisa si hay errores

  1. Abre http://localhost:3000 en tu navegador
  2. Inicia sesión con admin / grafana-password
  3. Ve a ⚙️ Configuración → Data Sources → Add data source
  4. Elige InfluxDB
  5. Completa los campos:
    • Query Language: Flux
    • URL: http://influxdb:8086
    • Organization: mi-org-iot
    • Token: mi-token-secreto
    • Default Bucket: iot-data
  6. Haz clic en Save & Test — deberías ver ✅ verde

  1. En Grafana, ve a Dashboards → Import
  2. Ingresa el ID de dashboard 928 (métricas de sistema con Telegraf) y haz clic en Load
  3. Selecciona tu fuente de datos InfluxDB y haz clic en Import
  4. 🎉 ¡Ahora tienes un dashboard en vivo con CPU, Memoria y Disco!

Otros IDs de dashboard útiles:

IDDescripción
928Telegraf: resumen del sistema
1443Telegraf + InfluxDB detallado
15117Métricas del host (tema oscuro)

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:

Ventana de terminal
# 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, Point
from 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)

  1. Abre el panel de un dashboard → Edit → pestaña Alert
  2. Haz clic en Create alert rule
  3. Define tu condición (ej: CPU > 90% durante 5 minutos)
  4. Agrega un Contact Point (email, Slack, Telegram, PagerDuty, etc.)
  5. ¡Listo! Grafana maneja las alertas sin necesitar Kapacitor.

Ventana de terminal
# Detener todo
docker compose down
# Detener y borrar todos los datos (reinicio limpio)
docker compose down -v
# Ver logs de un servicio específico
docker compose logs -f telegraf
# Reiniciar solo Grafana
docker compose restart grafana