~abyxcos/nas.nix

9b537931f20edaa9ca51c6b12afe0a3c9cda0aa3 — abyxcos 1 year, 10 months ago 9170452
Add a grafana/prometheus setup for the pretty dashboard. Based on Xe's post.
2 files changed, 173 insertions(+), 1 deletions(-)

M configuration.nix
A prometheus.nix
M configuration.nix => configuration.nix +12 -1
@@ 6,8 6,11 @@

{
	imports =
		[ # Include the results of the hardware scan.
		[
			# Include the results of the hardware scan.
			./hardware-configuration.nix
			# Prometheus/grafana snippet.
			./prometheus.nix
		];

	boot = {


@@ 50,9 53,17 @@
			enp0s20f3.useDHCP = true;

			bond0.useDHCP = true;
			# br0.useDHCP = false;
			# br0.ipv4.addresses = [
			# 	{
			# 		address = "10.11.11.2";
			# 		prefixLength = 24;
			# 	}
			# ];
		};

		bonds.bond0.interfaces = ["enp0s20f0" "enp0s20f1" "enp0s20f2" "enp0s20f3"];
		# bridges.br0.interfaces = ["bond0"];

		# Open ports in the firewall.
		firewall = {

A prometheus.nix => prometheus.nix +161 -0
@@ 0,0 1,161 @@
# https://xeiaso.net/blog/prometheus-grafana-loki-nixos-2020-11-20

{ config, pkgs, ... }:

{
	services.grafana = {
		enable = true;

		settings = {
			analytics.reporting_enabled = false;
			server = {
				domain = "grafana.local";
				http_addr = "127.0.0.1";
			};
		};
	};

	services.prometheus = {
		enable = true;

		exporters = {
			node = {
				enable = true;
				enabledCollectors = ["systemd"];
			};

			zfs.enable = true;
		};

		scrapeConfigs = [
			{
				job_name = "nodes";
				static_configs = [{
					targets = [
						"127.0.0.1:${toString config.services.prometheus.exporters.node.port}"
						"127.0.0.1:${toString config.services.prometheus.exporters.zfs.port}"
					];
				}];
			}
		];
	};

	services.loki = {
		enable = true;
		configuration = {
			server.http_listen_port = 3030;
			auth_enabled = false;

			ingester = {
				lifecycler = {
					address = "127.0.0.1";
					ring = {
						kvstore = {
							store = "inmemory";
						};
						replication_factor = 1;
					};
				};
				chunk_idle_period = "1h";
				max_chunk_age = "1h";
				chunk_target_size = 999999;
				chunk_retain_period = "30s";
				max_transfer_retries = 0;
			};

			schema_config = {
				configs = [{
					from = "2022-06-06";
					store = "boltdb-shipper";
					object_store = "filesystem";
					schema = "v11";
					index = {
						prefix = "index_";
						period = "24h";
					};
				}];
			};

			storage_config = {
				boltdb_shipper = {
					active_index_directory = "/var/lib/loki/boltdb-shipper-active";
					cache_location = "/var/lib/loki/boltdb-shipper-cache";
					cache_ttl = "24h";
					shared_store = "filesystem";
				};

				filesystem = {
					directory = "/var/lib/loki/chunks";
				};
			};

			limits_config = {
				reject_old_samples = true;
				reject_old_samples_max_age = "168h";
			};

			chunk_store_config = {
				max_look_back_period = "0s";
			};

			table_manager = {
				retention_deletes_enabled = false;
				retention_period = "0s";
			};

			compactor = {
				working_directory = "/var/lib/loki";
				shared_store = "filesystem";
				compactor_ring = {
					kvstore = {
						store = "inmemory";
					};
				};
			};
		};
	};

	services.promtail = {
		enable = true;
		configuration = {
			server = {
				http_listen_port = 3031;
				grpc_listen_port = 0;
			};
			positions = {
				filename = "/tmp/positions.yaml";
			};
			clients = [{
				url = "http://127.0.0.1:${toString config.services.loki.configuration.server.http_listen_port}/loki/api/v1/push";
			}];
			scrape_configs = [{
				job_name = "journal";
				journal = {
					max_age = "12h";
					labels = {
						job = "systemd-journal";
						host = "pihole";
					};
				};
				relabel_configs = [{
					source_labels = [ "__journal__systemd_unit" ];
					target_label = "unit";
				}];
			}];
		};
	};

	services.nginx = {
		enable = true;
		recommendedProxySettings = true;
		virtualHosts.${config.services.grafana.settings.server.domain} = {
			locations."/" = {
				proxyPass = "http://127.0.0.1:${toString config.services.grafana.settings.server.http_port}";
				proxyWebsockets = true;
			};
		};
	};

	# Enable port 80 for nginx
	networking.firewall.allowedTCPPorts = [80];
}