The app service was missing DISCOURSE_REDIS_HOST entirely, so the
bitnami image defaulted to the bare hostname 'redis', which does not
resolve when the service is attached to multiple overlay networks
(proxy + internal) — causing a restart loop.
sidekiq had the same problem worse: both DISCOURSE_DATABASE_HOST=db
and DISCOURSE_REDIS_HOST=redis used bare hostnames instead of the
stack-prefixed service names. On a swarm stack the reliable DNS name
is ${STACK_NAME}_db / ${STACK_NAME}_redis.