homelab/modules/homelab/default.nix
plasmagoat ce8c543e84
Some checks failed
Test / tests (push) Has been cancelled
/ OpenTofu (push) Has been cancelled
auto docs
2025-07-29 16:28:17 +02:00

129 lines
3.7 KiB
Nix

{
config,
lib,
nodes,
...
}:
with lib; let
cfg = config.homelab;
in {
imports = [
./lib/systems/monitoring.nix
./lib/systems/logging.nix
./lib/systems/proxy.nix
./lib/systems/backups.nix
./lib/cli/homelab-cli.nix
./services
./motd
];
options.homelab = {
enable = mkEnableOption "Homelab fleet configuration";
hostname = mkOption {
type = types.str;
description = "Hostname for this system";
};
domain = mkOption {
type = types.str;
default = "lab";
description = "Base domain for the homelab";
};
externalDomain = mkOption {
type = types.str;
default = "procopius.dk";
description = "External doamin to the homelab";
};
environment = mkOption {
type = types.enum ["production" "staging" "development"];
default = "production";
description = "Environment type";
};
location = mkOption {
type = types.str;
default = "homelab";
description = "Physical location identifier";
};
tags = mkOption {
type = types.listOf types.str;
default = [];
description = "Tags for this system";
};
};
config = mkIf cfg.enable {
# Set hostname
networking.hostName = cfg.hostname;
# Export configuration for external consumption
# environment.etc."homelab/config.json".text = builtins.toJSON {
# inherit (cfg) hostname domain environment location tags;
# monitoring = {
# # Metrics endpoints (Prometheus, etc.)
# metrics =
# map (endpoint: {
# inherit (endpoint) name host port path jobName scrapeInterval labels;
# url = "http://${endpoint.host}:${toString endpoint.port}${endpoint.path}";
# })
# cfg.global.monitoring.allMetrics or [];
# # Health check endpoints
# healthChecks =
# map (check: let
# # Determine the host based on useExternalDomain
# actualHost =
# if check.useExternalDomain
# then "${check.subdomain}.${cfg.externalDomain}"
# else check.host;
# # Build the URL
# portPart =
# if check.port != null
# then ":${toString check.port}"
# else "";
# url = "${check.protocol}://${actualHost}${portPart}${check.path}";
# in {
# inherit (check) name protocol method interval timeout conditions alerts group labels enabled;
# host = actualHost;
# port = check.port;
# path = check.path;
# url = url;
# useExternalDomain = check.useExternalDomain;
# subdomain = check.subdomain;
# sourceNode = cfg.hostname;
# })
# cfg.global.monitoring.allHealthChecks or [];
# };
# reverseProxy = {
# entries =
# map (entry: {
# inherit (entry) subdomain host port path enableAuth enableSSL;
# internalHost = "${cfg.hostname}:${toString entry.port}${entry.path}";
# externalHost = "${entry.subdomain}.${cfg.externalDomain}";
# })
# cfg.global.reverseProxy.all;
# };
# backups = {
# jobs =
# map (job: {
# inherit (job) name backend labels;
# backupId = job._backupId;
# sourceNode = job._sourceNode;
# })
# cfg.global.backups.all;
# backends = cfg.global.backups.allBackends;
# summary = {
# totalJobs = length cfg.global.backups.all;
# jobsByBackend = mapAttrs (backend: jobs: length jobs) cfg.global.backups.byBackend;
# jobsByNode = mapAttrs (node: jobs: length jobs) cfg.global.backups.byNode;
# };
# };
# };
};
}