traefik-ilias.nix (2303B)
1 { config, lib, pkgs, vars, ... }: 2 3 # OpenWRT setup for custom *.home. domain names: 4 # uci add_list dhcp.@dnsmasq[0].rebind_domain='home.minskio.co.uk' 5 # uci add_list dhcp.@dnsmasq[0].address='/home.minskio.co.uk/192.168.1.3' 6 # uci commit dhcp 7 # service dnsmasq restart 8 9 let 10 services = { 11 drink = { host = "127.0.0.1"; port = 9092; }; 12 pub = { host = "127.0.0.1"; port = 9091; }; 13 stream = { host = "127.0.0.1"; port = 8080; }; 14 weight = { host = "127.0.0.1"; port = 9090; }; 15 }; 16 17 domain = "home.${vars.user.domain}"; 18 19 mkRouter = name: _: { 20 name = name; 21 value = { 22 rule = "Host(`${name}.${domain}`)"; 23 entryPoints = [ "websecure" ]; 24 service = name; 25 tls.certResolver = "cloudflare"; 26 }; 27 }; 28 29 mkService = name: svc: { 30 name = name; 31 value.loadBalancer.servers = [{ url = "http://${svc.host}:${toString svc.port}"; }]; 32 }; 33 in 34 { 35 services.traefik = { 36 enable = true; 37 38 staticConfigOptions = { 39 # log.level = "DEBUG"; 40 entryPoints = { 41 web.address = ":80"; 42 websecure.address = ":443"; 43 }; 44 45 certificatesResolvers.cloudflare.acme = { 46 email = vars.user.email; 47 storage = "/var/lib/traefik/acme.json"; 48 dnsChallenge = { 49 provider = "cloudflare"; 50 # Query public DNS, since your dnsmasq override hides the real TXT records 51 resolvers = [ "1.1.1.1:53" "8.8.8.8:53" ]; 52 }; 53 }; 54 }; 55 56 dynamicConfigOptions.http = { 57 routers = (lib.mapAttrs' mkRouter services) // { 58 # http -> https for the named hosts 59 redirect = { 60 rule = "HostRegexp(`^.+\\.home\\.${lib.replaceStrings [ "." ] [ "\\." ] vars.user.domain}$`)"; 61 entryPoints = [ "web" ]; 62 middlewares = [ "https-redirect" ]; 63 service = "noop@internal"; 64 }; 65 # http://192.168.1.3 fallback to Stromboli 66 fallback = { 67 rule = "Host(`192.168.1.3`)"; 68 entryPoints = [ "web" ]; 69 service = "stream"; 70 }; 71 }; 72 73 middlewares.https-redirect.redirectScheme.scheme = "https"; 74 services = lib.mapAttrs' mkService services; 75 }; 76 }; 77 78 systemd.services.traefik.environment = { CF_DNS_API_TOKEN = vars.secrets.cloudflare; }; 79 80 networking.firewall.allowedTCPPorts = [ 80 443 ]; 81 }