Steps to follow to scale to more than one host

He Community,

I find here in the community some postings of people having their installation scaled to multiple hosts also the free jitsi meet instance is scaled.

What I did not find is a minimal description how to manage that. What parts need to communicate to each other and what params need to be changed and configured.

I does not need to be a step-by-step guide but more like a basic check list. I already searched in the community and tried some search engine foo but I can only find people talking about their box scaling but not what needs to be placed where and how does that communicate.

The image from the docker image gives a brief overview ( https://github.com/jitsi/docker-jitsi-meet ) but it does not answer basic question without digging into the image and components.

I would be very pleased to get a link to start reading on this or a few words what needs to be configured how.

thx
Jan

edit: working solution in Steps to follow to scale to more than one host

1 Like

I am new to Jitsi myself, but what I’ve read so far is that you usually need to scale the videobridges.

How to do that, manually or perhaps with a kubernetes setup is what I am trying to figure out myself :wink:

1 Like

Im trying to work on that too…

There is this video how to add more video bridges…

But im a bit worried that it wont work the way he explains as I dont think it will work on my cloud setup.

In the beginning its saying to configure prodsy and add the videobridges by DNS, my question is can this be done by IP??? the rest seems doable!

1 Like

I did all of that from the video but now im getting this — any idea?

VB 2020-03-21 14:31:24.902 INFO: [37] org.jitsi.videobridge.VideobridgeExpireThread.log() Running expire()
JVB 2020-03-21 14:31:25.758 SEVERE: [38] org.jitsi.videobridge.health.Health.log() Health check failed in 0ms:
java.lang.Exception: No XMPP components
at org.jitsi.videobridge.health.Health.checkXmppConnection(Health.java:269)
at org.jitsi.videobridge.health.Health.doCheck(Health.java:225)
at org.jitsi.videobridge.health.Health.doRun(Health.java:495)
at org.jitsi.utils.concurrent.PeriodicRunnableWithObject.run(PeriodicRunnableWithObject.java:87)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.run(RecurringRunnableExecutor.java:216)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.runInThread(RecurringRunnableExecutor.java:292)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor.access$000(RecurringRunnableExecutor.java:36)
at org.jitsi.utils.concurrent.RecurringRunnableExecutor$1.run(RecurringRunnableExecutor.java:328)
JVB 2020-03-21 14:31:25.845 SEVERE: [63] org.jitsi.meet.ComponentMain.log() java.net.ConnectException: Connection refused (Connection refused), host:meet.digitalschool.tech, port:5347
org.xmpp.component.ComponentException: java.net.ConnectException: Connection refused (Connection refused)
at org.jivesoftware.whack.ExternalComponent.connect(ExternalComponent.java:296)
at org.jivesoftware.whack.ExternalComponentManager.addComponent(ExternalComponentManager.java:242)
at org.jivesoftware.whack.ExternalComponentManager.addComponent(ExternalComponentManager.java:222)
at org.jitsi.meet.ComponentMain.lambda$getConnectCallable$0(ComponentMain.java:286)
at org.jitsi.retry.RetryStrategy$TaskRunner.run(RetryStrategy.java:193)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
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)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:607)
at org.jivesoftware.whack.ExternalComponent.connect(ExternalComponent.java:174)
… 11 more

I am not sure if the video is still the correct way to do it. I think I’ve read on here somewhere that it should be possible to just add new videobridges without having to change the config of the main system every time.

In the video he adds a new component on the main system for each new bridge.

Really… where could I find that… I just spent 2 hours on this!

The YT tutorial is old - using the nighty versions, it is easier to use a MUC (Multiuser Channel) and let the JVB connect to that channel with a unique nickname. You will need the nightly/unstable repositories to get this going. Here are the various config files you will need to modify:

$ cat /etc/prosody/prosody.cfg.lua

-- Prosody XMPP Server Configuration
--
-- Information on configuring Prosody can be found on our
-- website at https://prosody.im/doc/configure
--
-- Tip: You can check that the syntax of this file is correct
-- when you have finished by running this command:
--     prosodyctl check config
-- If there are any errors, it will let you know what and where
-- they are, otherwise it will keep quiet.
--
-- Good luck, and happy Jabbering!


---------- Server-wide settings ----------
-- Settings in this section apply to the whole server and are the default settings
-- for any virtual hosts

