133 lines
3.3 KiB
Nix
133 lines
3.3 KiB
Nix
{ config, lib, ... }:
|
|
let
|
|
unit = "dashy";
|
|
cfg = config.server.${unit};
|
|
srv = config.server;
|
|
|
|
hl = config.server;
|
|
mergedServices = hl // (hl.podman or { });
|
|
|
|
dashyCategories = [
|
|
"Arr"
|
|
"Media"
|
|
"Downloads"
|
|
"Services"
|
|
"Smart Home"
|
|
];
|
|
|
|
getServicesByCategory =
|
|
cat:
|
|
lib.attrsets.filterAttrs (name: value: (value ? category && value.category == cat)) mergedServices;
|
|
|
|
mkItems =
|
|
services:
|
|
lib.attrsets.mapAttrsToList (name: value: {
|
|
title = value.name or name;
|
|
description = value.description or "";
|
|
url =
|
|
if value ? href then
|
|
value.href
|
|
else
|
|
(if value ? url then "https://${value.url}${value.path or ""}" else "");
|
|
icon = value.icon or "";
|
|
}) services;
|
|
in
|
|
{
|
|
options.server.${unit} = {
|
|
enable = lib.mkEnableOption {
|
|
description = "Enable ${unit}";
|
|
};
|
|
|
|
misc = lib.mkOption {
|
|
default = [ ];
|
|
type = lib.types.listOf (
|
|
lib.types.attrsOf (
|
|
lib.types.submodule {
|
|
options = {
|
|
name = lib.mkOption { type = lib.types.str; };
|
|
description = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "";
|
|
};
|
|
href = lib.mkOption { type = lib.types.str; };
|
|
icon = lib.mkOption { type = lib.types.str; };
|
|
};
|
|
}
|
|
)
|
|
);
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
services.glances.enable = true;
|
|
|
|
services.${unit} = {
|
|
enable = true;
|
|
port = cfg.port or 8081;
|
|
extraOptions = [
|
|
"-p"
|
|
"${toString config.services.${unit}.port}:80"
|
|
];
|
|
|
|
settings = {
|
|
pageInfo = {
|
|
title = "${srv.domain} Homelab";
|
|
description = "Homelab made with NixOS";
|
|
navLinks = [
|
|
{
|
|
title = "GitHub";
|
|
path = "https://github.com/cnsta/cnix";
|
|
}
|
|
];
|
|
};
|
|
|
|
appConfig = {
|
|
theme = "material-dark";
|
|
layout = "auto";
|
|
iconSize = "medium";
|
|
language = "en";
|
|
statusCheck = true;
|
|
hideComponents.hideSettings = false;
|
|
};
|
|
|
|
sections =
|
|
(lib.lists.forEach dashyCategories (cat: {
|
|
name = cat;
|
|
icon = "fas fa-box"; # adjust per category
|
|
items = mkItems (getServicesByCategory cat);
|
|
}))
|
|
++ [
|
|
{
|
|
name = "Misc";
|
|
icon = "fas fa-ellipsis-h";
|
|
items = lib.lists.map (x: {
|
|
title = x.name;
|
|
description = x.description or "";
|
|
url = x.href or "";
|
|
icon = x.icon or "";
|
|
}) cfg.misc;
|
|
}
|
|
{
|
|
name = "Monitoring";
|
|
icon = "fas fa-monitor-heart-rate";
|
|
items = [
|
|
{
|
|
title = "Glances";
|
|
url = "http://localhost:${toString config.services.glances.port}";
|
|
icon = "hl-glances";
|
|
}
|
|
];
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
services.caddy.virtualHosts."${srv.domain}" = {
|
|
useACMEHost = srv.domain;
|
|
extraConfig = ''
|
|
reverse_proxy http://127.0.0.1:${toString config.services.${unit}.port}
|
|
'';
|
|
};
|
|
};
|
|
}
|