Setup Docker
Once you install the OS of your choosing, you will want to install Docker/Docker Compose. For this, we choose Centos 9 Stream, although the steps will be similar under any OS you choose.
Setup the Repository
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Install the latest version
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Start and Enable Docker
sudo systemctl start docker
sudo systemctl enable docker
Setup the TIG Stack
Now that Docker and the docker compose plugin are installed, we can now setup our docker compose yaml file to get the basis of our setup.
Setup a folder for the TIG stack and navigate to the folder
mkdir tig
cd tig
Save this file in your tig directory as:
docker-compose.yml
Create the docker compose file
version: '3.6'
services:
telegraf:
image: telegraf
container_name: telegraf
restart: always
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
depends_on:
- influxdb
links:
- influxdb
ports:
- '8125:8125'
influxdb:
image: influxdb:1.8-alpine
container_name: influxdb
restart: always
environment:
- INFLUXDB_DB=influx
- INFLUXDB_ADMIN_USER=influx
- INFLUXDB_ADMIN_PASSWORD=superflux
ports:
- '8086:8086'
volumes:
- influxdb_data:/var/lib/influxdb
grafana:
image: grafana/grafana
container_name: grafana
restart: always
depends_on:
- influxdb
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=
- GF_AUTH_LDAP_ENABLED=true
links:
- influxdb
ports:
- '3000:3000'
volumes:
- ./grafana/ldap.toml:/etc/grafana/ldap.toml:ro,Z
- grafana_data:/var/lib/grafana
caddy:
image: caddy:2-alpine
container_name: caddy
restart: always
depends_on:
- grafana
volumes:
- ./grafana/grafana.crt:/etc/ssl/private/grafana.crt:ro,z
- ./grafana/grafana.key:/etc/ssl/private/grafana.key:ro,z
- ./Caddyfile:/etc/caddy/Caddyfile:ro
ports:
- 80:80 # Allows for http redirection
- 443:443
volumes:
grafana_data: {}
influxdb_data: {}
Please note there are a couple variables in the above code you will want to change the influx password and grafana password environment variables. The grafana password will be prompted to change upon first login, so that one is not as critical.
I have caddy involved here to allow Grafana over HTTPS. Editing grafana.ini to allow HTTPS is possible, but a reverse proxy like Caddy makes this far easier.
Additionally, I have setup Grafana for LDAP authentication.
Below are some important settings in the docker-compose.yml file above that you need to watch out for.
# Grafana environment variable to enable LDAP authentication. Omit this variable if you do not want to use LDAP.
- GF_AUTH_LDAP_ENABLED=true
# Map the ldap.toml file to allow LDAP integration with Grafana.
- ./grafana/ldap.toml:/etc/grafana/ldap.toml:ro,Z
# Map the certificate files to your caddy container.
- ./grafana/grafana.crt:/etc/ssl/private/grafana.crt:ro,z
- ./grafana/grafana.key:/etc/ssl/private/grafana.key:ro,z
Woah now, what certificate files?
Good eye, glad you’re paying attention!
We need to create some locally signed certificates for Caddy to use for HTTPS because without them, HTTPS isn’t a thing.
Create a grafana directory inside your tig directory
cd ~/tig
mkdir grafana
Now generate a new private key, a certificate signing request and finally sign that key.
openssl genrsa -out grafana.key 2048
openssl req -new -key grafana.key -out grafana.csr
openssl x509 -req -days 3650 -in grafana.csr -signkey grafana.key -out grafana.crt
Generating a new CSR will prompt you for a few answers. Just make sure to set the ‘common name’ to the URL you want to use in Caddy for serving up your Grafana page.
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:NY
Locality Name (eg, city) [Default City]:NY
Organization Name (eg, company) [Default Company Ltd]:MyCompany LTD
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:supergraf.example.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Setup Telegraf
Create the telegraf.conf file. This will gather some basic metrics about your server and toss them into InfluxDB.
[global_tags]
[agent]
interval = "60s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = "10.243.165.15"
omit_hostname = false
[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "influx"
timeout = "5s"
username = "influx"
password = "superflux"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.mem]]
[[inputs.processes]]
Setup Caddy
Now we want to setup Caddy to allow for the HTTPS magic to happen.
supergraf.example.com {
reverse_proxy grafana:3000
encode gzip zstd
tls /etc/ssl/private/grafana.crt /etc/ssl/private/grafana.key
log {
level error
}
}
Setup Grafana LDAP
Thought we forgot to finish this off? Think again!
The final step here is to setup your ldap.toml file with the appropriate settings for your environment. In the example below I have Grafana setup to use an Active Directory server.
cd grafana
vi ldap.toml
Now configure the ldap.toml file
[[servers]]
# Ldap server host (specify multiple hosts space separated)
host = "10.10.10.1"
# Default port is 389 or 636 if use_ssl = true
port = 389
# Set to true if LDAP server should use an encrypted TLS connection (either with STARTTLS or LDAPS)
use_ssl = false
# If set to true, use LDAP with STARTTLS instead of LDAPS
start_tls = false
# set to true if you want to skip ssl cert validation
ssl_skip_verify = true
# Search user bind dn
bind_dn = "CN=ldap,OU=Service Accounts,DC=example,DC=com"
# Search user bind password
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
bind_password = """superbind"""
# Timeout in seconds (applies to each host specified in the 'host' entry (space separated))
timeout = 10
# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
search_filter = "(sAMAccountName=%s)"
# An array of base dns to search through
search_base_dns = ["dc=example,dc=com"]
# Specify names of the ldap attributes your ldap uses
[servers.attributes]
member_of = "memberOf"
email = "email"
[[servers.group_mappings]]
group_dn = "CN=Domain Admins,CN=Users,DC=example,DC=com"
org_role = "Admin"
[[servers.group_mappings]]
# If you want to match all (or no ldap groups) then you can use wildcard
group_dn = "*"
org_role = "Viewer"
Finally, start your docker compose!
cd ~/tig
docker compose up -d
Conclusion
Once you have completed all the above steps, your grafana instance will be available at supergraf.example.com (you did change all the settings above to match your environment, right? RIGHT?)
To validate your InfluxDB is gathering data from Telegraf, you can either browse the InfluxDB directly, or install this dashboard into your grafana
https://grafana.com/grafana/dashboards/928-telegraf-system-dashboard/
If all went well, you will now be seeing system metrics for your new tig server populating into your telegraf dashboard within the next hour.