-- This is a (by default, empty) list of accounts that are admins
-- for the server. Note that you must create the accounts separately
-- (see https://prosody.im/doc/creating_accounts for info)
-- Example: admins = { "user1@example.com", "user2@example.net" }
admins = { }

-- component_ports = { 5347 }
-- component_interface = "10.0.3.23"

network_backend = "epoll"

-- Enable use of libevent for better performance under high load
-- For more information see: https://prosody.im/doc/libevent
--use_libevent = true

-- Prosody will always look in its source directory for modules, but
-- this option allows you to specify additional locations where Prosody
-- will look for modules first. For community modules, see https://modules.prosody.im/
--plugin_paths = {}

-- This is the list of modules Prosody will load on startup.
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
-- Documentation for bundled modules can be found at: https://prosody.im/doc/modules
modules_enabled = {

	-- Generally required
		"roster"; -- Allow users to have a roster. Recommended ;)
		"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
		"tls"; -- Add support for secure TLS on c2s/s2s connections
		"dialback"; -- s2s dialback support
		"disco"; -- Service discovery

	-- Not essential, but recommended
		"carbons"; -- Keep multiple clients in sync
		"pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
		"private"; -- Private XML storage (for room bookmarks, etc.)
		"blocklist"; -- Allow users to block communications with other users
		"vcard4"; -- User profiles (stored in PEP)
		"vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard

	-- Nice to have
		"version"; -- Replies to server version requests
		"uptime"; -- Report how long server has been running
		"time"; -- Let others know the time here on this server
		"ping"; -- Replies to XMPP pings with pongs
		"register"; -- Allow users to register on this server using a client and change passwords
		--"mam"; -- Store messages in an archive and allow users to access it
		--"csi_simple"; -- Simple Mobile optimizations

	-- Admin interfaces
		"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
		--"admin_telnet"; -- Opens telnet console interface on localhost port 5582

	-- HTTP modules
		--"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
		--"websocket"; -- XMPP over WebSockets
		--"http_files"; -- Serve static files from a directory over HTTP

	-- Other specific functionality
		--"limits"; -- Enable bandwidth limiting for XMPP connections
		--"groups"; -- Shared roster support
		--"server_contact_info"; -- Publish contact information for this service
		--"announce"; -- Send announcement to all online users
		--"welcome"; -- Welcome users who register accounts
		--"watchregistrations"; -- Alert admins of registrations
		--"motd"; -- Send a message to users when they log in
		--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
		--"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
}

-- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here:
modules_disabled = {
	-- "offline"; -- Store offline messages
	-- "c2s"; -- Handle client connections
	-- "s2s"; -- Handle server-to-server connections
	-- "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
}

-- Disable account creation by default, for security
-- For more information see https://prosody.im/doc/creating_accounts
allow_registration = false

-- Force clients to use encrypted connections? This option will
-- prevent clients from authenticating unless they are using encryption.

c2s_require_encryption = true

-- Force servers to use encrypted connections? This option will
-- prevent servers from authenticating unless they are using encryption.

s2s_require_encryption = true

-- Force certificate authentication for server-to-server connections?

s2s_secure_auth = false

-- Some servers have invalid or self-signed certificates. You can list
-- remote domains here that will not be required to authenticate using
-- certificates. They will be authenticated using DNS instead, even
-- when s2s_secure_auth is enabled.

--s2s_insecure_domains = { "insecure.example" }

-- Even if you disable s2s_secure_auth, you can still require valid
-- certificates for some domains by specifying a list here.

--s2s_secure_domains = { "jabber.org" }

-- Required for init scripts and prosodyctl
pidfile = "/var/run/prosody/prosody.pid"

-- Daemonization is taken care of by the init system now
daemonize = false

-- Select the authentication backend to use. The 'internal' providers
-- use Prosody's configured data storage to store the authentication data.

authentication = "internal_hashed"

-- Select the storage backend to use. By default Prosody uses flat files
-- in its configured data directory, but it also supports more backends
-- through modules. An "sql" backend is included by default, but requires
-- additional dependencies. See https://prosody.im/doc/storage for more info.

--storage = "sql" -- Default is "internal"

-- For the "sql" backend, you can uncomment *one* of the below to configure:
--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }


-- Archiving configuration
-- If mod_mam is enabled, Prosody will store a copy of every message. This
-- is used to synchronize conversations between multiple clients, even if
-- they are offline. This setting controls how long Prosody will keep
-- messages in the archive before removing them.

archive_expires_after = "1w" -- Remove archived messages after 1 week

-- You can also configure messages to be stored in-memory only. For more
-- archiving options, see https://prosody.im/doc/modules/mod_mam

