Stack completo de monitorización
stack completo: Traefik + Telegraf + GeoIP + InfluxDB + Grafana
Comenzamos con un stack sencillo: un TIG stack, al que añadimos pequeños cambios para mejorar la observabilidad.
Hemos utilizado Docker y, como orquestador, Docker Compose.
Este es el archivo Compose (/srv/docker/monitoring/docker-compose.yml):
En este stack tenemos:
Telegraf: encargado de monitorizar tanto los contenedores a través del socket de Docker como de recolectar las métricas de todo el servidor.
geoipupdate: contiene las bases de datos de IPs, países y ciudades para ser consultadas de manera rápida y local.
geoip-shipper: contenedor Alpine con Python 3 para ejecutar un script que procesa los datos de Traefik (/srv/docker/traefik/logs/access.log) y los envía al bucket de InfluxDB mediante peticiones HTTP POST.
services:
# 1. ACTUALIZADOR AUTOMÁTICO DE BASES DE DATOS GEOIP (MAXMIND)
geoipupdate:
image: ghcr.io/maxmind/geoipupdate:latest
container_name: geoipupdate
hostname: geoipupdate
restart: unless-stopped
env_file: /srv/docker/.env
environment:
- GEOIPUPDATE_ACCOUNT_ID=${GEOIPUPDATE_ACCOUNT_ID}
- GEOIPUPDATE_LICENSE_KEY=${GEOIPUPDATE_KEY}
- 'GEOIPUPDATE_EDITION_IDS=GeoLite2-ASN GeoLite2-City GeoLite2-Country'
- GEOIPUPDATE_FREQUENCY=48
volumes:
- /srv/docker/monitoring/maxmind/data:/usr/share/GeoIP
networks:
- private_network
# 2. TELEGRAF (MÉTRICAS DE SISTEMA + DOCKER)
telegraf:
image: telegraf:latest
container_name: telegraf
hostname: telegraf
restart: unless-stopped
user: telegraf:989
env_file: /srv/docker/.env
group_add:
- "989"
security_opt:
- "no-new-privileges:true"
environment:
- TZ=Europe/Madrid
- HOST_ETC=/hostfs/etc
- HOST_PROC=/hostfs/proc
- HOST_SYS=/hostfs/sys
- HOST_VAR=/hostfs/var
- HOST_RUN=/hostfs/run
- HOST_MOUNT_PREFIX=/hostfs
volumes:
- /srv/docker/monitoring/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- /:/hostfs:ro
- /etc/localtime:/etc/localtime:ro
deploy:
resources:
limits:
cpus: "0.40"
memory: 384M
reservations:
memory: 128M
networks:
- private_network
# 3. GEOIP SHIPPER (LOG ENRICHMENT & STREAMING -> traefik bucket)
geoip-shipper:
image: python:3.11-alpine
container_name: geoip-shipper
restart: unless-stopped
depends_on:
- geoipupdate
command: >
sh -c "pip install --no-cache-dir geoip2 requests && python -u /app/shipper.py"
environment:
- INFLUXDB_URL=${INFLUXDB_URL}
- INFLUX_TOKEN=${INFLUXDB_TOKEN_TRAEFIK}
- INFLUX_ORG=${INFLUXDB_ORG}
- INFLUX_BUCKET=${INFLUXDB_BUCKET_TRAEFIK}
- LOG_PATH=/var/log/traefik/access.log
- GEOIP_DB_PATH=/usr/share/GeoIP/GeoLite2-City.mmdb
volumes:
- /srv/docker/monitoring/scripts/shipper.py:/app/shipper.py:ro
- /srv/docker/traefik/logs:/var/log/traefik:ro
- /srv/docker/monitoring/maxmind/data:/usr/share/GeoIP:ro
deploy:
resources:
limits:
cpus: "0.30"
memory: 256M
reservations:
memory: 64M
networks:
- private_network
networks:
private_network:
name: docker_private_network
external: trueDando los siguiente resultados:

En la parte local on-premises, almacenamos los datos en InfluxDB y, a su vez, los visualizamos con Grafana.

Como PVE tiene un sistema nativo de recolección de métricas, no hacemos uso del servicio de Telegraf. Todas estas métricas las enviamos a nuestro bucket de PVE en el servidor de monitorización: monitoring (10.10.0.251).

Es un sistema bastante sencillo de implementar y con una configuración muy accesible que puede ayudar a tener el control de las conexiones entrantes que reciben los dominios.