STUN Problems with jitsi (using docker) in intranet

Hi, (this is my first post)

Thank you all for your awesome work! I am trying to setup a Jitsi server in an intranet using docker-compose from docker-jitsi-meet. I read about problems here and here. However, I am still having trouble with STUN. In one instance, jitsi ran until a second person joined the call, then continued for about two seconds and afterwards crashed. Below is my configuration. Please note, that I changed the docker-networks subnet to not collide with the subnet of my university. I left the other files as they are, though there are suggestions in the threads above to change them, especially jvb/rootfs/defaults/sip-communicator.properties.

.envs:
` #
# Basic configuration options
#

# Directory where all configuration will be stored.
CONFIG=~/.jitsi-meet-cfg

# Exposed HTTP port.
HTTP_PORT=8000

# Exposed HTTPS port.
HTTPS_PORT=8443

# System time zone.
TZ=Europe/Amsterdam

# Public URL for the web service.
PUBLIC_URL="https://172.22.187.31"

# IP address of the Docker host. See the "Running on a LAN environment" section
# in the README.
DOCKER_HOST_ADDRESS=172.22.187.31


#
# Let's Encrypt configuration
#

# Enable Let's Encrypt certificate generation.
#ENABLE_LETSENCRYPT=1

# Domain for which to generate the certificate.
#LETSENCRYPT_DOMAIN=meet.example.com

# E-Mail for receiving important account notifications (mandatory).
#LETSENCRYPT_EMAIL=alice@atlanta.net


#
# Etherpad integration (for document sharing)
#

# Set etherpad-lite URL (uncomment to enable).
#ETHERPAD_URL_BASE=http://etherpad.meet.jitsi:9001


#
# Basic Jigasi configuration options (needed for SIP gateway support)
#

# SIP URI for incoming / outgoing calls.
#JIGASI_SIP_URI=test@sip2sip.info

# Password for the specified SIP account as a clear text
#JIGASI_SIP_PASSWORD=passw0rd

# SIP server (use the SIP account domain if in doubt).
#JIGASI_SIP_SERVER=sip2sip.info

# SIP server port
#JIGASI_SIP_PORT=5060

# SIP server transport
#JIGASI_SIP_TRANSPORT=UDP

#
# Authentication configuration (see README for details)
#

# Enable authentication.
#ENABLE_AUTH=1

# Enable guest access.
#ENABLE_GUESTS=1

# Select authentication type: internal, jwt or ldap
#AUTH_TYPE=internal

# JWT auuthentication
#

# Application identifier.
#JWT_APP_ID=my_jitsi_app_id

# Application secret known only to your token.
#JWT_APP_SECRET=my_jitsi_app_secret

# (Optional) Set asap_accepted_issuers as a comma separated list.
#JWT_ACCEPTED_ISSUERS=my_web_client,my_app_client

# (Optional) Set asap_accepted_audiences as a comma separated list.
#JWT_ACCEPTED_AUDIENCES=my_server1,my_server2


# LDAP authentication (for more information see the Cyrus SASL saslauthd.conf man page)
#

# LDAP url for connection.
#LDAP_URL=ldaps://ldap.domain.com/

# LDAP base DN. Can be empty
#LDAP_BASE=DC=example,DC=domain,DC=com

# LDAP user DN. Do not specify this parameter for the anonymous bind.
#LDAP_BINDDN=CN=binduser,OU=users,DC=example,DC=domain,DC=com

# LDAP user password. Do not specify this parameter for the anonymous bind.
#LDAP_BINDPW=LdapUserPassw0rd

# LDAP filter. Tokens example:
# %1-9 - if the input key is user@mail.domain.com, then %1 is com, %2 is domain and %3 is mail.
# %s - %s is replaced by the complete service string.
# %r - %r is replaced by the complete realm string.
#LDAP_FILTER=(sAMAccountName=%u)

# LDAP authentication method
#LDAP_AUTH_METHOD=bind

# LDAP version
#LDAP_VERSION=3

# LDAP TLS using
#LDAP_USE_TLS=1

# List of SSL/TLS ciphers to allow.
#LDAP_TLS_CIPHERS=SECURE256:SECURE128:!AES-128-CBC:!ARCFOUR-128:!CAMELLIA-128-CBC:!3DES-CBC:!CAMELLIA-128-CBC

# Require and verify server certificate
#LDAP_TLS_CHECK_PEER=1

# Path to CA cert file. Used when server sertificate verify is enabled.
#LDAP_TLS_CACERT_FILE=/etc/ssl/certs/ca-certificates.crt

# Path to CA certs directory. Used when server sertificate verify is enabled.
#LDAP_TLS_CACERT_DIR=/etc/ssl/certs

# Wether to use starttls, implies LDAPv3 and requires ldap:// instead of ldaps://
# LDAP_START_TLS=1


#
# Advanced configuration options (you generally don't need to change these)
#

# Internal XMPP domain.
XMPP_DOMAIN=meet.jitsi

# Internal XMPP server
XMPP_SERVER=xmpp.meet.jitsi

# Internal XMPP server URL
XMPP_BOSH_URL_BASE=http://xmpp.meet.jitsi:5280

# Internal XMPP domain for authenticated services.
XMPP_AUTH_DOMAIN=auth.meet.jitsi

# XMPP domain for the MUC.
XMPP_MUC_DOMAIN=muc.meet.jitsi

# XMPP domain for the internal MUC used for jibri, jigasi and jvb pools.
XMPP_INTERNAL_MUC_DOMAIN=internal-muc.meet.jitsi

# XMPP domain for unauthenticated users.
XMPP_GUEST_DOMAIN=guest.meet.jitsi

# Custom Prosody modules for XMPP_DOMAIN (comma separated)
XMPP_MODULES=

# Custom Prosody modules for MUC component (comma separated)
XMPP_MUC_MODULES=

# Custom Prosody modules for internal MUC component (comma separated)
XMPP_INTERNAL_MUC_MODULES=

# MUC for the JVB pool.
JVB_BREWERY_MUC=jvbbrewery

# XMPP user for JVB client connections.
JVB_AUTH_USER=jvb

# XMPP password for JVB client connections.
JVB_AUTH_PASSWORD=passw0rd

# STUN servers used to discover the server's public IP.
# JVB_STUN_SERVERS=

# Media port for the Jitsi Videobridge
JVB_PORT=10000

# TCP Fallback for Jitsi Videobridge for when UDP isn't available
JVB_TCP_HARVESTER_DISABLED=true
JVB_TCP_PORT=4443

# A comma separated list of APIs to enable when the JVB is started. The default is none.
# See https://github.com/jitsi/jitsi-videobridge/blob/master/doc/rest.md for more information
JVB_ENABLE_APIS=rest,colibri

# XMPP component password for Jicofo.
JICOFO_COMPONENT_SECRET=s3cr37

# XMPP user for Jicofo client connections. NOTE: this option doesn't currently work due to a bug.
JICOFO_AUTH_USER=focus

# XMPP password for Jicofo client connections.
JICOFO_AUTH_PASSWORD=passw0rd

# Base URL of Jicofo's reservation REST API
#JICOFO_RESERVATION_REST_BASE_URL=http://reservation.example.com

# XMPP user for Jigasi MUC client connections.
JIGASI_XMPP_USER=jigasi

# XMPP password for Jigasi MUC client connections.
JIGASI_XMPP_PASSWORD=passw0rd

# MUC name for the Jigasi pool.
JIGASI_BREWERY_MUC=jigasibrewery

# Minimum port for media used by Jigasi.
JIGASI_PORT_MIN=20000

# Maximum port for media used by Jigasi.
JIGASI_PORT_MAX=20050

# Enable SDES srtp
#JIGASI_ENABLE_SDES_SRTP=1

# Keepalive method
#JIGASI_SIP_KEEP_ALIVE_METHOD=OPTIONS

# Health-check extension
#JIGASI_HEALTH_CHECK_SIP_URI=keepalive

# Health-check interval
#JIGASI_HEALTH_CHECK_INTERVAL=300000
#
# Enable Jigasi transcription.
#ENABLE_TRANSCRIPTIONS=1

# Jigasi will recordord an audio when transcriber is on. Default false.
#JIGASI_TRANSCRIBER_RECORD_AUDIO=true

# Jigasi will send transcribed text to the chat when transcriber is on. Default false.
#JIGASI_TRANSCRIBER_SEND_TXT=true

# Jigasi post to the chat an url with transcription file. Default false.
#JIGASI_TRANSCRIBER_ADVERTISE_URL=true

# Credentials for connect to Cloud Google API from Jigasi. Path located inside the container.
# Please read https://cloud.google.com/text-to-speech/docs/quickstart-protocol
# section "Before you begin" from 1 to 5 paragraph. Copy the key on
# the docker host to ${CONFIG}/jigasi/key.json and to enable this setting:
#GOOGLE_APPLICATION_CREDENTIALS=/config/key.json

# Enable recording
#ENABLE_RECORDING=1

# XMPP domain for the jibri recorder
XMPP_RECORDER_DOMAIN=recorder.meet.jitsi

# XMPP recorder user for Jibri client connections.
JIBRI_RECORDER_USER=recorder

# XMPP recorder password for Jibri client connections.
JIBRI_RECORDER_PASSWORD=passw0rd

# Directory for recordings inside Jibri container.
JIBRI_RECORDING_DIR=/config/recordings

# The finalizing script. Will run after recording is complete.
JIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.sh

# XMPP user for Jibri client connections.
JIBRI_XMPP_USER=jibri

# XMPP password for Jibri client connections.
JIBRI_XMPP_PASSWORD=passw0rd

# MUC name for the Jibri pool.
JIBRI_BREWERY_MUC=jibribrewery

# MUC connection timeout
JIBRI_PENDING_TIMEOUT=90

# When jibri gets a request to start a service for a room, the room
# jid will look like: roomName@optional.prefixes.subdomain.xmpp_domain
# We'll build the url for the call by transforming that into:
# https://xmpp_domain/subdomain/roomName
# So if there are any prefixes in the jid (like jitsi meet, which
# has its participants join a muc at conference.xmpp_domain) then
# list that prefix here so it can be stripped out to generate
# the call url correctly.
JIBRI_STRIP_DOMAIN_JID=muc

# Directory for logs inside Jibri container.
JIBRI_LOGS_DIR=/config/logs

# Disable HTTPS. This can be useful if TLS connections are going to be handled outside of this setup.
#DISABLE_HTTPS=1

# Redirects HTTP traffic to HTTPS. Only works with the standard HTTPS port (443).
#ENABLE_HTTP_REDIRECT=1

`