-- Logging configuration
-- For advanced logging see https://prosody.im/doc/logging
log = {
	info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
	error = "/var/log/prosody/prosody.err";
	-- "*syslog"; -- Uncomment this for logging to syslog
	-- "*console"; -- Log to the console, useful for debugging with daemonize=false
}

-- Uncomment to enable statistics
-- For more info see https://prosody.im/doc/statistics
-- statistics = "internal"

-- Certificates
-- Every virtual host and component needs a certificate so that clients and
-- servers can securely verify its identity. Prosody will automatically load
-- certificates/keys from the directory specified here.
-- For more information, including how to use 'prosodyctl' to auto-import certificates
-- (from e.g. Let's Encrypt) see https://prosody.im/doc/certificates

-- Location of directory to find certificates in (relative to main config file):
certificates = "certs"

-- HTTPS currently only supports a single certificate, specify it here:
--https_certificate = "/etc/prosody/certs/localhost.crt"

----------- Virtual hosts -----------
-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
-- Settings under each VirtualHost entry apply *only* to that host.

VirtualHost "localhost"

--VirtualHost "example.com"
--	certificate = "/path/to/example.crt"

------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
-- For more information on components, see https://prosody.im/doc/components

---Set up a MUC (multi-user chat) room server on conference.example.com:
--Component "conference.example.com" "muc"
--- Store MUC messages in an archive and allow users to access it
--modules_enabled = { "muc_mam" }

---Set up an external component (default component port is 5347)
--
-- External components allow adding various services, such as gateways/
-- transports to other networks like ICQ, MSN and Yahoo. For more info
-- see: https://prosody.im/doc/components#adding_an_external_component
--
--Component "gateway.example.com"
--	component_secret = "password"
Include "conf.d/*.cfg.lua"

and here’s the configuration of the jitsi server

$ cat /etc/prosody/conf.d/meet.example.com.cfg.lua

plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }

-- domain mapper options, must at least have domain base set to use the mapper
muc_mapper_domain_base = "meet.example.com";

turncredentials_secret = "TURN_SECRET";

turncredentials = {
  { type = "stun", host = "meet.example.com", port = "443" },
  { type = "turn", host = "meet.example.com", port = "443", transport = "udp" },
  { type = "turns", host = "meet.example.com", port = "443", transport = "tcp" }
};

cross_domain_bosh = false;
consider_bosh_secure = true;

VirtualHost "meet.example.com"
        -- enabled = false -- Remove this line to enable this host
        authentication = "anonymous"
        -- Properties below are modified by jitsi-meet-tokens package config
        -- and authentication above is switched to "token"
        --app_id="example_app_id"
        --app_secret="example_app_secret"
        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/meet.example.com.key";
                certificate = "/etc/prosody/meet.example.com.crt";
        }
        speakerstats_component = "speakerstats.meet.example.com"
        conference_duration_component = "conferenceduration.meet.example.com"
        -- we need bosh
        modules_enabled = {
            "bosh";
            "pubsub";
            "ping"; -- Enable mod_ping
            "speakerstats";
            "turncredentials";
            "conference_duration";
        }
        c2s_require_encryption = false

Component "conference.meet.example.com" "muc"
    modules_enabled = {
        "muc_meeting_id";
        "muc_domain_mapper";
        -- "token_verification";
    }
    admins = { "focus@auth.meet.example.com" }

-- internal muc component
Component "internal.auth.meet.example.com" "muc"
    modules_enabled = {
      "ping";
    }
    admins = { "focus@auth.meet.example.com", "jvb@auth.meet.example.com" }

VirtualHost "auth.meet.example.com"
    ssl = {
        key = "/etc/prosody/certs/auth.meet.example.com.key";
        certificate = "/etc/prosody/certs/auth.meet.example.com.crt";
    }
    authentication = "internal_plain"

Component "focus.meet.example.com"
    component_secret = "JICOFO_SECRET"

Component "speakerstats.meet.example.com" "speakerstats_component"
    muc_component = "conference.test.meet.switch.ch"


Component "conferenceduration.meet.example.com" "conference_duration_component"
    muc_component = "conference.meet.example.com"

On the videobridge:

$ cat /etc/jitsi/videobridge/config
# Jitsi Videobridge settings

# sets the XMPP domain (default: none)
JVB_HOSTNAME=meet.example.com

# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)
JVB_HOST=

# sets the port of the XMPP server (default: 5275)
JVB_PORT=5347

# sets the shared secret used to authenticate to the XMPP server
JVB_SECRET=VB_SECRET

