Need help on scaling video bridges on Docker Swarm

I’m trying to scale video bridge to 2 instances running on 2 different machines. These 2 bridges connect to jicofo through MUC

When there are 2 participants in a room, things work fine. But when the third one joins, audio and video lost

When I check the jicofo logs I see this warning:

WARNING: [11] org.jitsi.jicofo.FocusManager.log() No dedicated JVB MUC XMPP connection configured - falling back to the default XMPP connection

But it still added the 2 bridges:

INFO: [11] org.jitsi.jicofo.JitsiMeetServices.log() Using a Bridge MUC detector with MUC: jvbbrewery@internal-muc.meet.jitsi
WARNING: [15] org.jitsi.impl.protocol.xmpp.XmppProtocolProvider.register().230 The always_trust config option is enabled. All XMPP server provided certificates are accepted
INFO: [18] org.jitsi.jicofo.xmpp.BaseBrewery.start().186 Joined brewery room: jvbbrewery@internal-muc.meet.jitsi
INFO: [29] org.jitsi.jicofo.xmpp.BaseBrewery.processInstanceStatusChanged().329 Added brewery instance: jvbbrewery@internal-muc.meet.jitsi/3be33297af6f
WARNING: [29] org.jitsi.jicofo.bridge.BridgeSelector.log() No pub-sub node mapped for jvbbrewery@internal-muc.meet.jitsi/3be33297af6f
INFO: [29] org.jitsi.jicofo.bridge.BridgeSelector.log() Added new videobridge: Bridge[jid=jvbbrewery@internal-muc.meet.jitsi/3be33297af6f, relayId=null, region=null, stress=0.00]
INFO: [29] org.jitsi.jicofo.bridge.BridgeSelector.log() Added new videobridge: Bridge[jid=jvbbrewery@internal-muc.meet.jitsi/3a6ad611337e, relayId=null, region=null, stress=0.00]
INFO: [18] org.jitsi.jicofo.ComponentsDiscovery.log() New component discovered: muc.meet.jitsi, null,
INFO: [18] org.jitsi.jicofo.JitsiMeetServices.log() MUC component discovered: muc.meet.jitsi

When I check the logs of the bridge that handles the call, I see some error:

INFO: Failed to handle TCP socket Socket[addr=/10.255.0.3,port=49696,localport=4443]: Failed to find the local candidate for socket: Socket[addr=/10.255.0.3,port=49696,localport=4443],

org.ice4j.stack.NetAccessManager handleFatalError,
SEVERE: Unexpected Error!,
java.lang.NullPointerException,
	at org.ice4j.socket.MergingDatagramSocket.initializeActive(MergingDatagramSocket.java:577),
	at org.ice4j.ice.ComponentSocket.propertyChange(ComponentSocket.java:174),
	at org.ice4j.ice.IceMediaStream.firePairPropertyChange(IceMediaStream.java:870),
	at org.ice4j.ice.CandidatePair.nominate(CandidatePair.java:629),
	at org.ice4j.ice.Agent.nominate(Agent.java:1847),
	at org.ice4j.ice.DefaultNominator.strategyNominateFirstValid(DefaultNominator.java:142),
	at org.ice4j.ice.DefaultNominator.propertyChange(DefaultNominator.java:118),
	at org.ice4j.ice.IceMediaStream.firePairPropertyChange(IceMediaStream.java:870),
	at org.ice4j.ice.CandidatePair.validate(CandidatePair.java:667),
	at org.ice4j.ice.IceMediaStream.addToValidList(IceMediaStream.java:668),
	at org.ice4j.ice.Agent.validatePair(Agent.java:1811),
	at org.ice4j.ice.ConnectivityCheckClient.processSuccessResponse(ConnectivityCheckClient.java:638),
	at org.ice4j.ice.ConnectivityCheckClient.processResponse(ConnectivityCheckClient.java:405),
	at org.ice4j.stack.StunClientTransaction.handleResponse(StunClientTransaction.java:314),
	at org.ice4j.stack.StunStack.handleMessageEvent(StunStack.java:1040),
	at org.ice4j.stack.MessageProcessingTask.run(MessageProcessingTask.java:196),
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149),
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624),
	at java.lang.Thread.run(Thread.java:748)

