Grafana Grafana

Ejecuta Grafana con Docker Compose y una carpeta de provisioning

Inicia Grafana desde un archivo compose con toda la configuración montada como archivos.

10 min Principiante

Esta guía ejecuta Grafana y un data source de Prometheus en local con Docker Compose, con cada ajuste suministrado mediante archivos y variables de entorno. Nunca abres la interfaz para configurar nada. Necesitas Docker con el plugin Compose.

Estructura el proyecto

grafana-as-code/
├── compose.yaml
├── .env                          # secretos y versiones, no se sube a Git
├── grafana/
│   ├── grafana.ini
│   └── provisioning/
│       ├── datasources/
│       │   └── prometheus.yaml
│       ├── dashboards/
│       │   └── providers.yaml
│       ├── alerting/             # se añade en la guía de alertas
│       └── plugins/
├── dashboards/
│   └── overview.json
└── prometheus/
    └── prometheus.yml

Mantén esto en Git. Añade .env a .gitignore y haz commit de un .env.example en su lugar.

El archivo compose

compose.yaml:

services:
  grafana:
    image: grafana/grafana:13.1.0   # fija una versión que hayas probado
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
      GF_USERS_ALLOW_SIGN_UP: "false"
    volumes:
      - ./grafana/grafana.ini:/etc/grafana/grafana.ini:ro
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
      - ./dashboards:/var/lib/grafana/dashboards:ro
      - grafana-data:/var/lib/grafana
    depends_on:
      - prometheus

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro

volumes:
  grafana-data:

Los montajes importantes:

  • /etc/grafana/grafana.ini es el archivo de configuración del servidor dentro de la imagen oficial.
  • /etc/grafana/provisioning es donde Grafana busca las carpetas datasources, dashboards, alerting y plugins.
  • /var/lib/grafana/dashboards es una carpeta arbitraria para el JSON de dashboards. La ruta debe coincidir con la que definas en el proveedor de dashboards de abajo.
  • grafana-data es un volumen con nombre para la base de datos SQLite y los plugins de Grafana. Sin él, el estado se pierde cuando se recrea el contenedor.

Los montajes de configuración son de solo lectura a propósito: Grafana no necesita escribir en ellos.

.env:

GRAFANA_ADMIN_PASSWORD=change-me-before-sharing

Ten en cuenta que GF_SECURITY_ADMIN_PASSWORD solo se aplica la primera vez que Grafana crea su base de datos. Cambiarlo después en el archivo compose no tiene efecto sobre un volumen existente. Elimina el volumen para empezar de nuevo, o restablece la contraseña con la CLI.

Un grafana.ini mínimo

[server]
http_port = 3000

[analytics]
reporting_enabled = false
check_for_updates = false

[log]
mode = console
level = info

[auth]
disable_login_form = false

Todo lo que omitas recurre a los valores predeterminados de Grafana. La siguiente guía cubre las reglas completas de grafana.ini y las sobrescrituras GF_*.

Provisiona un data source

grafana/provisioning/datasources/prometheus.yaml:

apiVersion: 1

datasources:
  - name: Prometheus
    uid: prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false

El uid es lo que deberían referenciar los dashboards y las reglas de alertas, así que elige uno estable. Las siguientes guías explican cada campo.

Provisiona un proveedor de dashboards y un dashboard

grafana/provisioning/dashboards/providers.yaml:

apiVersion: 1

providers:
  - name: default
    type: file
    updateIntervalSeconds: 30
    allowUiUpdates: false
    options:
      path: /var/lib/grafana/dashboards

dashboards/overview.json (un dashboard mínimo; consulta la guía de dashboards para los detalles):

{
  "uid": "overview",
  "title": "Overview",
  "schemaVersion": 39,
  "panels": [
    {
      "id": 1,
      "type": "timeseries",
      "title": "Targets up",
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
      "datasource": { "type": "prometheus", "uid": "prometheus" },
      "targets": [
        { "refId": "A", "expr": "up", "datasource": { "type": "prometheus", "uid": "prometheus" } }
      ]
    }
  ]
}

Y un pequeño prometheus/prometheus.yml para que haya datos que mostrar:

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

Arráncalo y comprueba sin la interfaz

docker compose up -d
docker compose logs grafana | grep -i provisioning
curl -s http://localhost:3000/api/health
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/datasources | jq '.[].name'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD "http://localhost:3000/api/search?type=dash-db" | jq '.[].title'

El endpoint de salud debería informar ok, la lista de data sources debería contener Prometheus y la búsqueda debería devolver Overview. Abre http://localhost:3000 si quieres ver el resultado, pero no se hizo clic en nada para llegar hasta aquí.

Cambia algo y observa cómo se aplica

  • Edita dashboards/overview.json. Dentro de updateIntervalSeconds Grafana recoge el cambio sin reiniciar.
  • Edita el archivo del data source y reinicia: docker compose restart grafana. Los data sources se leen al arrancar.
  • Elimina un archivo de dashboard. El dashboard se elimina a menos que el proveedor defina disableDeletion: true.

Instala plugins desde la configuración

Los plugins pueden instalarse al arrancar el contenedor mediante una variable de entorno, así que permanecen en el archivo compose:

    environment:
      GF_PLUGINS_PREINSTALL: grafana-clock-panel

Las versiones antiguas usan GF_INSTALL_PLUGINS en su lugar. Consulta la documentación de tu versión, y ten en cuenta que el provisioning solo configura plugins que ya están instalados.

Limpia

docker compose down        # conserva el volumen de datos
docker compose down -v     # también elimina la base de datos de Grafana

Guías populares