Я думаю, что ключевым моментом является внешний обратный прокси — я не считаю, что эту проблему можно решить вообще, или хотя бы легко, только внутри Docker-контейнера.
Я решил её, настроив Discourse в Docker для прослушивания Unix-сокета и разместив перед ним Caddy на той же машине (вне Docker). Настройка Caddy тривиальна, включает Let’s Encrypt, и теперь всё работает как ожидалось, в том числе для IPv6.
forum.example.com {
proxy / unix:/var/discourse/shared/web-only/nginx.http.sock {
transparent
websocket
}
}