INFO: Error response for pair: 10.255.0.203:4443/tcp/host -> 10.255.0.3:49712/tcp/prflx (stream-1e785df1.RTP), failing.  Code = 401(class=4; number=1),

Here’s the sip-communicator.properties:

ubuntu# cat sip-communicator.properties 
org.jitsi.videobridge.SINGLE_PORT_HARVESTER_PORT=10000
org.jitsi.videobridge.DISABLE_TCP_HARVESTER=false
org.jitsi.videobridge.TCP_HARVESTER_PORT=4443

org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=xmpp.meet.jitsi
org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.meet.jitsi
org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard.PASSWORD=0c8eea877c6e51040b224705f9fa48d5
org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=jvbbrewery@internal-muc.meet.jitsi
org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=3be33297af6f
org.jitsi.videobridge.xmpp.user.shard.DISABLE_CERTIFICATE_VERIFICATION=true

org.jitsi.videobridge.ENABLE_STATISTICS=true
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc
org.jitsi.videobridge.STATISTICS_INTERVAL=5000

Can someone help me on this ?
Thanks in advance :smiley:

@Nguy_n_Duy Even I’m trying to use Jitsi with Swarm and sometimes I get below error

Jicofo 2020-04-25 14:10:23.098 SEVERE: [16] org.jitsi.impl.protocol.xmpp.XmppProtocolProvider.doConnect().315 Failed to connect/login: The following addresses failed: 'xmpp.meet.example.in:5222' failed because: java.net.UnknownHostException: xmpp.meet.example.in

then I start the meeting and everything works fine. I have tested it with 6 users and I didn’t have any issue with Audio but sometimes video stopped for couple of seconds. With 6 users JVP, CPU consumption went up to 116%.

I’m also using Traefik for reverse-proxy and letsencrypt cert.
If possible, Can you please share your swarm files becuase I’m unable to fix this XMPP server issue. This is totally random for me.

Here’s my swarm yml file

version: '3.3'

networks:
    meet_jitsi: {}
    my-custom-network:
        external: true

