Easy InfluxDB & Grafana setup with Traefik
Tags: influxdb, grafana, traefik, docker
Published: 2018-12-03 21:51:12

---
title: Easy InfluxDB & Grafana setup with Traefik
published: true
tags: influxdb,grafana,traefik,docker
canonical_url: https://jonnev.se/easy-influxdb-grafana-setup-with-traefik/
---

 ![Easy InfluxDB & Grafana setup with Traefik](https://jonnev.se/content/images/2018/08/Screen-Shot-2018-08-15-at-22.09.30-1.png)

What is more exciting than staring at graphs? Nothing right. If you just love some system metrics or want to display the temperature in your home over time, a time series database like [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/) combined with [Grafana](https://grafana.com/grafana) is the way to go!

This guide will show you an easy way to get both of these systems up in no time with the help of Traefik and Docker. If you **already have** a server with Traefik running then continue. Otherwise I recommend you read my [previous post](https://dev.to/joenas/traefik-with-docker-and-lets-encrypt-pon-temp-slug-5403439) and you'll be back here soon.

## Setup

Let's make a directory for your data to live in, as sudo if needed

```
sudo su
mkdir /opt/influx
```

Then we need an internal docker network for the services to communicate on

```
docker network create influx
```

### docker-compose.yml

We'll put our services in a docker-compose file to be able to easily manage things. We'll put the basics in first.

```
nano /opt/influx/docker-compose.yml

version: "2"
services:
  influxdb:
    # We'll add stuff here
  grafana:
    # and here

networks:
  default:
    external:
      name: influx # The network we created
  web:
    external: true # For traefik
```

### InfluxDB

There are a number of [environment variables](https://jonnev.se/easy-influxdb-grafana-setup-with-traefik/(https://hub.docker.com/_/influxdb/)) available for the image of which we'll use a few.

If you want to send data to Influx from the outside world you need to have a _frontend_ in Traefik with the port and hostname, if not then remove the `labels` section. You can also remove `- web` under `networks`.

We also need a user with write access and a database to write to. For some nice system metrics I use [telegraf](https://www.influxdata.com/time-series-platform/telegraf/) so here we'll have the InfluxDB image create that database and user initially. If you want to use something else as input just change the values accordingly.

```
influxdb:
    image: influxdb:1.5.4-alpine
    restart: unless-stopped
    ports:
      - "127.0.0.1:8086:8086"
    volumes:
      - ./influxdb:/var/lib/influxdb
    environment:
      - INFLUXDB_DB=telegraf 
      - INFLUXDB_USER=telegraf
      - INFLUXDB_USER_PASSWORD=secretpassword
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:influxdb.example.com"
      - "traefik.port=8086"
      - "traefik.docker.network=web"
    networks:
      - web
      - default # The external "influx" network
```

☝️ **Remember to replace** `example.com` in `traefik.frontend.rule`.

### Grafana

Now let's add the Grafana service so that we have something to display our future stats with. First let's add a volume for persistent storage.

```
docker volume create grafana-storage
```

Then add this to `docker-compose.yml` between `influxdb` and `networks`.

```
grafana:
    image: grafana/grafana:4.4.1
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
     - grafana-storage:/var/lib/grafana
     - ./log/grafana:/var/log/grafana
    environment:
     - GF_SECURITY_ADMIN_PASSWORD=supersecret
     # Comment out if you have users that should sign up
     - GF_USERS_ALLOW_SIGN_UP=false 
     - GF_SERVER_ROOT_URL=https://grafana.example.com
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:grafana.example.com"
      - "traefik.port=3000"
      - "traefik.docker.network=web"
    networks:
      - web
      - default

volumes:
  grafana-storage:
    external: true
```

☝️ **Remember to replace** `grafana.example.com` in the 2 places above.

### Grafana UI

Now you should be able to run the services!

```
# To start
docker-compose up -d
# Check logs
docker-compose logs
# Check processes
docker-compose ps
```

If everything looks alright, open up your Grafana URL and you should be greeted with a login screen. Use `admin` and the password you set as `GF_SECURITY_ADMIN_PASSWORD`. After logging in click "Add data source" and fill out the fields like this.

![Easy InfluxDB & Grafana setup with Traefik](https://jonnev.se/content/images/2018/08/grafana-settings.png)

The hostname `influx_influxdb_1` in the Url setting is from the docker network `influx`, since the services are in separate containers you can't use `localhost` here.

If you're getting **error messages when saving/testing the data source and using Safari** , try another browser.

### Getting some data in there

If you already have a way to send data to Influx, then you're done! If not then previously mentioned `telegraf` is just as easy to set up.

```
mkdir /opt/telegraf
cd /opt/telegraf
nano docker-compose.yml

version: "2"
services:
  telegraf:
    image: telegraf:1.5.2
    restart: unless-stopped
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
      # For docker stats
      - /var/run/docker.sock:/var/run/docker.sock:ro
    labels:
      - "traefik.enable=false"
    networks:
      - default

networks:
  default:
    external:
      name: influx

nano telegraf.conf
```

Here's a very simple conf just to get up and running. Feel free to use the [default one](https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf) for more options.

```
# Configuration for telegraf agent
[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  debug = false
  quiet = false
  logfile = ""
  hostname = "MYHOST"

###############################################################################
# OUTPUT PLUGINS #
###############################################################################

# Configuration for influxdb server to send metrics to
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"] # required
  database = "telegraf" # required
  username = "telegraf"
  password = "secretpassword"
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"

###############################################################################
# INPUT PLUGINS #
###############################################################################

# Read metrics about cpu usage
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false

# Read metrics about disk usage by mount point
[[inputs.disk]]
  ## Ignore some mountpoints by filesystem type. For example (dev)tmpfs (usually
  ## present on /run, /var/run, /dev/shm or /dev).
  ignore_fs = ["tmpfs", "devtmpfs"]

# Read metrics about disk IO by device
[[inputs.diskio]]
  ## Setting devices will restrict the stats to the specified devices.
  # devices = ["sda", "sdb"]

# Get kernel statistics from /proc/stat
[[inputs.kernel]]
  # no configuration

# Read metrics about memory usage
[[inputs.mem]]
  # no configuration

# Get the number of processes and group them by status
[[inputs.processes]]
  # no configuration

# Read metrics about swap memory usage
[[inputs.swap]]
  # no configuration

# Read metrics about system load & uptime
[[inputs.system]]
  # no configuration

# # Read metrics about docker containers
[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"
  timeout = "5s"

# # Read metrics about network interface usage
[[inputs.net]]
  interfaces = ["eth*"]
```

Start the service and you'll have some data coming in.

```
docker-compose up -d
docker-compose logs
```

Now go back to your Grafana instance and create some [dashboards](https://grafana.com/dashboards?dataSource=influxdb)!

![Easy InfluxDB & Grafana setup with Traefik](https://jonnev.se/content/images/2018/08/Screen-Shot-2018-08-15-at-22.09.30.png)

☝️ [Telegraf sysstats](https://grafana.com/dashboards/4823) by [broferek](https://grafana.com/orgs/broferek)

## The End

If you noticed any factual errors, spelling mistakes (yes), best practises I'm not aware of or run into any trouble please comment below or hit me up on [Twitter](https://twitter.com/jonnever) 🙌