{ config, pkgs, ... }: let serviceName = "netbox"; servicePort = config.m3ta.ports.get serviceName; staticPort = config.m3ta.ports.get "netbox-static"; hostName = "nb.l.az-gruppe.com"; staticRoot = "${config.services.netbox.dataDir}/static"; in { services.netbox = { enable = true; package = pkgs.unstable.netbox; listenAddress = "127.0.0.1"; port = servicePort; secretKeyFile = config.age.secrets.netbox-secret-key.path; apiTokenPeppersFile = config.age.secrets.netbox-api-token-pepper.path; settings = { ALLOWED_HOSTS = [hostName "localhost" "127.0.0.1"]; SECURE_SSL_REDIRECT = true; SESSION_COOKIE_SECURE = true; CSRF_COOKIE_SECURE = true; }; extraConfig = '' SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") ''; }; services.nginx = { enable = true; virtualHosts.netbox-static = { listen = [ { addr = "127.0.0.1"; port = staticPort; } ]; locations."/static/" = { alias = "${staticRoot}/"; extraConfig = '' expires 1h; access_log off; ''; }; }; }; users.users.nginx.extraGroups = ["netbox"]; # Traefik-Routing: zwei Backends (App + Static), ein Host services.traefik.dynamicConfigOptions.http = { services = { ${serviceName}.loadBalancer.servers = [ {url = "http://127.0.0.1:${toString servicePort}/";} ]; "${serviceName}-static".loadBalancer.servers = [ {url = "http://127.0.0.1:${toString staticPort}/";} ]; }; routers = { ${serviceName} = { rule = "Host(`${hostName}`) && !PathPrefix(`/static`)"; tls.certResolver = "ionos"; service = serviceName; entrypoints = "websecure"; }; "${serviceName}-static" = { rule = "Host(`${hostName}`) && PathPrefix(`/static`)"; tls.certResolver = "ionos"; service = "${serviceName}-static"; entrypoints = "websecure"; }; }; }; }