76 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			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.port;
 | |
|     })
 | |
|     # 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;
 | |
| }
 |