# extra options to pass to the JVB daemon
JVB_OPTS="--apis=rest,"


# adds java system props that are passed to jvb (default are for home and logging config file)
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties"

and finally:

$ cat /etc/jitsi/videobridge/sip-communicator.properties

org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true

org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=10.0.1.178
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=YOUR.IP.V4.ADDRESS
org.jitsi.videobridge.SINGLE_PORT_HARVESTER_PORT=10000

org.jitsi.videobridge.ENABLE_REST_SHUTDOWN=true

# Enable broadcasting stats/presence in a MUC
org.jitsi.videobridge.ENABLE_STATISTICS=true
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc,colibri,rest
org.jitsi.videobridge.STATISTICS_INTERVAL=5000

org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.DOMAIN=auth.meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.USERNAME=jvb
org.jitsi.videobridge.xmpp.user.shard-1.PASSWORD=VB_SECRET_PASSWORD
org.jitsi.videobridge.xmpp.user.shard-1.MUC_JIDS=JvbBrewery@internal.meet.example.com
org.jitsi.videobridge.xmpp.user.shard-1.MUC_NICKNAME=test-v1.example.com
org.jitsi.videobridge.xmpp.user.shard-1.DISABLE_CERTIFICATE_VERIFICATION=true

I am about to publish a full working Ansible script - I will post that over in Jitsi for swiss higher education - success story

cheers
Jens-Christian

1 Like

Hi Jens,

Thanks for the info. Just a quick question, do I need to reinstall the server with the nightly? or I can just modify the files you sent out to me?

I would reinstall with nightly

I got the nightly installed, and all the configs the same as yours (normally with personalized names and IPs)

Im not sure what I should do to add the second video bridge in the main server?

Anything I need to configure on the new video bridge?

Just start a second videobridge with the exact same sip-communicator.properties but a different MUC_NICKNAME and that should work :slight_smile:

Sorry to be a pain… I did exactly as you told me.

Just a comment, when I created the new videobridge when it asked me for the hostname i put the server hostname not a new one.

My question is how do I test that this is working?

Open the terminal window on the two servers hosting the Meet and additional JVB

  1. Start a meeting with 3 participants… Ctrl+Shit+N to new new tabs in Chrome
  2. On the Meet server tail jicofo.log file
  3. Open another terminal on the same server. Here type service jvb stop

If the second jvb is running, you’ll see a blip on the screen and then the meetings will move over to the new jvb server seamlessly.

Watch jicofo log for the meeting transitioning over to the second jvb. Also, check jvb logs on both the servers to see the health check.

  1. Restart jvb on meet server. service jvb start
  2. On the second jvb server so service jvb stop. Meetings will move over the first jvb.

Hope it helps!

@reset

Thanks for the tip. With what I tried its not working… Man this has been killing me all day long!

he @jcfischer

thank you for that - but what is the key that enables the additional videobridge to work ?

I see currently this error repeating over and over on the second videobridge

JVB 2020-03-21 19:29:23.687 SEVERE: [16] org.jitsi.utils.concurrent.RecurringRunnableExecutor.log() The invocation of the method org.jitsi.videobridge.stats.StatsManager$StatisticsPeriodicRunnable.run() threw an exception.
java.lang.reflect.InaccessibleObjectException: Unable to make public long com.sun.management.internal.OperatingSystemImpl.getTotalPhysicalMemorySize() accessible: module jdk.management does not "opens com.sun.management.internal" to unnamed module @54ca3634
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
	at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
	at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:198)
	at java.base/java.lang.reflect.Method.setAccessible(Method.java:192)
	at org.jitsi.videobridge.stats.OsStatistics.getTotalMemory(OsStatistics.java:138)
	at org.jitsi.videobridge.stats.VideobridgeStatistics.generate0(VideobridgeStatistics.java:703)
	at org.jitsi.videobridge.stats.VideobridgeStatistics.generate(VideobridgeStatistics.java:450)
	at org.jitsi.videobridge.stats.StatsManager$StatisticsPeriodicRunnable.doRun(StatsManager.java:321)
	at org.jitsi.utils.concurrent.PeriodicRunnableWithObject.run(PeriodicRunnableWithObject.java:87)
	at org.jitsi.utils.concurrent.RecurringRunnableExecutor.run(RecurringRunnableExecutor.java:216)
	at org.jitsi.utils.concurrent.RecurringRunnableExecutor.runInThread(RecurringRunnableExecutor.java:292)
	at org.jitsi.utils.concurrent.RecurringRunnableExecutor.access$000(RecurringRunnableExecutor.java:36)
	at org.jitsi.utils.concurrent.RecurringRunnableExecutor$1.run(RecurringRunnableExecutor.java:328)

