{ config, lib, ... }: let inherit (import ../mk-container.nix {inherit lib config;}) mkContainer; domain = config.var.domain; hostIp = "10.233.12.1"; # Convert 6-char hex color to "H S L" string for glance (integers, no % sign) hexToGlanceHsl = hex: let h = lib.toLower hex; d = c: if c == "a" then 10 else if c == "b" then 11 else if c == "c" then 12 else if c == "d" then 13 else if c == "e" then 14 else if c == "f" then 15 else lib.toInt c; byte = pos: d (builtins.substring pos 1 h) * 16 + d (builtins.substring (pos + 1) 1 h); ri = byte 0; gi = byte 2; bi = byte 4; r = ri * 1.0 / 255.0; g = gi * 1.0 / 255.0; b = bi * 1.0 / 255.0; mx = if r >= g && r >= b then "r" else if g >= b then "g" else "b"; mn = if r <= g && r <= b then "r" else if g <= b then "g" else "b"; cmax = if mx == "r" then r else if mx == "g" then g else b; cmin = if mn == "r" then r else if mn == "g" then g else b; delta = cmax - cmin; l = (cmax + cmin) / 2.0; s = if delta < 0.0001 then 0.0 else if l <= 0.5 then delta / (cmax + cmin) else delta / (2.0 - cmax - cmin); hue = if delta < 0.0001 then 0.0 else if mx == "r" then let raw = 60.0 * (g - b) / delta; in if raw < 0.0 then raw + 360.0 else raw else if mx == "g" then 60.0 * ((b - r) / delta + 2.0) else 60.0 * ((r - g) / delta + 4.0); in "${toString (builtins.floor (hue + 0.5))} ${toString (builtins.floor (s * 100.0 + 0.5))} ${ toString (builtins.floor (l * 100.0 + 0.5)) }"; c = config.stylix.base16Scheme; in { # 0444 so the glance user inside the container can read the bind-mounted file sops.secrets.adguard-pwd.mode = "0444"; imports = [ (mkContainer { name = "glance"; hostIp = hostIp; containerIp = "10.233.12.2"; internet = true; bindMounts."/run/secrets/adguard-pwd" = { hostPath = config.sops.secrets.adguard-pwd.path; isReadOnly = true; }; nixosConfig = {lib, ...}: { _module.args.domain = domain; _module.args.adguardUrl = "http://${hostIp}:3000"; imports = [ ./home.nix ./server.nix ]; services.glance = { enable = true; settings = { server = { port = 5678; host = "127.0.0.1"; }; theme = { light = false; background-color = hexToGlanceHsl c.base00; # background primary-color = hexToGlanceHsl c.base0D; # accent (iris/purple) positive-color = hexToGlanceHsl c.base0B; # positive (pine/teal) negative-color = hexToGlanceHsl c.base08; # negative (love/rose) }; }; }; services.nginx = { enable = true; appendHttpConfig = '' proxy_cache_path /var/cache/nginx/glance levels=1:2 keys_zone=glance:1m inactive=30m max_size=100m; ''; virtualHosts."glance" = { listen = [ { addr = "0.0.0.0"; port = 8080; } ]; locations."/" = { proxyPass = "http://127.0.0.1:5678"; extraConfig = '' proxy_cache glance; proxy_cache_valid 200 30m; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; add_header X-Cache-Status $upstream_cache_status; ''; }; }; }; networking.firewall.allowedTCPPorts = [8080]; system.stateVersion = "24.05"; }; }) ]; services.cloudflared.tunnels."${config.var.tunnelId}".ingress."home.${domain}" = "http://10.233.12.2:8080"; }