services:
    jicofo:
        image: jitsi/jicofo
        environment:
            ENABLE_AUTH: '1'
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: '90'
            JICOFO_AUTH_PASSWORD: cc0aabf95bfa1270e62fd4d4d125b219
            JICOFO_AUTH_USER: focus
            JICOFO_COMPONENT_SECRET: 6f9ae4220e0d0cbe079ab210151354dc
            JICOFO_RESERVATION_REST_BASE_URL: null
            JIGASI_BREWERY_MUC: jigasibrewery
            JVB_BREWERY_MUC: jvbbrewery
            TZ: Asia/Ho_Chi_Minh
            XMPP_AUTH_DOMAIN: auth.meet.jitsi
            XMPP_DOMAIN: meet.jitsi
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
            XMPP_SERVER: xmpp.meet.jitsi
        depends_on:
            - prosody
        networks:
            #- my-custom-network
            - meet_jitsi    
        volumes:
            - /jitsi/.jitsi-meet-cfg/jicofo:/config
            #- /jitsi/.jitsi-meet-cfg/jicofo-config:/etc/jitsi/jicofo
        deploy:
            placement:
                constraints:
                    - node.role == manager
                    - node.hostname == node1

    jvb:
        image: jitsi/jvb
        volumes:
            - /jitsi/.jitsi-meet-cfg/jvb:/config
            #- /jitsi/.jitsi-meet-cfg/jvb-config:/etc/jitsi/videobridge
        ports:
            - 10000:10000/udp
            - 4443:4443/tcp
        depends_on:
            - prosody
        environment:
            DOCKER_HOST_ADDRESS: node2
            JVB_AUTH_PASSWORD: 0c8eea877c6e51040b224705f9fa48d5
            JVB_AUTH_USER: jvb
            JVB_BREWERY_MUC: jvbbrewery
            JVB_ENABLE_APIS: null
            JVB_PORT: '10000'
            #JVB_STUN_SERVERS: meet-jit-si-turnrelay.jitsi.net:443
            JVB_TCP_HARVESTER_DISABLED: "false"
            JVB_TCP_PORT: '4443'
            TZ: Asia/Ho_Chi_Minh
            XMPP_AUTH_DOMAIN: auth.meet.jitsi
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
            XMPP_SERVER: xmpp.meet.jitsi
        networks:
            - meet_jitsi
            #- my-custom-network
        deploy:
            replicas: 1
            placement:
                constraints:
                    - node.role == manager
                    - node.hostname == node2

    jvb2:
        image: jitsi/jvb
        volumes:
            - /jitsi/.jitsi-meet-cfg/jvb:/config
            #- /jitsi/.jitsi-meet-cfg/jvb-config:/etc/jitsi/videobridge
        ports:
            - 10001:10000/udp
            - 4444:4443/tcp
        depends_on:
            - prosody
        environment:
            DOCKER_HOST_ADDRESS: node1
            JVB_AUTH_PASSWORD: 0c8eea877c6e51040b224705f9fa48d5
            JVB_AUTH_USER: jvb
            JVB_BREWERY_MUC: jvbbrewery
            JVB_ENABLE_APIS: null
            JVB_PORT: '10000'
            #JVB_STUN_SERVERS: meet-jit-si-turnrelay.jitsi.net:443
            JVB_TCP_HARVESTER_DISABLED: "false"
            JVB_TCP_PORT: '4443'
            TZ: Asia/Ho_Chi_Minh
            XMPP_AUTH_DOMAIN: auth.meet.jitsi
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
            XMPP_SERVER: xmpp.meet.jitsi
        networks:
            - meet_jitsi
            #- my-custom-network
        deploy:
            replicas: 1
            placement:
                constraints:
                    - node.role == manager
                    - node.hostname == node1

    prosody:
        image: jitsi/prosody
        volumes:
            - /jitsi/.jitsi-meet-cfg/prosody:/config
        environment:
            AUTH_TYPE: 'jwt'
            ENABLE_AUTH: '1'
            ENABLE_GUESTS: '0'
            GLOBAL_CONFIG: null
            GLOBAL_MODULES: null
            JIBRI_RECORDER_PASSWORD: f3c8121cb1e7a00c3c9831c551595054
            JIBRI_RECORDER_USER: recorder
            JIBRI_XMPP_PASSWORD: 17894dcc9034562328866482b30de955
            JIBRI_XMPP_USER: jibri
            JICOFO_AUTH_PASSWORD: cc0aabf95bfa1270e62fd4d4d125b219
            JICOFO_AUTH_USER: focus
            JICOFO_COMPONENT_SECRET: 6f9ae4220e0d0cbe079ab210151354dc
            JIGASI_XMPP_PASSWORD: ad3f487562166c34961829a804d60b18
            JIGASI_XMPP_USER: jigasi
            JVB_AUTH_PASSWORD: 0c8eea877c6e51040b224705f9fa48d5
            JVB_AUTH_USER: jvb
            JWT_ACCEPTED_AUDIENCES: null
            JWT_ACCEPTED_ISSUERS: null
            JWT_ALLOW_EMPTY: null
            JWT_APP_ID: my-app
            JWT_APP_SECRET: my-secret
            JWT_ASAP_KEYSERVER: null
            JWT_AUTH_TYPE: 'token'
            JWT_TOKEN_AUTH_MODULE: null
            LDAP_AUTH_METHOD: null
            LDAP_BASE: null
            LDAP_BINDDN: null
            LDAP_BINDPW: null
            LDAP_FILTER: null
            LDAP_START_TLS: null
            LDAP_TLS_CACERT_DIR: null
            LDAP_TLS_CACERT_FILE: null
            LDAP_TLS_CHECK_PEER: null
            LDAP_TLS_CIPHERS: null
            LDAP_URL: null
            LDAP_USE_TLS: null
            LDAP_VERSION: null
            LOG_LEVEL: null
            TZ: Asia/Ho_Chi_Minh
            XMPP_AUTH_DOMAIN: auth.meet.jitsi
            XMPP_DOMAIN: meet.jitsi
            XMPP_GUEST_DOMAIN: guest.meet.jitsi
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
            XMPP_INTERNAL_MUC_MODULES: ''
            XMPP_MODULES: ''
            XMPP_MUC_DOMAIN: muc.meet.jitsi
            XMPP_MUC_MODULES: ''
            XMPP_RECORDER_DOMAIN: recorder.meet.jitsi
        expose:
            - '5222'
            - '5347'
            - '5280'
        networks:
            meet_jitsi:
                aliases:
                    - xmpp.meet.jitsi
        deploy:
            placement:
                constraints:
                    - node.role == manager
                    - node.hostname == node1

    webjitsi:
        image: jitsi/web
        volumes:
            - /jitsi/.jitsi-meet-cfg/web:/config
            #- /jitsi/.jitsi-meet-cfg/web/images:/usr/share/jitsi-meet/images
        environment:
            DISABLE_HTTPS: '1'
            ENABLE_AUTH: '1'
            ENABLE_GUESTS: '0'
            ENABLE_HTTP_REDIRECT: null
            ENABLE_LETSENCRYPT: null
            ENABLE_RECORDING: '1'
            ENABLE_TRANSCRIPTIONS: null
            ETHERPAD_URL_BASE: null
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: '90'
            JIBRI_RECORDER_PASSWORD: f3c8121cb1e7a00c3c9831c551595054
            JIBRI_RECORDER_USER: recorder
            JIBRI_XMPP_PASSWORD: 17894dcc9034562328866482b30de955
            JIBRI_XMPP_USER: jibri
            JICOFO_AUTH_USER: focus
            LETSENCRYPT_DOMAIN: null
            LETSENCRYPT_EMAIL: null
            PUBLIC_URL: null
            #TZ: Asia/Ho_Chi_Minh
            XMPP_AUTH_DOMAIN: auth.meet.jitsi
            XMPP_BOSH_URL_BASE: http://xmpp.meet.jitsi:5280
            XMPP_DOMAIN: meet.jitsi
            XMPP_GUEST_DOMAIN: guest.meet.jitsi
            XMPP_MUC_DOMAIN: muc.meet.jitsi
            XMPP_RECORDER_DOMAIN: recorder.meet.jitsi
        deploy:
            placement:
                constraints:
                    - node.role == manager
                    - node.hostname == node1
            labels:
                - "traefik.backend=webjitsi"
                - "traefik.docker.network=my-custom-network"
                - "traefik.enable=true"
                - "traefik.frontend.rule=Host:meet.my.domain"
                - "traefik.port=80"
        networks:
            meet_jitsi:
                aliases:
                    - meet.jitsi
            my-custom-network: null

    whoami:
        image: jwilder/whoami
        deploy:
            labels:
                - traefik.port=8000
                - traefik.backend=whoami
                - traefik.frontend.rule=Host:testjitsi.my.domain
                - traefik.enable=true
                - traefik.docker.network=my-custom-network
        networks:
            my-custom-network: null

