Creo que el proxy inverso externo es la clave; no creo que esto sea solucionable en absoluto, o al menos no fácilmente, solo desde dentro del contenedor Docker.
Lo he resuelto ahora configurando que el contenedor Docker de Discourse escuche en un socket Unix y lo frontee con Caddy en la misma máquina (fuera de Docker). La configuración de Caddy es trivial, incluye Let’s Encrypt, y ahora funciona como se espera también para IPv6.
forum.example.com {
proxy / unix:/var/discourse/shared/web-only/nginx.http.sock {
transparent
websocket
}
}