119 lines
3.4 KiB
Nix

{ config, dns-mapping ? {}, ... }:
let
nodeAddress = "192.168.0.5";
wgAddress = "10.100.0.1";
wgConf = config.secrets.wg-hypervisor-dns.decrypted;
in {
boot.kernelModules = [ "wireguard" ];
secrets.wg-hypervisor-dns.services = [ "container@blocky.service" ];
containers.blocky = {
autoStart = true;
ephemeral = true;
privateNetwork = true;
hostBridge = "br0";
localAddress = "${nodeAddress}/24";
tmpfs = [ "/" ];
bindMounts."/var/secrets/${wgConf}" = {
hostPath = wgConf;
isReadOnly = true;
};
config = { config, pkgs, ... }:
let
grafanaPort = config.services.grafana.settings.server.http_port;
blockyPort = config.services.blocky.settings.port;
in {
networking = {
defaultGateway = "192.168.0.1";
hostName = "blocky-node";
nameservers = [];
enableIPv6 = false;
useHostResolvConf = false;
firewall = {
enable = true;
allowedTCPPorts = [ blockyPort grafanaPort ];
allowedUDPPorts = [ blockyPort ];
};
wg-quick.interfaces.wg0.configFile = "/var/secrets/${wgConf}";
};
services.blocky = {
enable = true;
settings = {
upstream.default = [ wgAddress ];
upstreamTimeout = "15s";
caching = {
minTime = "0m"; # TTL
maxTime = "12h";
cacheTimeNegative = "1m";
prefetching = true;
};
port = 53;
httpPort = "127.0.0.1:4000";
prometheus.enable = true;
queryLog.type = "console";
} // dns-mapping;
};
services.prometheus = {
enable = true;
listenAddress = "127.0.0.1";
globalConfig.scrape_interval = "15s";
globalConfig.evaluation_interval = "15s";
scrapeConfigs = [{
job_name = "blocky";
static_configs = [{
targets = [ config.services.blocky.settings.httpPort ];
}];
}];
};
services.grafana = {
enable = true;
settings = {
analytics.reporting_enabled = false;
server = rec {
domain = "${nodeAddress}:${toString grafanaPort}";
http_addr = nodeAddress;
enable_gzip = true;
};
panels.disable_sanitize_html = true;
};
provision = {
enable = true;
datasources.settings = {
datasources = [{
name = "Prometheus";
type = "prometheus";
access = "proxy";
orgId = 1;
uid = "Y4SSG429DWCGDQ3R";
url = "http://127.0.0.1:${toString config.services.prometheus.port}";
isDefault = true;
jsonData = {
graphiteVersion = "1.1";
tlsAuth = false;
tlsAuthWithCACert = false;
};
version = 1;
editable = true;
}];
};
dashboards = {
settings = {
providers = [{
name = "My Dashboards";
options.path = "/etc/grafana-dashboards";
}];
};
};
};
};
environment.etc = {
"grafana-dashboards/blocky_rev3.json" = {
source = ../../misc/grafana_blocky_rev3.json;
group = "grafana";
user = "grafana";
};
};
system.stateVersion = "23.05";
};
};
}