Initial checkin
This commit is contained in:
commit
2cf0416458
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
description = "Grafana module for Fudo systems.";
|
||||||
|
|
||||||
|
inputs = { nixpkgs.url = "nixpkgs/nixos-23.05"; };
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, arion, ... }: {
|
||||||
|
nixosModules = rec {
|
||||||
|
default = grafana;
|
||||||
|
grafana = { ... }: {
|
||||||
|
imports = [ arion.nixosModules.arion ./grafana.nix ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,147 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.fudo.services.grafana;
|
||||||
|
|
||||||
|
datasourceOpts = { name, ... }: {
|
||||||
|
options = with types; {
|
||||||
|
url = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Datasource URL.";
|
||||||
|
};
|
||||||
|
|
||||||
|
type = mkOption {
|
||||||
|
type = enum [ "prometheus" "loki" ];
|
||||||
|
description = "Datasource type.";
|
||||||
|
default = "prometheus";
|
||||||
|
};
|
||||||
|
|
||||||
|
name = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = name;
|
||||||
|
};
|
||||||
|
|
||||||
|
default =
|
||||||
|
mkEnableOption "Use this datasource as the default while querying.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
in {
|
||||||
|
options.fudo.services.grafana = with types; {
|
||||||
|
enable = mkEnableOption "Enable Grafana server.";
|
||||||
|
|
||||||
|
state-directory = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Path at which to store server state.";
|
||||||
|
};
|
||||||
|
|
||||||
|
base-url = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Base URL at which the Grafana server is reachable.";
|
||||||
|
};
|
||||||
|
|
||||||
|
admin-password-file = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Path to a file containing the admin user password.";
|
||||||
|
};
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = port;
|
||||||
|
description = "Port on which to listen for HTTP requests (on localhost)";
|
||||||
|
default = 5402;
|
||||||
|
};
|
||||||
|
|
||||||
|
datasources = mkOption {
|
||||||
|
type = attrsOf (submodule datasourceOpts);
|
||||||
|
description = "A map of datasources supplied to Grafana.";
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
oauth = let
|
||||||
|
oauthOpts.options = {
|
||||||
|
hostname = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Host of the OAuth server.";
|
||||||
|
};
|
||||||
|
|
||||||
|
oauth.client-id = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Path to file containing the Grafana OAuth client ID.";
|
||||||
|
};
|
||||||
|
|
||||||
|
oauth.client-secret = mkOption {
|
||||||
|
type = str;
|
||||||
|
description =
|
||||||
|
"Path to file containing the Grafana OAuth client secret.";
|
||||||
|
};
|
||||||
|
|
||||||
|
oauth.slug = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "The application slug on the OAuth server.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in mkOption {
|
||||||
|
type = nullOr (submodule oauthOpts);
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
grafana = {
|
||||||
|
enable = true;
|
||||||
|
dataDir = "${cfg.state-directory}/data";
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
root_url = cfg.base-url;
|
||||||
|
http_addr = "127.0.0.1";
|
||||||
|
http_port = cfg.port;
|
||||||
|
protocol = "http";
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
admin_password = "$__file{${cfg.admin-password-file}}";
|
||||||
|
secret_key = "$__file{${cfg.secret-key-file}}";
|
||||||
|
};
|
||||||
|
|
||||||
|
database = {
|
||||||
|
type = "sqlite3";
|
||||||
|
path = "${cfg.state-directory}/database.sqlite";
|
||||||
|
};
|
||||||
|
|
||||||
|
provision = {
|
||||||
|
enable = true;
|
||||||
|
datasources.settings.datasources = let
|
||||||
|
mkDatasource = ds: {
|
||||||
|
editable = false;
|
||||||
|
isDefault = ds.default;
|
||||||
|
inherit (ds) name type url;
|
||||||
|
};
|
||||||
|
in map mkDatasource (attrValues cfg.datasources);
|
||||||
|
};
|
||||||
|
|
||||||
|
auth = mkIf (!isNull cfg.oauth) {
|
||||||
|
signout_redirect_url =
|
||||||
|
"https://${cfg.oauth.hostname}/application/o/${cfg.oauth.slug}/end-session/";
|
||||||
|
oauth_auto_login = true;
|
||||||
|
|
||||||
|
generic_oauth = {
|
||||||
|
name = "Authentik";
|
||||||
|
enabled = true;
|
||||||
|
client_id = "$__file{${cfg.oauth.client-id}}";
|
||||||
|
client_secret = "$__file{${cfg.oauth.client-secret}}";
|
||||||
|
scopes = "openid email profile";
|
||||||
|
auth_url = "https://${cfg.oauth.hostname}/application/o/authorize/";
|
||||||
|
token_url = "https://${cfg.oauth.hostname}/application/o/token/";
|
||||||
|
api_url = "https://${cfg.oauth.hostname}/application/o/userinfo/";
|
||||||
|
role_attribute_path = concatStringsSep " || " [
|
||||||
|
"contains(groups[*], 'Metrics Admins') && 'Admin'"
|
||||||
|
"contains(groups[*], 'Metrics Editors') && 'Editor'"
|
||||||
|
"'Viewer'"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue