Grafana: Difference between revisions
imported>Nadrog m Updated based on instructions at https://grafana.com/tutorials/run-grafana-behind-a-proxy/ |
Add infobox and Template:File-based codeblocks |
||
(11 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
[https://grafana.com/ Grafana] is an open-source, general purpose dashboarding tool, which runs as a web application. It can be used to create | '''[https://grafana.com/grafana/ Grafana]''' is an open-source, general purpose visualization and dashboarding tool, which runs as a web application. It can be used to create time-series graphs and display logs. For data sources, it supports [[Prometheus]], graphite, InfluxDB, opentsdb, [[Grafana Loki]], [[PostgreSQL]] and more. | ||
{{infobox application | |||
|name=Grafana | |||
|image=Grafana logo.svg | |||
|developer=Grafana Labs | |||
|type=Visualization and dashboarding tool | |||
|status=Active | |||
|license=GNU Affero General Public License v3.0 only | |||
|programmingLanguage=Go and TypeScript | |||
|github=grafana/grafana | |||
|documentation=https://grafana.com/docs/grafana/latest/ | |||
}} | |||
== Installation == | == Installation == | ||
Grafana is available as NixOS module | Grafana is available as NixOS module: {{nixos:option|services.grafana}}. [https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/ Official documentation] for the options inside <code>settings</code>. Here is a basic config: | ||
< | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
services.grafana = { | { | ||
services.grafana = { | |||
enable = true; | |||
settings = { | |||
server = { | |||
http_addr = "127.0.0.1"; | |||
http_port = 3000; | |||
enforce_domain = true; | |||
enable_gzip = true; | |||
domain = "grafana.your.domain"; | |||
# Alternatively, if you want to serve Grafana from a subpath: | |||
# domain = "your.domain"; | |||
# root_url = "https://your.domain/grafana/"; | |||
# serve_from_sub_path = true; | |||
}; | |||
# Prevents Grafana from phoning home | |||
#analytics.reporting_enabled = false; | |||
}; | }; | ||
}; | }; | ||
} | } | ||
</ | </nowiki>}} | ||
== Usage == | |||
Grafana can be used through tunnels, like a SSH tunnel, or a VPN tunnel like Wireguard or Headscale. This way, Grafana can be completely shielded from the outside. | |||
Another way is to make it publicly available, usually behind a reverse proxy. | |||
==== Nginx ==== | |||
< | Here is how to setup [[Nginx]] such that it proxies <code>your.domain/grafana</code> to your Grafana instance: | ||
services.nginx.virtualHosts."your.domain" = { | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | |||
services.nginx.virtualHosts."your.domain" = { | |||
addSSL = true; | |||
enableACME = true; | |||
locations."/grafana/" = { | |||
proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; | proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; | ||
proxyWebsockets = true; | proxyWebsockets = true; | ||
recommendedProxySettings = true; | recommendedProxySettings = true; | ||
}; | |||
}; | }; | ||
}; | } | ||
</nowiki>}} | |||
==== Traefik ==== | |||
[[Traefik]] is another common reverse proxy, for which the configuration relevant to Grafana would like this: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.traefik = { | |||
# ... | |||
dynamicConfigOptions = { | |||
http.routers."your.domain" = { | |||
rule = "Host(`your.domain`) && PathPrefix(`/grafana`)"; | |||
service = "grafana"; | |||
} | |||
http.services."grafana" = { | |||
loadBalancer.servers = [ { | |||
url = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; | |||
} ] | |||
}; | |||
# ... | |||
}; | |||
} | |||
</nowiki>}} | |||
Alternatively, to use Grafana on <code>grafana.your.domain</code> instead of <code>your.domain/grafana</code>, you could change line 5 above to: | |||
<syntaxhighlight lang="diff"> | |||
-rule = "Host(`your.domain`) && PathPrefix(`/grafana`)"; | |||
+rule = "Host(`grafana.your.domain`)"; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == Configuration == | ||
Everything (data sources, users, dashboards, ...) can be configured either in the Web UI or provisioned as code using Nix. | |||
=== Via Web UI === | |||
Log into the Grafana web application (using default user: admin, password: admin) | Log into the Grafana web application (using default user: admin, password: admin). Refer to the official documentation on how to do it: | ||
* [https://grafana.com/docs/grafana/latest/datasources/add-a-data-source/ Add a data source] | * [https://grafana.com/docs/grafana/latest/datasources/add-a-data-source/ Add a data source] | ||
* [https://grafana.com/docs/grafana/latest/administration/manage-users-and-permissions/manage-server-users/add-user/ Add a user] | * [https://grafana.com/docs/grafana/latest/administration/manage-users-and-permissions/manage-server-users/add-user/ Add a user] | ||
* [https://grafana.com/docs/grafana/latest/dashboards/dashboard-create/ Create dashboard] | * [https://grafana.com/docs/grafana/latest/dashboards/dashboard-create/ Create dashboard] | ||
=== Declarative configuration === | |||
Grafana supports [https://grafana.com/docs/grafana/latest/administration/provisioning/ provisioning] data sources, dashboards and alerting using {{nixos:option|services.grafana.provision}}. Note that removing a provision and switching to the new NixOS configuration does not currently remove the provisioned items; you have to define them, for example, in <code>deleteDatasources</code>. | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.grafana = { | |||
declarativePlugins = with pkgs.grafanaPlugins; [ ... ]; | |||
provision = { | |||
enable = true; | |||
# Creates a *mutable* dashboard provider, pulling from /etc/grafana-dashboards. | |||
# With this, you can manually provision dashboards from JSON with `environment.etc` like below. | |||
dashboards.settings.providers = [{ | |||
name = "my dashboards"; | |||
disableDeletion = true; | |||
options = { | |||
path = "/etc/grafana-dashboards"; | |||
foldersFromFilesStructure = true; | |||
}; | |||
}]; | |||
datasources.settings.datasources = [ | |||
# Provisioning a built-in data source | |||
{ | |||
name = "Prometheus"; | |||
type = "prometheus"; | |||
url = "http://${config.services.prometheus.listenAddress}:${toString config.services.prometheus.port}"; | |||
isDefault = true; | |||
editable = false; | |||
} | |||
# All plugins can be provisioned but it's not always documented: https://github.com/fr-ser/grafana-sqlite-datasource/blob/main/docs/faq.md#can-i-use-provisioning-with-this-plugin | |||
# Compare below with https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/latest/setup/provisioning/ | |||
{ | |||
name = "Infinity"; | |||
type = "yesoreyeram-infinity-datasource"; | |||
editable = false; | |||
} | |||
]; | |||
# Note: removing attributes from the above `datasources.settings.datasources` is not currently enough for them to be deleted; | |||
# One needs to use the following option: | |||
# datasources.settings.deleteDatasources = [ { name = "foo"; orgId = 1; } { name = "bar"; orgId = 1; } ]; | |||
}; | |||
}; | |||
# see `dashboards.settings.providers` above | |||
environment.etc."grafana-dashboards/some-dashboard.json".source = ./some-dashboard.json; | |||
} | |||
</nowiki>}} | |||
== External Links == | == External Links == | ||
Line 51: | Line 161: | ||
* [https://grafana.com/ grafana.com] | * [https://grafana.com/ grafana.com] | ||
* [https://xeiaso.net/blog/prometheus-grafana-loki-nixos-2020-11-20 How to Setup Prometheus, Grafana and Loki on NixOS] | * [https://xeiaso.net/blog/prometheus-grafana-loki-nixos-2020-11-20 How to Setup Prometheus, Grafana and Loki on NixOS] | ||
[[Category:Server]] | |||
[[Category:Web Applications]] |
Latest revision as of 06:46, 3 August 2025
Grafana is an open-source, general purpose visualization and dashboarding tool, which runs as a web application. It can be used to create time-series graphs and display logs. For data sources, it supports Prometheus, graphite, InfluxDB, opentsdb, Grafana Loki, PostgreSQL and more.
Installation
Grafana is available as NixOS module: services.grafana
. Official documentation for the options inside settings
. Here is a basic config:
{
services.grafana = {
enable = true;
settings = {
server = {
http_addr = "127.0.0.1";
http_port = 3000;
enforce_domain = true;
enable_gzip = true;
domain = "grafana.your.domain";
# Alternatively, if you want to serve Grafana from a subpath:
# domain = "your.domain";
# root_url = "https://your.domain/grafana/";
# serve_from_sub_path = true;
};
# Prevents Grafana from phoning home
#analytics.reporting_enabled = false;
};
};
}
Usage
Grafana can be used through tunnels, like a SSH tunnel, or a VPN tunnel like Wireguard or Headscale. This way, Grafana can be completely shielded from the outside.
Another way is to make it publicly available, usually behind a reverse proxy.
Nginx
Here is how to setup Nginx such that it proxies your.domain/grafana
to your Grafana instance:
{
services.nginx.virtualHosts."your.domain" = {
addSSL = true;
enableACME = true;
locations."/grafana/" = {
proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}";
proxyWebsockets = true;
recommendedProxySettings = true;
};
};
}
Traefik
Traefik is another common reverse proxy, for which the configuration relevant to Grafana would like this:
{
services.traefik = {
# ...
dynamicConfigOptions = {
http.routers."your.domain" = {
rule = "Host(`your.domain`) && PathPrefix(`/grafana`)";
service = "grafana";
}
http.services."grafana" = {
loadBalancer.servers = [ {
url = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}";
} ]
};
# ...
};
}
Alternatively, to use Grafana on grafana.your.domain
instead of your.domain/grafana
, you could change line 5 above to:
-rule = "Host(`your.domain`) && PathPrefix(`/grafana`)";
+rule = "Host(`grafana.your.domain`)";
Configuration
Everything (data sources, users, dashboards, ...) can be configured either in the Web UI or provisioned as code using Nix.
Via Web UI
Log into the Grafana web application (using default user: admin, password: admin). Refer to the official documentation on how to do it:
Declarative configuration
Grafana supports provisioning data sources, dashboards and alerting using services.grafana.provision
. Note that removing a provision and switching to the new NixOS configuration does not currently remove the provisioned items; you have to define them, for example, in deleteDatasources
.
{
services.grafana = {
declarativePlugins = with pkgs.grafanaPlugins; [ ... ];
provision = {
enable = true;
# Creates a *mutable* dashboard provider, pulling from /etc/grafana-dashboards.
# With this, you can manually provision dashboards from JSON with `environment.etc` like below.
dashboards.settings.providers = [{
name = "my dashboards";
disableDeletion = true;
options = {
path = "/etc/grafana-dashboards";
foldersFromFilesStructure = true;
};
}];
datasources.settings.datasources = [
# Provisioning a built-in data source
{
name = "Prometheus";
type = "prometheus";
url = "http://${config.services.prometheus.listenAddress}:${toString config.services.prometheus.port}";
isDefault = true;
editable = false;
}
# All plugins can be provisioned but it's not always documented: https://github.com/fr-ser/grafana-sqlite-datasource/blob/main/docs/faq.md#can-i-use-provisioning-with-this-plugin
# Compare below with https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/latest/setup/provisioning/
{
name = "Infinity";
type = "yesoreyeram-infinity-datasource";
editable = false;
}
];
# Note: removing attributes from the above `datasources.settings.datasources` is not currently enough for them to be deleted;
# One needs to use the following option:
# datasources.settings.deleteDatasources = [ { name = "foo"; orgId = 1; } { name = "bar"; orgId = 1; } ];
};
};
# see `dashboards.settings.providers` above
environment.etc."grafana-dashboards/some-dashboard.json".source = ./some-dashboard.json;
}