main @ 77 LINES
[ HISTORY ] [ UP ]
┌─ NIX ──────────────────────────────────────────────────────────────────────┐
│ {lib, ...}: let │
│ inherit (builtins) isBool; │
│ inherit (lib) toUpper optionalAttrs mapAttrs' nameValuePair; │
│ │
│ # convert homepage attributes to labels │
│ mkHomepageLabels = { │
│ name, │
│ domain, │
│ group, │
│ widget ? {}, │
│ ... │
│ } @ args: let │
│ # common homepage labels │
│ commonLabels = mapAttrs' (n: v: nameValuePair "homepage.${n}" (toString v)) { │
│ inherit name group; │
│ icon = "${name}.svg"; │
│ href = domain; │
│ description = args.description or name; │
│ }; │
│ │
│ # process widget attributes, flattening them into label format │
│ processWidget = attrs: │
│ mapAttrs' (n: v: │
│ nameValuePair "homepage.widget.${n}" ( │
│ if isBool v │
│ then │
│ if v │
│ then "true" │
│ else "false" │
│ else toString v │
│ )) │
│ attrs; │
│ in │
│ commonLabels // (processWidget widget); │
│ │
│ mkContainerLabel = {name, ...} @ args: let │
│ homepage = args.homepage or {}; │
│ baseWidget = homepage.widget or {}; │
│ in │
│ # traefik router labels │
│ (optionalAttrs (args ? domain) { │
│ "traefik.enable" = "true"; │
│ "traefik.http.routers.${name}.rule" = "Host(`${args.domain}`)"; │
│ "traefik.http.routers.${name}.entrypoints" = "websecure"; │
│ "traefik.http.routers.${name}.tls" = "true"; │
│ "traefik.http.routers.${name}.tls.certresolver" = "letsencrypt"; │
│ }) │
│ # traefik service labels │
│ // (optionalAttrs ((args ? domain) && (args ? port)) { │
│ "traefik.http.services.${name}.loadbalancer.server.port" = toString args.por │
│ t; │
│ }) │
│ # homepage labels │
│ // (optionalAttrs (args ? homepage) (mkHomepageLabels { │
│ inherit name; │
│ domain = "https://${args.domain}"; │
│ group = args.homepage.group or name; │
│ widget = │
│ baseWidget │
│ // { │
│ type = name; │
│ url = "https://${args.domain}"; │
│ key = "{{HOMEPAGE_FILE_${toUpper name}}}"; │
│ }; │
│ })); │
│ │
│ mkContainerEnvironment = user: group: { │
│ PUID = toString user; │
│ PGID = toString group; │
│ # TODO: I dont want to hard code this │
│ TZ = "Antarctica/Macquarie"; │
│ }; │
│ │
│ mkContainerPort = port: "${toString port}:${toString port}"; │
│ in { │
│ inherit mkContainerLabel mkContainerEnvironment mkContainerPort; │
│ } │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ NIX ────────────────────────────────┐
│ {lib, ...}: let │
│ inherit (builtins) isBool; │
│ inherit (lib) toUpper optionalAttrs mapAtt │
│ rs' nameValuePair; │
│ │
│ # convert homepage attributes to labels │
│ mkHomepageLabels = { │
│ name, │
│ domain, │
│ group, │
│ widget ? {}, │
│ ... │
│ } @ args: let │
│ # common homepage labels │
│ commonLabels = mapAttrs' (n: v: nameValu │
│ ePair "homepage.${n}" (toString v)) { │
│ inherit name group; │
│ icon = "${name}.svg"; │
│ href = domain; │
│ description = args.description or name │
│ ; │
│ }; │
│ │
│ # process widget attributes, flattening │
│ them into label format │
│ processWidget = attrs: │
│ mapAttrs' (n: v: │
│ nameValuePair "homepage.widget.${n}" │
│ ( │
│ if isBool v │
│ then │
│ if v │
│ then "true" │
│ else "false" │
│ else toString v │
│ )) │
│ attrs; │
│ in │
│ commonLabels // (processWidget widget); │
│ │
│ mkContainerLabel = {name, ...} @ args: let │
│ homepage = args.homepage or {}; │
│ baseWidget = homepage.widget or {}; │
│ in │
│ # traefik router labels │
│ (optionalAttrs (args ? domain) { │
│ "traefik.enable" = "true"; │
│ "traefik.http.routers.${name}.rule" = │
│ "Host(`${args.domain}`)"; │
│ "traefik.http.routers.${name}.entrypoi │
│ nts" = "websecure"; │
│ "traefik.http.routers.${name}.tls" = " │
│ true"; │
│ "traefik.http.routers.${name}.tls.cert │
│ resolver" = "letsencrypt"; │
│ }) │
│ # traefik service labels │
│ // (optionalAttrs ((args ? domain) && (a │
│ rgs ? port)) { │
│ "traefik.http.services.${name}.loadbal │
│ ancer.server.port" = toString args.port; │
│ }) │
│ # homepage labels │
│ // (optionalAttrs (args ? homepage) (mkH │
│ omepageLabels { │
│ inherit name; │
│ domain = "https://${args.domain}"; │
│ group = args.homepage.group or name; │
│ widget = │
│ baseWidget │
│ // { │
│ type = name; │
│ url = "https://${args.domain}"; │
│ key = "{{HOMEPAGE_FILE_${toUpper n │
│ ame}}}"; │
│ }; │
│ })); │
│ │
│ mkContainerEnvironment = user: group: { │
│ PUID = toString user; │
│ PGID = toString group; │
│ # TODO: I dont want to hard code this │
│ TZ = "Antarctica/Macquarie"; │
│ }; │
│ │
│ mkContainerPort = port: "${toString port}: │
│ ${toString port}"; │
│ in { │
│ inherit mkContainerLabel mkContainerEnviro │
│ nment mkContainerPort; │
│ } │
└──────────────────────────────────────────────┘
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET