Portainer stalling when running behind caddy

1. The problem I’m having:

I try to run portainer in a docker container behind caddy, also in a docker container.

Accessing portainer via http://dockerhost.local:9000 or https://dockerhost.local:9443 works, so portainer should be fine.

When trying to access portainer via https://admin.lab.htl-villach.at, portainer stalls with “Portainer loading …”

Note that admin.lab.htl-villach.at is not reachable from the internet.

Accessing a NGINX instance via the same caddy works fine. Letsenrypt certs are also fine.

2. Error messages and/or full log output:

curl -vl https://admin.lab.htl-villach.at
* Rebuilt URL to: https://admin.lab.htl-villach.at/
*   Trying 172.31.32.110...
* TCP_NODELAY set
* Connected to admin.lab.htl-villach.at (172.31.32.110) port 443 (#0)
* schannel: SSL/TLS connection with admin.lab.htl-villach.at port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 195 bytes...
* schannel: sent initial handshake data: sent 195 bytes
* schannel: SSL/TLS connection with admin.lab.htl-villach.at port 443 (step 2/3)
* schannel: encrypted data got 4096
* schannel: encrypted data buffer: offset 4096 length 4096
* schannel: encrypted data length: 194
* schannel: encrypted data buffer: offset 194 length 4096
* schannel: received incomplete message, need more data
* schannel: SSL/TLS connection with admin.lab.htl-villach.at port 443 (step 2/3)
* schannel: encrypted data got 451
* schannel: encrypted data buffer: offset 645 length 4096
* schannel: sending next handshake data: sending 93 bytes...
* schannel: SSL/TLS connection with admin.lab.htl-villach.at port 443 (step 2/3)
* schannel: encrypted data got 195
* schannel: encrypted data buffer: offset 195 length 4096
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with admin.lab.htl-villach.at port 443 (step 3/3)
* schannel: stored credential handle in session cache
> GET / HTTP/1.1
> Host: admin.lab.htl-villach.at
> User-Agent: curl/7.55.1
> Accept: */*
>
* schannel: client wants to read 102400 bytes
* schannel: encdata_buffer resized 103424
* schannel: encrypted data buffer: offset 0 length 103424
* schannel: encrypted data got 19811
* schannel: encrypted data buffer: offset 19811 length 103424
* schannel: decrypted data length: 382
* schannel: decrypted data added: 382
* schannel: decrypted data cached: offset 382 length 102400
* schannel: encrypted data length: 19400
* schannel: encrypted data cached: offset 19400 length 103424
* schannel: decrypted data length: 2358
* schannel: decrypted data added: 2358
* schannel: decrypted data cached: offset 2740 length 102400
* schannel: encrypted data length: 17013
* schannel: encrypted data cached: offset 17013 length 103424
* schannel: decrypted data length: 1738
* schannel: decrypted data added: 1738
* schannel: decrypted data cached: offset 4478 length 102400
* schannel: encrypted data length: 15246
* schannel: encrypted data cached: offset 15246 length 103424
* schannel: decrypted data length: 4716
* schannel: decrypted data added: 4716
* schannel: decrypted data cached: offset 9194 length 102400
* schannel: encrypted data length: 10501
* schannel: encrypted data cached: offset 10501 length 103424
* schannel: decrypted data length: 5895
* schannel: decrypted data added: 5895
* schannel: decrypted data cached: offset 15089 length 102400
* schannel: encrypted data length: 4577
* schannel: encrypted data cached: offset 4577 length 103424
* schannel: decrypted data length: 4483
* schannel: decrypted data added: 4483
* schannel: decrypted data cached: offset 19572 length 102400
* schannel: encrypted data length: 65
* schannel: encrypted data cached: offset 65 length 103424
* schannel: decrypted data length: 2
* schannel: decrypted data added: 2
* schannel: decrypted data cached: offset 19574 length 102400
* schannel: encrypted data length: 34
* schannel: encrypted data cached: offset 34 length 103424
* schannel: decrypted data length: 5
* schannel: decrypted data added: 5
* schannel: decrypted data cached: offset 19579 length 102400
* schannel: encrypted data buffer: offset 0 length 103424
* schannel: decrypted data buffer: offset 19579 length 102400
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 19579
* schannel: decrypted data buffer: offset 0 length 102400
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Alt-Svc: h3=":443"; ma=2592000
< Cache-Control: max-age=31536000
< Connection: upgrade
< Content-Type: text/html; charset=utf-8
< Date: Mon, 20 Mar 2023 20:54:09 GMT
< Last-Modified: Thu, 23 Feb 2023 02:11:06 GMT
< Server: Caddy
< Vary: Accept-Encoding
< X-Content-Type-Options: nosniff
< X-Xss-Protection: 1; mode=block
< Transfer-Encoding: chunked
<
<!doctype html><html lang="en" ng-app="portainer" ng-strict-di data-edition="CE"><head><meta charset="utf-8"/><title>Portainer</title><meta name="description" content=""/><meta name="author" content="Portainer.io"/><meta http-equiv="cache-control" content="no-cache"/><meta http-equiv="expires" content="0"/><meta http-equiv="pragma" content="no-cache"/><base id="base"/><script>if (window.origin == 'file://') {
        // we are loading the app from a local file as in docker extension
        document.getElementById('base').href = 'http://localhost:49000/';

        window.ddExtension = true;
      } else {
        var path = window.location.pathname.replace(/^\/+|\/+$/g, '');
        var basePath = path ? '/' + path + '/' : '/';
        document.getElementById('base').href = basePath;
      }</script><!--[if lt IE 9]>
      <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]--><link rel="apple-touch-icon" sizes="180x180" href="63a301f0574f1a696ce6.png"/><link rel="icon" type="image/png" sizes="32x32" href="2dcfc527d067d4ae3424.png"/><link rel="icon" type="image/png" sizes="16x16" href="112a479c093f4729251d.png"/><link rel="mask-icon" href="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MjAiIGhlaWdodD0iNDIwIiB2aWV3Qm94PSIwIDAgMzE1LjAwMDAwMCAzMTUuMDAwMDAwIj48cGF0aCBkPSJNMTYzIDEzLjN2Ni40bC0zOC4zIDIyLjEtMzguMiAyMi4xaC0zNGMtMi44LjEtMyAuMy0zLjIgNC41LS4yIDMuNC4xIDQuNSAxLjUgNC44LjkuMiAxNiAuMyAzMy41LjIgMTcuNCAwIDMxLjcuMiAzMS44LjUuMS4zLjIgMTAuMy40IDIyLjEuMSAxMS44LjMgMjEuOC40IDIyLjIgMCAuNSA1LjUuOCAxMiAuOGgxMS45bC0uMS0yMi44LS4xLTIyLjcgMTEuMi0uMUgxNjNWMjA0bDMuNS4xYzEuOS4xIDQuMS4yIDQuNy4zIDEgLjEgMS4zLTEzLjcgMS4zLTY1LjNWNzMuN2wzLjMtLjMgMy4yLS4yLjEgNjYuNnY2Ni43bDQuOCAzLjEgNC43IDMuMnYtNjljLS4xLTM4IC4xLTY5LjMuNC02OS43LjMtLjQgMTcuMi0uNyAzNy41LS43aDM3bC4zLTQuNi4zLTQuNi04LjMtLjMtOC4zLS40LTM3LTIxLjRjLTIwLjMtMTEuOC0zNy4yLTIxLjYtMzcuNS0yMS44LS4zLS4zLS41LTIuOC0uNi01LjYtLjEtMi45LS4yLTUuOC0uMy02LjUtLjEtLjctMS43LTEuMi00LjYtMS4ySDE2M3Y2LjN6bTAgMzQuMXYxNi41aC0yOC4yYy0yOCAwLTI4LjMgMC0yNS44LTEuOSAxLjQtMSA0LjMtMi44IDYuNS00IDIuMi0xLjEgMTMuNS03LjYgMjUtMTQuNCAxMS42LTYuOSAyMS4zLTEyLjUgMjEuOC0xMi41LjQtLjEuNyA3LjMuNyAxNi4zem0yOC42LTUuNGM3LjUgNC40IDEzLjcgOCAxMy45IDggLjEgMCA0LjUgMi41IDkuNiA1LjcgNS4yIDMuMSAxMC41IDYuMiAxMS45IDYuOSAyLjEgMS4xLTIgMS4zLTI2IDEuMWwtMjguNS0uMlY0Ny4zbC0uMS0xNi4xIDIuOCAxLjRjMS41LjggOC45IDUgMTYuNCA5LjR6bS01NS40IDQwLjVjMCA0LjktLjEgOS43LS4xIDEwLjUtLjEgMS4zLTEuNSAxLjYtNy4zIDEuNWwtNy4zLS4xLS41LTEwLjUtLjUtMTAuNiA3LjguMSA3LjkuMXY5em0tMTIuMyAyMy45Yy4xIDYuNi0uMiA4LjUtMS40IDktLjguMy0xLjUuMi0xLjYtLjItLjQtMy40LS41LTE1LS4xLTE2IC4yLS42IDEtMS4yIDEuNy0xLjIuOSAwIDEuMyAyLjMgMS40IDguNHptNi43LjRjMCA0LjUtLjMgOC4yLS44IDguMi0uNCAwLTEuMS4xLTEuNS4yLS41LjItLjgtMy43LS45LTguNSAwLTcuNS4yLTguNyAxLjUtOC41IDEuMy4zIDEuNiAxLjkgMS43IDguNnptNi45IDBjLjEgNy4yLS4xIDguMi0xLjYgOC4yLTEuNiAwLTEuOC0xLTEuNy04LjUuMS03LjMuMy04LjUgMS43LTguMyAxLjMuMyAxLjYgMS44IDEuNiA4LjZ6Ii8+PHBhdGggZD0iTTYxLjkgMTA4YzAgLjMtLjEgNS43LS4yIDEybC0uMSAxMS41IDEyLjIuMyAxMi4yLjN2LTI0LjZINzRjLTYuNiAwLTEyIC4yLTEyLjEuNXptNy4xIDExLjRjMCA4LTEgMTEuMS0yLjYgOC41LS41LS45LS44LTguNi0uNS0xNS4yLjEtLjkuOC0xLjcgMS42LTEuNyAxLjIgMCAxLjUgMS42IDEuNSA4LjR6bTctLjFjMCA4LjYtLjMgOS45LTIuMyA5LjEtLjgtLjMtMS4xLTMtMS03LjcuMi0xMCAuMS05LjcgMS44LTkuNyAxLjIgMCAxLjUgMS42IDEuNSA4LjN6bTYuOC0uM2MuMyA4LjQtLjIgMTAuNy0yLjEgOS4yLS45LS43LTEuMi0zLjYtMS4xLTguOS4yLTkuMi4xLTguNiAxLjctOC4xLjguMyAxLjMgMyAxLjUgNy44ek04OS40IDEwNy45Yy0uMi4yLS40IDUuOC0uNCAxMi4zVjEzMmgyNC41bC0uMS0xMS4zYy0uMS02LjEtLjItMTEuNy0uMy0xMi4yLS4xLTEtMjIuNy0xLjUtMjMuNy0uNnptNy4yIDExLjJjLjEgOC42LS4zIDEwLTIuMiA5LjItMS0uNC0xLjQtMi41LTEuNC04LjIgMC00LjMuMy04LjEuNy04LjUgMS44LTEuOCAyLjguNyAyLjkgNy41em02LjUtNy40Yy40IDMuOS4zIDE1LjctLjIgMTYuNS0xLjcgMi43LTIuOS0uOS0yLjktOC44IDAtNi44LjMtOC40IDEuNS04LjQuOCAwIDEuNS4zIDEuNi43em03IC41Yy41IDUuNS4zIDEzLjYtLjQgMTUuMS0xLjYgMy42LTIuNy40LTIuNy03LjkgMC02LjguMy04LjQgMS41LTguNC44IDAgMS41LjYgMS42IDEuMnpNOTQuMyAxMzQuOGwtNS4zLjN2MTJjMCA4LjguMyAxMS45IDEuMyAxMiAxLjcuMSAxNS41LjEgMTkuNyAwbDMuNS0uMS0uMS0xMC44Yy0uMS01LjktLjItMTEuNC0uMy0xMi4yLS4xLTEuNS02LjItMS45LTE4LjgtMS4yem0yLjIgMTIuM2MwIDYuOC0uMyA4LjQtMS41IDguNHMtMS42LTEuNi0xLjgtNy4zYy0uNC04LjEuMS0xMC42IDIuMS05LjkuOC4yIDEuMiAyLjkgMS4yIDguOHptNi42LTcuNGMuNSA1LjkuMyAxNC42LS4yIDE1LjUtLjQuNi0xLjIuNy0xLjguNC0xLjItLjgtMS42LTE1LjgtLjQtMTYuOSAxLjItMS4yIDIuMy0uNyAyLjQgMXptNy0xYzAgLjUuMSA0LjQuMiA4LjggMCA2LjMtLjIgOC0xLjQgOC0xLjEgMC0xLjUtMS45LTEuNy04LjgtLjItNy4zIDAtOC43IDEuMy04LjcuOCAwIDEuNS4zIDEuNi43ek0xMjAgMTM0LjhsLTMuNS4zLS4xIDExLjljMCA3LjYuNCAxMiAxLjEgMTIuMSA0LjYuMyAyMS41IDAgMjIuMy0uNS41LS4zIDEtNS43IDEtMTIuMWwuMS0xMS41LTUuNy0uMWMtMy4xIDAtNy0uMS04LjctLjItMS42LS4xLTQuNi0uMS02LjUuMXptMy40IDQuOGMxIDIuNy43IDE1LjItLjUgMTUuOS0uNi40LTEuMy40LTEuNi4xLS43LS43LTEuMi0xNS43LS42LTE2LjkuNy0xLjIgMi4xLS44IDIuNy45em03LjMgNmMuMiA3LjktLjQgMTAuNy0yIDEwLjEtLjgtLjItMS4yLTMuMi0xLjMtOC4zLS4xLTguNS4xLTkuNyAxLjktOS4xLjcuMiAxLjMgMy4xIDEuNCA3LjN6bTYuOSAwYy4yIDguNS0uMyAxMC41LTIuMiA5LjctMS4xLS40LTEuNC0yLjItMS4zLTguMi4yLTguMy41LTkuNCAyLjItOC44LjguMiAxLjIgMyAxLjMgNy4zek02MS45IDEzNi43Yy0uNCA5LS4zIDIxLjYuMyAyMS45LjcuNCAxMy45LjcgMjEuMS41bDIuNy0uMXYtMjRINzRjLTEwLjcgMC0xMiAuMi0xMi4xIDEuN3pNNjkgMTQ3YzAgNS0uNCA5LS45IDktMS42IDAtMi4yLTEuNy0yLjItNy4yLS4yLTkuNiAwLTEwLjggMS42LTEwLjggMS4yIDAgMS41IDEuNyAxLjUgOXptNi44LS41Yy4zIDcuMi0uNyAxMC45LTIuNCA5LjItLjQtLjQtLjctMy41LS43LTYuOS4xLTEwLjIuMi0xMSAxLjYtMTAuNi44LjMgMS4zIDMuMSAxLjUgOC4zem03IDBjLjIgNC43LS4xIDguMi0uOCA4LjktMS44IDEuOC0yLjYtLjgtMi40LTguNi4yLTkuMy4yLTkgMS43LTguNi44LjMgMS4zIDMuMSAxLjUgOC4zek01OS40IDE2Ni43Yy0zLjEgNy4yLTQuMyAxMy42LTQgMjEuMi41IDEyLjUgNC45IDIyLjQgMTMuNyAzMS4xIDQuMSA0LjEgNS40IDQuOCA3LjIgNC4xIDEuMi0uNCAzLjktLjcgNS45LS42IDMuNi4xIDMuOC0uMSA2LjgtNi4yIDguMi0xNi43IDI5LjEtMjMuMyA0Ny42LTE1LjIgMi40IDEuMSA0LjYgMi40IDQuOSAyLjkgMi41IDQuMSA1LjQtMy4zIDUuOS0xNS4zLjQtOC0uNi0xNC0zLjUtMjAuN2wtMi4xLTVINjFsLTEuNiAzLjd6Ii8+PHBhdGggZD0iTTExOC41IDIwMi44Yy02IC45LTExIDIuOC0xNS4xIDUuNy01LjIgMy43LTExIDExLjMtMTEuOSAxNS42LS42IDIuNC0xLjIgMi45LTMuOCAzLTkuNi4yLTE3LjMgMy41LTIzLjcgMTAtNiA2LjItOC40IDEyLjEtOC42IDIwLjktLjMgMTAuMiAyLjEgMTYuNSA5LjEgMjMuNSA2LjYgNi42IDEyLjUgOSAyMiA5IDYuNyAwIDcuMS4xIDguOSAzIDIuNiA0LjIgNy4zIDguMyAxMy4xIDExLjMgNC4yIDIuMiA2LjMgMi42IDEzIDIuNiA5LjUgMCAxNi45LTIuOSAyMi44LTguOWwzLjctMy44IDYuMSAzLjNjMTMgNi45IDI5LjQgMy43IDM4LjgtNy42IDUuMy02LjUgNy4yLTExLjcgNy4zLTIwLjQuMi03LS4yLTguNi0yLjgtMTMuNy0yLjYtNS0yLjktNi40LTIuMS05LjMgMi4zLTguOS0xLjctMjIuMi04LjktMjkuNC05LjgtOS44LTIyLjgtMTEuNy0zOC4xLTUuNS0zIDEuMi0zLjQgMS4xLTUuOC0xLjQtNS4xLTUtMTcuMS05LTI0LTcuOXoiLz48L3N2Zz4=" color="#5bbad5"/><link rel="shortcut icon" href="data:image/vnd.microsoft.icon;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"/><meta name="msapplication-config" content="6d50eaeb9f128c130ed9.xml"/><meta name="theme-color" content="#ffffff"/><script defer="defer" src="runtime.3e3d5da69a6f597f1396.js"></script><script defer="defer" src="vendor.ae28ff4d1f105fcc56e1.js"></script><script defer="defer" src="main.15f004558ddbf71f405e.js"></script><link href="vendor.ada35035b3b2d76da384.css" rel="stylesheet"><link href="main.a008fa267e62ff64a95b.css" rel="stylesheet"></head><body ng-controller="MainController"><react-query-dev-tools></react-query-dev-tools><div id="page-wrapper" ng-class="{
        open: isSidebarOpen() && ['portainer.auth', 'portainer.init.admin', 'portainer.init.endpoint'].indexOf($state.current.name) === -1,
        nopadding: ['portainer.auth', 'portainer.init.admin', 'portainer.init.endpoint', 'portainer.logout'].indexOf($state.current.name) > -1 || applicationState.loading
      }" ng-cloak><div id="sideview" ui-view="sidebar" ng-if="!applicationState.loading"></div><div id="content-wrapper"><div class="page-content"><div class="page-wrapper" ng-if="applicationState.loading"><div class="container simple-box"><div class="col-md-6 col-md-offset-3 col-sm-6 col-sm-offset-3"><div class="row"><img ng-if="logo" ng-src="{{ logo }}" class="simple-box-logo"/> <img ng-if="!logo" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA5NDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA5NDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojMTNCRUY5O30NCgkuc3Qxe2ZpbGw6IzEzQkVGOTt9DQo8L3N0eWxlPg0KPGc+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSI4NC4zLDc2LjYgODAuMyw3Ni42IDgwLjMsOTcuMyA4NC4zLDk3LjMgODQuMyw3Ni42IAkiLz4NCgk8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEwMS41LDc2LjYgOTcuNSw3Ni42IDk3LjUsOTcuMyAxMDEuNSw5Ny4zIDEwMS41LDc2LjYgCSIvPg0KCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMTI1LDM3LjEgMTIwLjksMzAgNTIuNSw2OS41IDU2LjYsNzYuNiAxMjUsMzcuMSAJIi8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMjQuNiwzNy4xIDEyOC43LDMwIDE5Ny4xLDY5LjUgMTkzLDc2LjYgMTI0LjYsMzcuMSAJIi8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyMDkuMiw3Ni43IDIwOS4yLDY4LjUgMjEuOCw2OC41IDIxLjgsNzYuNyAyMDkuMiw3Ni43IAkiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTM1LDE5Mi41VjcxaDguMnYxMjcuNEMxNDEsMTk1LjksMTM4LjIsMTk0LjEsMTM1LDE5Mi41TDEzNSwxOTIuNXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTIxLDE5MC40VjE5aDguMnYxNzIuNEMxMjYuOSwxOTAuMywxMjEuMywxOTAuNCwxMjEsMTkwLjRMMTIxLDE5MC40eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00My4zLDIwNy41Yy0xMC03LjQtMTYuNi0xOS4yLTE2LjYtMzIuNmMwLTcuMSwxLjktMTQuMSw1LjQtMjAuMmg3MGMzLjYsNi4xLDUuNCwxMy4xLDUuNCwyMC4yDQoJCWMwLDYuMi0wLjgsMTItMy4zLDE3LjJjLTUuMy01LjEtMTMuMS03LjMtMjEtNy4zYy0xNCwwLTI2LDguNy0yOS4xLDIxLjdjLTEuMS0wLjEtMS44LTAuMi0yLjktMC4yDQoJCUM0OC41LDIwNi40LDQ1LjksMjA2LjgsNDMuMywyMDcuNUw0My4zLDIwNy41eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yMTkuOCwxMTUuNWMtMTAuNiwwLTE5LjksNC45LTI2LjMsMTIuNXYtMTEuNGgtMTAuNnYxMDEuM2gxMC42di00Mi43YzYuMyw3LjgsMTUuNywxMi44LDI2LjMsMTIuOA0KCQljMTkuOCwwLDM2LjEtMTYuOSwzNi4xLTM2LjRDMjU1LjksMTMxLjgsMjM5LjYsMTE1LjUsMjE5LjgsMTE1LjVMMjE5LjgsMTE1LjV6IE0yMjAuMSwxNzcuNWMtMTMuOCwwLTI2LTEyLjItMjYtMjYNCgkJYzAtMTQuMSwxMi4yLTI1LjYsMjYtMjUuNmMxNC4xLDAsMjQuNywxMS41LDI0LjcsMjUuNkMyNDQuOCwxNjUuMywyMzQuMiwxNzcuNSwyMjAuMSwxNzcuNUwyMjAuMSwxNzcuNXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMzAyLjMsMTg3LjljMTkuOCwwLDM2LjEtMTYuOSwzNi4xLTM2LjRjMC0xOS44LTE2LjMtMzYuMS0zNi4xLTM2LjFjLTE5LjgsMC0zNi4xLDE2LjMtMzYuMSwzNi4xDQoJCUMyNjYuMiwxNzEsMjgyLjUsMTg3LjksMzAyLjMsMTg3LjlMMzAyLjMsMTg3Ljl6IE0zMDIuMywxMjUuOWMxNC4xLDAsMjUsMTEuNSwyNSwyNS42YzAsMTMuOC0xMC45LDI2LTI1LDI2Yy0xNC4xLDAtMjUtMTIuMi0yNS0yNg0KCQlDMjc3LjMsMTM3LjUsMjg4LjIsMTI1LjksMzAyLjMsMTI1LjlMMzAyLjMsMTI1Ljl6Ii8+DQoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTM2NS42LDExNi42SDM1NXY2OS42aDEwLjZ2LTM4LjVjMC0xNC4yLDExLjItMjEuOCwyMy42LTIxLjh2LTEwLjRjLTkuNiwwLTE3LjksNC4xLTIzLjYsMTAuNlYxMTYuNg0KCQlMMzY1LjYsMTE2LjZ6Ii8+DQoJPHBvbHlnb24gY2xhc3M9InN0MSIgcG9pbnRzPSI0MzMuOCwxMjYuMiA0MzMuOCwxMTYuNiA0MTguMSwxMTYuNiA0MTguMSw4OS4yIDQwNy41LDg5LjIgNDA3LjUsMTE2LjYgMzk3LjEsMTE2LjYgMzk3LjEsMTI2LjIgDQoJCTQwNy41LDEyNi4yIDQwNy41LDE4Ni4yIDQxOC4xLDE4Ni4yIDQxOC4xLDEyNi4yIDQzMy44LDEyNi4yIAkiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNDc4LjYsMTg3LjljMTAuNiwwLDE5LjktNS4xLDI2LjMtMTIuOHYxMS40aDEwLjZ2LTY5LjloLTEwLjZWMTI4Yy02LjMtNy42LTE1LjctMTIuNS0yNi4zLTEyLjUNCgkJYy0xOS44LDAtMzYuMSwxNi4zLTM2LjEsMzYuMUM0NDIuNSwxNzEsNDU4LjgsMTg3LjksNDc4LjYsMTg3LjlMNDc4LjYsMTg3Ljl6IE00NzguMiwxNzcuNWMtMTQuMSwwLTI0LjctMTIuMi0yNC43LTI2DQoJCWMwLTE0LjEsMTAuNi0yNS42LDI0LjctMjUuNmMxMy44LDAsMjYsMTEuNSwyNiwyNS42QzUwNC4yLDE2NS4zLDQ5MiwxNzcuNSw0NzguMiwxNzcuNUw0NzguMiwxNzcuNXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTQzLjYsMTAyLjVjNCwwLDcuNC0zLjMsNy40LTcuNmMwLTMuOC0zLjUtNy4zLTcuNC03LjNjLTQuMywwLTcuNiwzLjUtNy42LDcuMw0KCQlDNTM2LDk5LjIsNTM5LjMsMTAyLjUsNTQzLjYsMTAyLjVMNTQzLjYsMTAyLjV6IE01MzguMiwxODYuMmgxMS4xdi02OS42aC0xMS4xVjE4Ni4yTDUzOC4yLDE4Ni4yeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik01NzEuNiwxODYuMmgxMC42di0zN2MwLTE1LjcsOC43LTIzLjYsMjIuOC0yMy4zYzExLjYsMCwxNy45LDYuOCwxNy45LDIwLjZ2MzkuN2gxMC42di0zOS43DQoJCWMwLTIyLjItOC41LTMxLTI4LjUtMzFjLTkuNSwwLTE3LjIsMy41LTIyLjgsOS41di04LjRoLTEwLjZWMTg2LjJMNTcxLjYsMTg2LjJ6Ii8+DQoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTcyMC43LDE1MS41YzAtMTkuOC0xNi4zLTM2LjEtMzYuMS0zNi4xYy0xOS44LDAtMzYuMSwxNi4zLTM2LjEsMzYuMWMwLDE5LjUsMTYuMywzNi40LDM2LjEsMzYuNA0KCQljMTQuMSwwLDI2LjYtOC4xLDMyLjQtMjAuMWgtMTMuMWMtNC40LDUuNy0xMS4yLDkuNy0xOS4zLDkuN2MtMTIuMywwLTIyLjMtOS41LTI0LjUtMjFoNjAuNkw3MjAuNywxNTEuNUw3MjAuNywxNTEuNXoNCgkJIE02ODQuNiwxMjUuOWMxMi4yLDAsMjIuMiw4LjksMjQuNSwyMC40aC00OS4xQzY2Mi40LDEzNC44LDY3Mi4zLDEyNS45LDY4NC42LDEyNS45TDY4NC42LDEyNS45eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik03NDcuOSwxMTYuNmgtMTAuNnY2OS42aDEwLjZ2LTM4LjVjMC0xNC4yLDExLjItMjEuOCwyMy42LTIxLjh2LTEwLjRjLTkuNywwLTE3LjksNC4xLTIzLjYsMTAuNlYxMTYuNg0KCQlMNzQ3LjksMTE2LjZ6Ii8+DQoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTc4Ny41LDE4N2M0LjcsMCw4LjctNCw4LjctOC45YzAtNC43LTQtOC43LTguNy04LjdjLTQuOSwwLTguOSw0LTguOSw4LjdDNzc4LjYsMTgzLDc4Mi42LDE4Nyw3ODcuNSwxODcNCgkJTDc4Ny41LDE4N3oiLz4NCgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNODIzLjUsMTAyLjVjNCwwLDcuNC0zLjMsNy40LTcuNmMwLTMuOC0zLjUtNy4zLTcuNC03LjNjLTQuMywwLTcuNiwzLjUtNy42LDcuMw0KCQlDODE2LDk5LjIsODE5LjMsMTAyLjUsODIzLjUsMTAyLjVMODIzLjUsMTAyLjV6IE04MTguMiwxODYuMmgxMS4xdi02OS42aC0xMS4xVjE4Ni4yTDgxOC4yLDE4Ni4yeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04ODIuMSwxODcuOWMxOS44LDAsMzYuMS0xNi45LDM2LjEtMzYuNGMwLTE5LjgtMTYuMy0zNi4xLTM2LjEtMzYuMWMtMTkuOCwwLTM2LjEsMTYuMy0zNi4xLDM2LjENCgkJQzg0NiwxNzEsODYyLjMsMTg3LjksODgyLjEsMTg3LjlMODgyLjEsMTg3Ljl6IE04ODIuMSwxMjUuOWMxNC4xLDAsMjUsMTEuNSwyNSwyNS42YzAsMTMuOC0xMC45LDI2LTI1LDI2Yy0xNC4xLDAtMjUtMTIuMi0yNS0yNg0KCQlDODU3LjEsMTM3LjUsODY4LDEyNS45LDg4Mi4xLDEyNS45TDg4Mi4xLDEyNS45eiIvPg0KCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNzcuNywxMDYuNSA1Ni41LDEwNi41IDU2LjUsMTI3LjggNzcuNywxMjcuOCA3Ny43LDEwNi41IAkiLz4NCgk8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjUzLjgsMTA2LjUgMzIuNiwxMDYuNSAzMi42LDEyNy44IDUzLjgsMTI3LjggNTMuOCwxMDYuNSAJIi8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSI1My44LDEzMC4yIDMyLjYsMTMwLjIgMzIuNiwxNTEuNSA1My44LDE1MS41IDUzLjgsMTMwLjIgCSIvPg0KCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNzcuNywxMzAuMiA1Ni41LDEzMC4yIDU2LjUsMTUxLjUgNzcuNywxNTEuNSA3Ny43LDEzMC4yIAkiLz4NCgk8cG9seWdvbiBjbGFzcz0ic3QwIiBwb2ludHM9IjEwMS41LDEzMC4yIDgwLjMsMTMwLjIgODAuMywxNTEuNSAxMDEuNSwxNTEuNSAxMDEuNSwxMzAuMiAJIi8+DQoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxMDEuNSw5NS4xIDgwLjMsOTUuMSA4MC4zLDExNi40IDEwMS41LDExNi40IDEwMS41LDk1LjEgCSIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik01Ny42LDIxMC43YzIuOS0xMi4zLDE0LTIxLjUsMjcuMi0yMS41YzguNSwwLDE2LjEsMy44LDIxLjMsOS44YzQuNS0zLjEsOS45LTQuOSwxNS44LTQuOQ0KCQljMTUuNCwwLDI3LjksMTIuNSwyNy45LDI3LjljMCwzLjItMC41LDYuMi0xLjUsOS4xYzMuNCw0LjYsNS41LDEwLjQsNS41LDE2LjZjMCwxNS40LTEyLjUsMjcuOS0yNy45LDI3LjljLTYuOCwwLTEzLTIuNC0xNy44LTYuNA0KCQljLTUuMSw3LjEtMTMuNCwxMS44LTIyLjgsMTEuOGMtMTAuOCwwLTIwLjItNi4yLTI0LjktMTUuMmMtMS45LDAuNC0zLjgsMC42LTUuOCwwLjZjLTE1LjQsMC0yOC0xMi41LTI4LTI3LjlzMTIuNS0yNy45LDI4LTI3LjkNCgkJQzU1LjYsMjEwLjUsNTYuNiwyMTAuNSw1Ny42LDIxMC43TDU3LjYsMjEwLjd6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==" class="simple-box-logo" alt="Portainer"/></div><div class="ml-0 mr-0 flex items-center justify-center text-center">Loading Portainer... <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="inline animate-spin-slow !ml-1"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></div></div></div></div><div id="view" ui-view="content" ng-if="!applicationState.loading"></div></div></div></div></body></html>* Connection #0 to host admin.lab.htl-villach.at left intact

3. Caddy version:

v2.6.4 h1:2hwYqiRwk1tf3VruhMpLcYTg+11fCdr8S3jhNAdnPy8=

4. How I installed and ran Caddy:

Caddy runs via docker-compose

a. System environment:

Host OS : “Ubuntu 22.04.2 LTS”
Docker version 23.0.1, build a5ee5b1

b. Command:

docker compose up -d

c. Service/unit/compose file:

Caddy
Dockerfile

FROM caddy:2.6.4-builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy:2.6.4

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

docker-compose.yml

version: "3.7"


services:
        caddy:
                image: caddy-cloudflare:2.6.4
                container_name: lab_caddy
                build: .
                restart: unless-stopped
                environment:
                  - CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
                networks:
                  - lab_nginx_net
                  - lab_portainer_net
                ports:
                  - target: 80
                    published: 80
                    protocol: tcp
      # HTTPS
                  - target: 443
                    published: 443
                    protocol: tcp
      # HTTP/3
                  - target: 443
                    published: 443
                    protocol: udp

                volumes:
                        - /root/docker-server/caddy/etc/caddy/Caddyfile:/etc/caddy/Caddyfile
                        - /root/docker-server/caddy/data:/data # Optional
                        - /root/docker-server/caddy/config:/config # Optional
                        - /var/run/docker.sock:/var/run/docker.sock

networks:
  lab_nginx_net:
    name: lab_nginx_net
  lab_portainer_net:
    name: lab_portainer_net
                                

Portainer:

version: "3"
services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: lab_portainer
    restart: unless-stopped

    networks:
      - lab_portainer_net
    ports:
      - 9443:9443
      - 9000:9000
      - 8000:8000
    volumes:
      - portainer_data:/data
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  portainer_data:


networks:
  lab_portainer_net:
    name: lab_portainer_net


d. My complete Caddy config:

{
        email Robert.Hufsky@htl-villach.at
        acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
        ## acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
        ## admin off
}

########################################################
#
#  handle these servers with a wildcard certificate
#
########################################################

*.lab.htl-villach.at {
        tls {
                dns cloudflare {env.CLOUDFLARE_API_TOKEN}
        }

        ################################################
        #
        # nginx demo server
        #
        ################################################

        @nginx host nginx.lab.htl-villach.at
        handle @nginx {
                reverse_proxy / lab_nginx:80
        }

        ################################################
        #
        # admin portainer
        #
        ################################################

        @admin host admin.lab.htl-villach.at
        handle @admin {
                reverse_proxy / https://lab_portainer:9000
        }

        # Fallback for otherwise unhandled domains
        handle {
                abort
        }
}

5. Links to relevant resources:

Unfortunately we have some known issues with chunked encoding. Could you try with v2.6.2 for now, or from the master branch? (You can build with xcaddy build master). We think the bug is fixed but it hasn’t been released yet.

You issue may also be here, remove the /. Using a / matcher means it would only proxy requests to exactly / and nothing else. Path matching is exact in Caddy.

You are right, this solved it for me:

                reverse_proxy lab_portainer:9000

I still use 2.6.4

Thanks a lot, you saved my day !!

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.