I have already switched to the nightly build but I can’t see how I can solve that.

after posting this solved the problem: https://stackoverflow.com/a/56339895/2114811

He all,

I’m not sure what my problem is. I have updated to the nightly build and copied sip-communicator.properties from the first server to the second one. Keeping org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME unique on both system. Adjusted the settings in videobridge/config that JVB_HOST and JVB_SECRET are the same as on the first server. But when I start second videobridge the following log appears.

Maybe someone can spot the problem and guide me a little.

JVB 2020-03-21 19:55:46.702 INFO: [13] org.jitsi.impl.neomedia.MediaServiceImpl.log() Warming up SecureRandom...
JVB 2020-03-21 19:55:46.703 INFO: [13] org.jitsi.impl.neomedia.MediaServiceImpl.log() Warming up SecureRandom finished.
JVB 2020-03-21 19:55:46.722 INFO: [13] org.jitsi.videobridge.octo.OctoRelayService.start().112 Octo relay not configured.
JVB 2020-03-21 19:55:46.727 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.DISABLE_TCP_HARVESTER=true
JVB 2020-03-21 19:55:46.727 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.HOSTNAME=hawk.otter.horse
JVB 2020-03-21 19:55:46.728 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.PASSWORD=**********
JVB 2020-03-21 19:55:46.728 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.MUC_JIDS=JvbBrewery@internal.auth.hawk.otter.horse
JVB 2020-03-21 19:55:46.729 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.STATISTICS_TRANSPORT=muc
JVB 2020-03-21 19:55:46.729 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.DOMAIN=auth.hawk.otter.horse
JVB 2020-03-21 19:55:46.730 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.USERNAME=jvb
JVB 2020-03-21 19:55:46.730 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.ENABLE_STATISTICS=true
JVB 2020-03-21 19:55:46.731 INFO: [1] org.jitsi.impl.configuration.ConfigurationServiceImpl.log() org.jitsi.videobridge.xmpp.user.shard.MUC_NICKNAME=e907a02a-cb15-4e55-8e35-88a46deeeda8
JVB 2020-03-21 19:55:46.785 INFO: [22] org.jitsi.videobridge.IceUdpTransportManager.log() Using component socket: true
JVB 2020-03-21 19:55:46.791 INFO: [22] org.ice4j.ice.harvest.AbstractUdpListener.<init>() Initialized AbstractUdpListener with address 192.168.192.3:10000/udp. Receive buffer size 10485760 (asked for 10485760)
JVB 2020-03-21 19:55:46.793 INFO: [22] org.ice4j.ice.harvest.SinglePortUdpHarvester.<init>() Initialized SinglePortUdpHarvester with address 192.168.192.3:10000/udp
JVB 2020-03-21 19:55:46.798 INFO: [22] org.ice4j.ice.harvest.AbstractUdpListener.<init>() Initialized AbstractUdpListener with address [2a01:4f8:c17:8802:0:0:0:1]:10000/udp. Receive buffer size 10485760 (asked for 10485760)
JVB 2020-03-21 19:55:46.799 INFO: [22] org.ice4j.ice.harvest.SinglePortUdpHarvester.<init>() Initialized SinglePortUdpHarvester with address [2a01:4f8:c17:8802:0:0:0:1]:10000/udp
JVB 2020-03-21 19:55:46.800 INFO: [22] org.ice4j.ice.harvest.AbstractUdpListener.<init>() Initialized AbstractUdpListener with address 49.12.44.188:10000/udp. Receive buffer size 10485760 (asked for 10485760)
JVB 2020-03-21 19:55:46.804 INFO: [22] org.ice4j.ice.harvest.SinglePortUdpHarvester.<init>() Initialized SinglePortUdpHarvester with address 49.12.44.188:10000/udp
JVB 2020-03-21 19:55:47.029 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 1069ms. Sticky failure: false
JVB 2020-03-21 19:55:57.032 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=713c601b11dbe0db conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:55:57.143 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 112ms. Sticky failure: false
JVB 2020-03-21 19:56:07.144 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=4d63277b98acdf29 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:07.213 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 69ms. Sticky failure: false
JVB 2020-03-21 19:56:16.790 WARNING: [55] org.jivesoftware.smackx.ping.PingManager.pingServerIfNecessary() XMPPConnection was not authenticated
JVB 2020-03-21 19:56:16.920 SEVERE: [39] org.jitsi.xmpp.mucclient.MucClientManager.log() Failed to initialize and start a MucClient:
org.jivesoftware.smack.SmackException$ConnectionException: The following addresses failed: 'hawk.otter.horse:5222' failed because: hawk.otter.horse/49.12.35.166 exception: java.net.SocketTimeoutException: connect timed out
	at org.jivesoftware.smack.SmackException$ConnectionException.from(SmackException.java:278)
	at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPConnection.java:619)
	at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java:902)
	at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java:383)
	at org.jitsi.xmpp.mucclient.MucClient.initializeConnectAndJoin(MucClient.java:277)
	at org.jitsi.xmpp.mucclient.MucClientManager.lambda$addMucClient$0(MucClientManager.java:152)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