docker-compose.yml

` version: ‘3’

services:
    # Frontend
    web:
        image: jitsi/web
        ports:
            - '${HTTP_PORT}:80'
            - '${HTTPS_PORT}:443'
        volumes:
            - ${CONFIG}/web:/config
            - ${CONFIG}/web/letsencrypt:/etc/letsencrypt
            - ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts
        environment:
            - ENABLE_AUTH
            - ENABLE_GUESTS
            - ENABLE_LETSENCRYPT
            - ENABLE_HTTP_REDIRECT
            - ENABLE_TRANSCRIPTIONS
            - DISABLE_HTTPS
            - JICOFO_AUTH_USER
            - LETSENCRYPT_DOMAIN
            - LETSENCRYPT_EMAIL
            - PUBLIC_URL
            - XMPP_DOMAIN
            - XMPP_AUTH_DOMAIN
            - XMPP_BOSH_URL_BASE
            - XMPP_GUEST_DOMAIN
            - XMPP_MUC_DOMAIN
            - XMPP_RECORDER_DOMAIN
            - ETHERPAD_URL_BASE
            - TZ
            - JIBRI_BREWERY_MUC
            - JIBRI_PENDING_TIMEOUT
            - JIBRI_XMPP_USER
            - JIBRI_XMPP_PASSWORD
            - JIBRI_RECORDER_USER
            - JIBRI_RECORDER_PASSWORD
            - ENABLE_RECORDING
        networks:
            meet.jitsi:
                aliases:
                    - ${XMPP_DOMAIN}

    # XMPP server
    prosody:
        image: jitsi/prosody
        expose:
            - '5222'
            - '5347'
            - '5280'
        volumes:
            - ${CONFIG}/prosody:/config
        environment:
            - AUTH_TYPE
            - ENABLE_AUTH
            - ENABLE_GUESTS
            - GLOBAL_MODULES
            - GLOBAL_CONFIG
            - LDAP_URL
            - LDAP_BASE
            - LDAP_BINDDN
            - LDAP_BINDPW
            - LDAP_FILTER
            - LDAP_AUTH_METHOD
            - LDAP_VERSION
            - LDAP_USE_TLS
            - LDAP_TLS_CIPHERS
            - LDAP_TLS_CHECK_PEER
            - LDAP_TLS_CACERT_FILE
            - LDAP_TLS_CACERT_DIR
            - LDAP_START_TLS
            - XMPP_DOMAIN
            - XMPP_AUTH_DOMAIN
            - XMPP_GUEST_DOMAIN
            - XMPP_MUC_DOMAIN
            - XMPP_INTERNAL_MUC_DOMAIN
            - XMPP_MODULES
            - XMPP_MUC_MODULES
            - XMPP_INTERNAL_MUC_MODULES
            - XMPP_RECORDER_DOMAIN
            - JICOFO_COMPONENT_SECRET
            - JICOFO_AUTH_USER
            - JICOFO_AUTH_PASSWORD
            - JVB_AUTH_USER
            - JVB_AUTH_PASSWORD
            - JIGASI_XMPP_USER
            - JIGASI_XMPP_PASSWORD
            - JIBRI_XMPP_USER
            - JIBRI_XMPP_PASSWORD
            - JIBRI_RECORDER_USER
            - JIBRI_RECORDER_PASSWORD
            - JWT_APP_ID
            - JWT_APP_SECRET
            - JWT_ACCEPTED_ISSUERS
            - JWT_ACCEPTED_AUDIENCES
            - JWT_ASAP_KEYSERVER
            - JWT_ALLOW_EMPTY
            - JWT_AUTH_TYPE
            - JWT_TOKEN_AUTH_MODULE
            - LOG_LEVEL
            - TZ
        networks:
            meet.jitsi:
                aliases:
                    - ${XMPP_SERVER}

    # Focus component
    jicofo:
        image: jitsi/jicofo
        volumes:
            - ${CONFIG}/jicofo:/config
        environment:
            - ENABLE_AUTH
            - XMPP_DOMAIN
            - XMPP_AUTH_DOMAIN
            - XMPP_INTERNAL_MUC_DOMAIN
            - XMPP_SERVER
            - JICOFO_COMPONENT_SECRET
            - JICOFO_AUTH_USER
            - JICOFO_AUTH_PASSWORD
            - JICOFO_RESERVATION_REST_BASE_URL
            - JVB_BREWERY_MUC
            - JIGASI_BREWERY_MUC
            - JIBRI_BREWERY_MUC
            - JIBRI_PENDING_TIMEOUT
            - TZ
        depends_on:
            - prosody
        networks:
            meet.jitsi:

    # Video bridge
    jvb:
        image: jitsi/jvb
        ports:
            - '${JVB_PORT}:${JVB_PORT}/udp'
            - '${JVB_TCP_PORT}:${JVB_TCP_PORT}'
        volumes:
            - ${CONFIG}/jvb:/config
        environment:
            - DOCKER_HOST_ADDRESS
            - XMPP_AUTH_DOMAIN
            - XMPP_INTERNAL_MUC_DOMAIN
            - XMPP_SERVER
            - JVB_AUTH_USER
            - JVB_AUTH_PASSWORD
            - JVB_BREWERY_MUC
            - JVB_PORT
            - JVB_TCP_HARVESTER_DISABLED
            - JVB_TCP_PORT
            - JVB_STUN_SERVERS
            - JVB_ENABLE_APIS
            - TZ
        depends_on:
            - prosody
        networks:
            meet.jitsi:

# Custom network so all services can communicate using a FQDN
networks:
    meet.jitsi:
    ipam:
        driver: default
        config:
        - subnet: "10.18.0.0/24"

`

