Sim, parece que estou usando um provedor S3 não suportado (OVH Object Storage)
Com uma URL de endpoint de https://s3.de.ovh.cloud.net e uma s3 cdn_url configurada para https://storage.de.ovh.cloud.net/v1/<algum-id-de-usuário-único>/<o-nome-do-bucket>
Quando URLs curtas são resolvidas, o Discourse usa a URL do endpoint para construir a URL resultante (o que falha, pois não inclui o ID de usuário OVH correto - a parte na s3 cdn_url).
Forçar URLs curtas a terem dl=1 construiria uma presigned_url funcional, o que seria bom para mim.
Eu defini essas variáveis de ambiente (específicas de S3) dentro do YAML do contêiner:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: DE
DISCOURSE_S3_ENDPOINT: https://s3.de.cloud.ovh.net
DISCOURSE_S3_ACCESS_KEY_ID: ...
DISCOURSE_S3_SECRET_ACCESS_KEY: ...
DISCOURSE_S3_CDN_URL: https://storage.de.ovh.cloud.net/v1/<algum-id-de-usuário-único>/<o-nome-do-bucket>
DISCOURSE_S3_UPLOAD_BUCKET: <o-nome-do-bucket>
DISCOURSE_S3_INSTALL_CORS_RULE: false