JVB 2020-03-21 19:56:17.215 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=7ed9cb76707c1a7a conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:17.310 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 95ms. Sticky failure: false
JVB 2020-03-21 19:56:27.313 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=ee97adf6d41f3c37 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:27.389 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 77ms. Sticky failure: false
JVB 2020-03-21 19:56:37.391 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=50941f7ea2351a44 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:37.429 WARNING: [18] org.jitsi.videobridge.EndpointMessageTransport.log() SCTP connection with 893a135ba5a5ca04 not ready yet.
JVB 2020-03-21 19:56:37.430 WARNING: [18] org.jitsi.videobridge.EndpointMessageTransport.log() No available transport channel, can't send a message
JVB 2020-03-21 19:56:37.431 WARNING: [18] org.jitsi.videobridge.EndpointMessageTransport.log() SCTP connection with 726d545194b6acd3 not ready yet.
JVB 2020-03-21 19:56:37.431 WARNING: [18] org.jitsi.videobridge.EndpointMessageTransport.log() No available transport channel, can't send a message
JVB 2020-03-21 19:56:37.473 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 83ms. Sticky failure: false
JVB 2020-03-21 19:56:45.955 INFO: [21] org.jitsi.videobridge.VideobridgeExpireThread.log() Running expire()
JVB 2020-03-21 19:56:47.474 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=bda5edb77b459820 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:47.538 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 64ms. Sticky failure: false
JVB 2020-03-21 19:56:57.539 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=1571e542999de1f conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 19:56:57.599 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 60ms. Sticky failure: false
JVB 2020-03-21 19:57:07.600 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=3577b22bdfd494a8 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0

I guess that this is the root The following addresses failed: 'hawk.otter.horse:5222' BUT - that port is no where configured and I do not see where the problem is.

thank you for your help.

Is port 5222 open through the firewall?

 XMPPConnection was not authenticated

There seems to be some issue with the authentication. Ensure JVB password matches what’s stored in Prosody.

stupid me thanks @reset

now I need to disable the certificate authentication …

org.jitsi.videobridge.xmpp.user.shard.DISABLE_CERTIFICATE_VERIFICATION=true

did the trick.


solution

  1. use unstable build
  2. install first with jitsi-meet
  3. finish installation (including all ssl enable)
  4. take the second server - install jitsi-videobridge only
  5. copy sip-communicator.properties from first to second server
  6. keep MUC_NICKNAME unique on each node
  7. take care that the firewall has also port 5222 open on first server
  8. might want to add org.jitsi.videobridge.xmpp.user.shard.DISABLE_CERTIFICATE_VERIFICATION=true to the second servers sip-communicator.properties file
  9. might need to add java parameters like written in https://stackoverflow.com/a/56339895/2114811 (on debian 10)

Starting with step 4. the number of servers can be raised easy.


remaining question:

Is this logging on the second server OK? Can I lower logging to not include info? I think that is very chatty.

JVB 2020-03-21 22:49:10.912 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=db93f9bf4451c5ae conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 22:49:11.015 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 104ms. Sticky failure: false
JVB 2020-03-21 22:49:21.017 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=2ad0abb8958f3fb7 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 22:49:21.073 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 58ms. Sticky failure: false
JVB 2020-03-21 22:49:31.074 INFO: [22] org.jitsi.videobridge.Videobridge.log() CAT=stat create_conf,conf_id=c7d47196610a1b72 conf_name=null,logging=false,conf_count=1,ch_count=0,v_streams=0
JVB 2020-03-21 22:49:31.141 INFO: [22] org.jitsi.videobridge.health.Health.log() Performed a successful health check in 68ms. Sticky failure: false

2 Likes