first extract from docker-compose logs -f
jvb_1 | java.lang.Exception: No health checks performed recently, the last result was 1584467175825ms ago. jvb_1 | at org.jitsi.videobridge.health.Health.check(Health.java:552) jvb_1 | at org.jitsi.videobridge.Videobridge.healthCheck(Videobridge.java:1253) jvb_1 | at org.jitsi.videobridge.Videobridge.handleHealthCheckIQ(Videobridge.java:1221) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQRequest(XmppCommon.java:197) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQInternal(XmppCommon.java:151) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQ(XmppCommon.java:122) jvb_1 | at org.jitsi.videobridge.xmpp.ClientConnectionImpl.handleIq(ClientConnectionImpl.java:122) jvb_1 | at org.jitsi.xmpp.mucclient.IQListener.handleIq(IQListener.java:50) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient.handleIq(MucClient.java:436) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient.access$500(MucClient.java:47) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient$2.handleIQRequest(MucClient.java:412) jvb_1 | at org.jivesoftware.smack.AbstractXMPPConnection$4.run(AbstractXMPPConnection.java:1188) jvb_1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) jvb_1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) jvb_1 | at java.lang.Thread.run(Thread.java:748)

second extract
jvb_1 | JVB 2020-03-17 19:03:00.981 INFO: [25] org.jitsi.xmpp.mucclient.MucClientManager.log() Setting a presence extension: org.jitsi.xmpp.extensions.colibri.ColibriStatsExtension@31332dea jicofo_1 | Jicofo 2020-03-17 19:03:00.984 INFO: [37] org.jitsi.jicofo.Bridge.log() Video stream count for: jvb@auth.meet.jitsi/kx-H5Hsj: 4 jicofo_1 | Jicofo 2020-03-17 19:03:00.984 INFO: [37] org.jitsi.jicofo.Bridge.log() Reset video stream diff on jvb@auth.meet.jitsi/kx-H5Hsj video streams: 4 (estimation error: -1) jvb_1 | java.lang.Exception: java.lang.Exception: Address discovery through STUN failed jvb_1 | at org.jitsi.videobridge.health.Health.check(Health.java:559) jvb_1 | at org.jitsi.videobridge.Videobridge.healthCheck(Videobridge.java:1253) jvb_1 | at org.jitsi.videobridge.Videobridge.handleHealthCheckIQ(Videobridge.java:1221) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQRequest(XmppCommon.java:197) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQInternal(XmppCommon.java:151) jvb_1 | at org.jitsi.videobridge.xmpp.XmppCommon.handleIQ(XmppCommon.java:122) jvb_1 | at org.jitsi.videobridge.xmpp.ClientConnectionImpl.handleIq(ClientConnectionImpl.java:122) jvb_1 | at org.jitsi.xmpp.mucclient.IQListener.handleIq(IQListener.java:50) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient.handleIq(MucClient.java:436) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient.access$500(MucClient.java:47) jvb_1 | at org.jitsi.xmpp.mucclient.MucClient$2.handleIQRequest(MucClient.java:412) jvb_1 | at org.jivesoftware.smack.AbstractXMPPConnection$4.run(AbstractXMPPConnection.java:1188) jvb_1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) jvb_1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) jvb_1 | at java.lang.Thread.run(Thread.java:748) jvb_1 | Caused by: java.lang.Exception: Address discovery through STUN failed jvb_1 | at org.jitsi.videobridge.health.Health.doCheck(Health.java:217) jicofo_1 | Jicofo 2020-03-17 19:03:00.987 WARNING: [76] org.jitsi.jicofo.JvbDoctor.log() Health check failed on: jvb@auth.meet.jitsi/kx-H5Hsj error: <error type='cancel'><internal-server-error xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' xml:lang='en'>java.lang.Exception: Address discovery through STUN failed</text></error> jvb_1 | at org.jitsi.videobridge.health.Health.doRun(Health.java:495) jvb_1 | at org.jitsi.utils.concurrent.PeriodicRunnableWithObject.run(PeriodicRunnableWithObject.java:87) jvb_1 | at org.jitsi.utils.concurrent.RecurringRunnableExecutor.run(RecurringRunnableExecutor.java:216) jvb_1 | at org.jitsi.utils.concurrent.RecurringRunnableExecutor.runInThread(RecurringRunnableExecutor.java:292) jvb_1 | at org.jitsi.utils.concurrent.RecurringRunnableExecutor.access$000(RecurringRunnableExecutor.java:36) jvb_1 | at org.jitsi.utils.concurrent.RecurringRunnableExecutor$1.run(RecurringRunnableExecutor.java:328) jicofo_1 | Jicofo 2020-03-17 19:03:00.989 INFO: [45] org.jitsi.jicofo.BridgeSelector.log() Removing JVB: jvb@auth.meet.jitsi/kx-H5Hsj jicofo_1 | Jicofo 2020-03-17 19:03:00.989 SEVERE: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() One of our bridges failed: jvb@auth.meet.jitsi/kx-H5Hsj jicofo_1 | Jicofo 2020-03-17 19:03:00.989 INFO: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Region info, conference=ffaa6a octo_enabled= false: [[null, null]] jicofo_1 | Jicofo 2020-03-17 19:03:00.989 INFO: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Expiring channels for: kamaro@muc.meet.jitsi/7e17ce14 on: Bridge[jid=jvb@auth.meet.jitsi/kx-H5Hsj, relayId=null, region=null] jicofo_1 | Jicofo 2020-03-17 19:03:00.990 INFO: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Region info, conference=ffaa6a octo_enabled= false: [[null]] jicofo_1 | Jicofo 2020-03-17 19:03:00.990 INFO: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Expiring channels for: kamaro@muc.meet.jitsi/f14233fc on: Bridge[jid=jvb@auth.meet.jitsi/kx-H5Hsj, relayId=null, region=null] jvb_1 | JVB 2020-03-17 19:03:00.992 INFO: [75] net.sf.fmj.media.Log.info() Stopping RTPSourceStream. jicofo_1 | Jicofo 2020-03-17 19:03:00.993 SEVERE: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Can not invite participant -- no bridge available. jicofo_1 | Jicofo 2020-03-17 19:03:00.993 SEVERE: [45] org.jitsi.jicofo.JitsiMeetConferenceImpl.log() Can not invite participant -- no bridge available. web_1 | 172.22.187.134 - - [17/Mar/2020:19:03:00 +0100] "POST /http-bind?room=kamaro HTTP/1.1" 200 1028 "https://172.22.187.31:8443/Kamaro" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0" web_1 | 172.17.114.42 - - [17/Mar/2020:19:03:00 +0100] "POST /http-bind?room=kamaro HTTP/1.1" 200 1028 "https://172.22.187.31:8443/KAmaro" "Mozilla/5.0 (X11; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0" jicofo_1 | Jicofo 2020-03-17 19:03:00.996 INFO: [45] org.jitsi.jicofo.JvbDoctor.log() Stopping health-check task for: jvb@auth.meet.jitsi/kx-H5Hsj

Hi,

The STUN lookup failed, because all docker containers did not have internet connectivity. Should you run into the same issue, you can check, if your docker containers have internet by running:

docker exec -it CONTAINERNAME apt-update

I think it would be a good idea, if jvb would check by itself, if it can resolve domain names or ping the STUN servers and if not error more verbosely.