This is the relevant bit in the logs:
{"level":"debug","ts":1661534774.9021204,"logger":"http.handlers.reverse_proxy","msg":"upstream roundtrip","upstream":"10.42.1.11:443","duration":0.131407508,"request":{"remote_ip":"10.42.13.15","remote_port":"60777","proto":"HTTP/1.1","method":"GET","host":"ipmi.m.wd.ktz.me","uri":"/kvm","headers":{"Cookie":[],"Sec-Websocket-Protocol":["binary, base64"],"Pragma":["no-cache"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"],"X-Forwarded-For":["10.42.13.15"],"X-Forwarded-Proto":["https"],"X-Forwarded-Host":["ipmi.m.wd.ktz.me"],"Origin":["https://ipmi.m.wd.ktz.me"],"Sec-Websocket-Extensions":["permessage-deflate; client_max_window_bits"],"Connection":["Upgrade"],"Upgrade":["websocket"],"Accept-Language":["en-US,en-GB;q=0.9,en;q=0.8"],"Sec-Websocket-Version":["13"],"Cache-Control":["no-cache"],"Accept-Encoding":["gzip, deflate, br"],"Sec-Websocket-Key":["roNAoZAleIiMqX9VCLaWiw=="]},"tls":{"resumed":true,"version":772,"cipher_suite":4867,"proto":"http/1.1","server_name":"ipmi.m.wd.ktz.me"}},"headers":{"Server":["lighttpd"],"X-Frame-Options":["SAMEORIGIN"],"X-Content-Type-Options":["nosniff"],"Content-Length":["607"],"Etag":["\"3577637142\""],"Date":["Fri, 26 Aug 2022 17:26:13 GMT"],"Cache-Control":["no-store, no-cache, must-revalidate, private"],"Pragma":["no-cache"],"Accept-Ranges":["bytes"],"Last-Modified":["Thu, 01 Jan 1970 00:00:00 GMT"],"Content-Encoding":["gzip"],"X-Xss-Protection":["1; mode=block"],"Content-Type":["text/html"]},"status":200}
Caddy proxies the request successfully, but lighttpd seems to not properly handle it, and just returns some HTML instead.
Maybe try making the same request with curl -v
(with the same headers, your browser should let you copy the request as a curl request if you right-click on the websocket request in the network tab) and see what it actually writes back. There might be an error message in there that could help.