Yes I also sometimes see the error: Failed to connect/login: The following addresses failed: ‘xmpp.meet.example.in:5222’. Then I reload the service and things work fine again. But still, when more than 2 participants join, the audio and video lost

@Nguy_n_Duy, Why are you using jvb and jvb2? Have you tried docker service scale jvb=2 ?

Because I need to scale the 2 bridges to 2 different machines :smiley: Of course I could just set replicas=2 in the yml file, but in the bridge setup there’s a thing called DOCKER_HOST_ADDRESS, which I think that it forces me to define another service for the other bridge, each bridge service will have a different DOCKER_HOST_ADDRESS.
So how do you scale the bridge ? Can you share your yml setup ? :smiley:

Here’s is my jisti.yaml file. I’m using replicas=2 only for jvb and its working fine but we can’t scale prosody in the same manner. I tried scaling prosody to 2 and then stopped the previous running prosody but it also stopped the meeting too. Do you have any thoughts on this?

version: '3.7'

services:
    # Frontend
    web:
        image: jitsi/web
        environment:
            ENABLE_AUTH:
            ENABLE_GUESTS:
            ENABLE_RECORDING: 1
            ENABLE_TRANSCRIPTIONS:
            ETHERPAD_URL_BASE:
            DISABLE_HTTPS: 1
            JICOFO_AUTH_USER: focus
            PUBLIC_URL: https://meet.example.in
            XMPP_DOMAIN: meet.example.in
            XMPP_AUTH_DOMAIN: auth.meet.example.in
            XMPP_BOSH_URL_BASE: http://xmpp.meet.example.in:5280
            XMPP_GUEST_DOMAIN: guest.meet.example.in
            XMPP_MUC_DOMAIN: muc.meet.example.in
            XMPP_RECORDER_DOMAIN: recorder.meet.example.in
            TZ: Asia/Kolkata
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: 90
            JIBRI_XMPP_USER: jibri
            JIBRI_XMPP_PASSWORD: 160135fb81b8f78232b26df486880b81
            JIBRI_RECORDER_USER: recorder
            JIBRI_RECORDER_PASSWORD: 46ea1b0e6252479eb6cc647bed7cfc18
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
            delay: 5s
            max_attempts: 5
            #placement:
            #constraints:
              #- node.hostname == vs1
              #- node.role == manager
          labels:
            - "traefik.enable=true"
            - "traefik.docker.network=proxy"
            - "traefik.http.routers.jitsi.entrypoints=web"
            - "traefik.http.routers.jitsi.rule=Host(`meet.example.in`)"
            ## Middleware
            - "traefik.http.routers.jitsi.middlewares=jitsi-https-redirect"
            - "traefik.http.middlewares.jitsi-https-redirect.redirectscheme.scheme=https"
            - "traefik.http.middlewares.jitsi-https-redirect.redirectscheme.permanent=true"
            - "traefik.http.routers.jitsi-secure.entrypoints=websecure"
            - "traefik.http.routers.jitsi-secure.rule=Host(`meet.example.in`)"
            ## LetsEncrypt
            - "traefik.http.routers.jitsi-secure.tls=true"
            - "traefik.http.routers.jitsi-secure.tls.certresolver=letsencrypt"
            - "traefik.http.routers.jitsi-secure.tls.domains[0].main=meet.example.in"
            ## Service
            - "traefik.http.routers.jitsi-secure.service=jitsi" #here service name is jitsi
            - "traefik.http.services.jitsi.loadbalancer.server.port=80"

        volumes:
            - ${CONFIG}/web:/config

        ports:
            - target: 80
        networks:
          proxy:
          jitsi:
            aliases:
                    #- web.meet.example.in
              - meet.example.in

    # XMPP server
    prosody:
        image: jitsi/prosody
        hostname: xmpp.meet.example.in
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
            delay: 5s
            max_attempts: 5
            #placement:
            #constraints: [node.hostname == vs2]
        environment:
            AUTH_TYPE:
            ENABLE_AUTH:
            GLOBAL_CONFIG:
            GLOBAL_MODULES:
            LDAP_AUTH_METHOD:
            LDAP_URL:
            LDAP_TLS_CACERT_FILE:
            LDAP_TLS_CACERT_DIR:
            LDAP_BINDPW:
            LDAP_FILTER:
            LDAP_TLS_CHECK_PEER:
            LDAP_START_TLS:
            LDAP_VERSION:
            JICOFO_COMPONENT_SECRET: e7f79f7a16a1b6a8bd5c18327d9bdace
            JICOFO_AUTH_USER: focus
            JICOFO_AUTH_PASSWORD: b44d6f8dd2af24a03fded73ebaa3ae2a
            JVB_AUTH_USER: jvb
            JVB_AUTH_PASSWORD: f8412a7d2f9821e8e9313fb6dad86a02
            PUBLIC_URL: https://meet.example.in
            XMPP_DOMAIN: meet.example.in
            XMPP_AUTH_DOMAIN: auth.meet.example.in
            XMPP_BOSH_URL_BASE: http://xmpp.meet.example.in:5280
            XMPP_GUEST_DOMAIN: guest.meet.example.in
            XMPP_MUC_DOMAIN: muc.meet.example.in
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.example.in
            XMPP_RECORDER_DOMAIN: recorder.meet.example.in
            XMPP_MODULES:
            XMPP_MUC_MODULES:
            XMPP_INTERNAL_MUC_MODULES:
            TZ: Asia/Kolkata
            JIGASI_XMPP_USER: jigasi
            JIGASI_XMPP_PASSWORD: 1c59269877257b39cc0475b21cf08a16
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: 90
            JIBRI_XMPP_USER: jibri
            JIBRI_XMPP_PASSWORD: 160135fb81b8f78232b26df486880b81
            JIBRI_RECORDER_USER: recorder
            JIBRI_RECORDER_PASSWORD: 46ea1b0e6252479eb6cc647bed7cfc18
            JWT_APP_ID:
            JWT_APP_SECRET: something long goes here
            JWT_ACCEPTED_ISSUERS:
            JWT_ALLOW_EMPTY:
            JWT_AUTH_TYPE:
            JWT_TOKEN_AUTH_MODULE:
            JWT_ACCEPTED_AUDIENCES:
            JWT_ASAP_KEYSERVER:
            LOG_LEVEL: Debug
        volumes:
            - ${CONFIG}/prosody:/config
            - ${CONFIG}/prosody:/etc/prosody

        ports:
            - target: 5222
              published: 5222
              #mode: host
            - target: 5347
              published: 5347
              #mode: host
            - target: 5280
              published: 5280
              #mode: host

        networks:
          jitsi:
             aliases:
                     #- meet.example.in
               - xmpp.meet.example.in
                 #- auth.meet.example.in
                 #- guest.meet.example.in
                 #- muc.meet.example.in
                 #- internal-muc.meet.example.in
                 #- focus.meet.example.in

    # Focus component
    jicofo:
        image: jitsi/jicofo

        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
            delay: 5s
            max_attempts: 5
            #placement:
            #constraints: [node.hostname == vs3]
        environment:
            ENABLE_AUTH:
            JICOFO_COMPONENT_SECRET: e7f79f7a16a1b6a8bd5c18327d9bdace
            JICOFO_AUTH_USER: focus
            JICOFO_AUTH_PASSWORD: b44d6f8dd2af24a03fded73ebaa3ae2a
            JICOFO_RESERVATION_REST_BASE_URL:
            XMPP_DOMAIN: meet.example.in
            XMPP_AUTH_DOMAIN: auth.meet.example.in
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.example.in
            XMPP_SERVER: xmpp.meet.example.in
            TZ: Asia/Kolkata
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: 90
            JVB_BREWERY_MUC: jvbbrewery
            JIGASI_BREWERY_MUC: jigasibrewery
        depends_on:
            - prosody
        volumes:
            - ${CONFIG}/jicofo:/config
        networks:
            jitsi:

    # Video bridge
    jvb:
        image: jitsi/jvb
        ports:
          - target: 10000
            published: 10000
            #mode: host
            protocol: udp
          - target: 4443
            published: 4443
            #mode: host
            protocol: tcp

        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
            delay: 5s
            #max_attempts: 5
            #placement:
            #constraints: [node.hostname == vs4]
        environment:
            XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.example.in
            XMPP_AUTH_DOMAIN: auth.meet.example.in
            XMPP_SERVER: xmpp.meet.example.in
            TZ: Asia/Kolkata
            JIBRI_BREWERY_MUC: jibribrewery
            JIBRI_PENDING_TIMEOUT: 90
            JVB_AUTH_USER: jvb
            JVB_AUTH_PASSWORD: f8412a7d2f9821e8e9313fb6dad86a02
            JVB_BREWERY_MUC: jvbbrewery
            JVB_PORT: 10000
            JVB_TCP_HARVESTER_DISABLED: 0
            JVB_TCP_PORT: 4443
            JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302,stun2.l.google.com:19302
            JVB_ENABLE_APIS: rest,colibri
        depends_on:
            - prosody
        volumes:
            - ${CONFIG}/jvb:/config
        networks:
            jitsi:
              aliases:
                - jvb.meet.example.in
    # dummy:
    #   image: hello-world
    #   deploy:
    #       placement:
    #         constraints: [node.hostname == server4.fqdn.com]
    #   networks:
    #         jitsi:

# Custom network so all services can communicate using a FQDN
networks:
  proxy:
    external: true
  jitsi:
    attachable: true    

How is this working without host mode? The swarm routing mesh will load balance the traffic between the 2 replicas and the whole thing should fail.

Are you using host mode by any chance? Iam not able to get it working without the host mode. Please confirm.

hello @Pandian yes i"m using host mode. Replicating JVB by using docker service scale not gonna help with the load balancing. If you are using traefik for UDP services then you have to disable the most=host else enable it.

For Load Balancing, I’m using Octo.

@metadata, I have reached the same conclusion.
How easy is it to integrate octo with a working jitsi-meet in your experience?

It’s a complicated answer. Since I have implemented it hence for me, its not hard but if someone is starting from scratch then its complicated. This thread is sufficient to help you out if you stuck somewhere.

There’s a little type in jvb/sip-communicator file. replace OCTO_REGION by REGION.