When two people join a Jitsi Meet meeting on my server, they disconnect, and the browser console shows an error about the videobridge being unavailable. Jicofo also logs this:
Aug 10 13:55:11 medium jicofo-start[2329560]: Aug 10, 2026 1:55:11 PM org.jitsi.utils.logging2.LoggerImpl log
Aug 10 13:55:11 medium jicofo-start[2329560]: WARNING: There are no operational bridges.
Aug 10 13:55:11 medium jicofo-start[2329560]: Aug 10, 2026 1:55:11 PM org.jitsi.utils.logging2.LoggerImpl log
Aug 10 13:55:11 medium jicofo-start[2329560]: SEVERE: Can not invite participant, no bridge available.
Aug 10 13:55:11 medium jicofo-start[2329560]: Aug 10, 2026 1:55:11 PM org.jitsi.utils.logging2.LoggerImpl log
Aug 10 13:55:11 medium jicofo-start[2329560]: WARNING: There are no operational bridges.
Aug 10 13:55:11 medium jicofo-start[2329560]: Aug 10, 2026 1:55:11 PM org.jitsi.utils.logging2.LoggerImpl log
Aug 10 13:55:11 medium jicofo-start[2329560]: SEVERE: Can not invite participant, no bridge available.
jitsi-videobridge2, on the other hand, does not log anything when a meeting is attempted. However, it appears to bind to UDP port 10000 on only local IPv4 addresses:
sudo ss -l --udp src :10000 --processes
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 [::ffff:192.168.1.101]:ndmp *:* users:(("java",pid=409626,fd=147))
UNCONN 0 0 [::ffff:192.168.1.101]:ndmp *:* users:(("java",pid=409626,fd=146))
UNCONN 0 0 [::ffff:192.168.1.101]:ndmp *:* users:(("java",pid=409626,fd=145))
UNCONN 0 0 [::ffff:192.168.1.101]:ndmp *:* users:(("java",pid=409626,fd=144))
UNCONN 0 0 [2001:14ba:445f:c700:fce8:4660:76ba:1b1c]:ndmp [::]:* users:(("java",pid=409626,fd=143))
UNCONN 0 0 [2001:14ba:445f:c700:fce8:4660:76ba:1b1c]:ndmp [::]:* users:(("java",pid=409626,fd=142))
UNCONN 0 0 [2001:14ba:445f:c700:fce8:4660:76ba:1b1c]:ndmp [::]:* users:(("java",pid=409626,fd=141))
UNCONN 0 0 [2001:14ba:445f:c700:fce8:4660:76ba:1b1c]:ndmp [::]:* users:(("java",pid=409626,fd=140))
UNCONN 0 0 [2001:14ba:445f:c700:5648:6d3a:988d:550c]:ndmp [::]:* users:(("java",pid=409626,fd=139))
UNCONN 0 0 [2001:14ba:445f:c700:5648:6d3a:988d:550c]:ndmp [::]:* users:(("java",pid=409626,fd=138))
UNCONN 0 0 [2001:14ba:445f:c700:5648:6d3a:988d:550c]:ndmp [::]:* users:(("java",pid=409626,fd=137))
UNCONN 0 0 [2001:14ba:445f:c700:5648:6d3a:988d:550c]:ndmp [::]:* users:(("java",pid=409626,fd=136))
UNCONN 0 0 [2001:14ba:445f:c700::1]:ndmp [::]:* users:(("java",pid=409626,fd=135))
UNCONN 0 0 [2001:14ba:445f:c700::1]:ndmp [::]:* users:(("java",pid=409626,fd=134))
UNCONN 0 0 [2001:14ba:445f:c700::1]:ndmp [::]:* users:(("java",pid=409626,fd=133))
UNCONN 0 0 [2001:14ba:445f:c700::1]:ndmp [::]:* users:(("java",pid=409626,fd=132))
UNCONN 0 0 [2001:14ba:445f:c700:ad2e:489c:4d3a:148]:ndmp [::]:* users:(("java",pid=409626,fd=131))
UNCONN 0 0 [2001:14ba:445f:c700:ad2e:489c:4d3a:148]:ndmp [::]:* users:(("java",pid=409626,fd=130))
UNCONN 0 0 [2001:14ba:445f:c700:ad2e:489c:4d3a:148]:ndmp [::]:* users:(("java",pid=409626,fd=129))
UNCONN 0 0 [2001:14ba:445f:c700:ad2e:489c:4d3a:148]:ndmp [::]:* users:(("java",pid=409626,fd=128))
This is the relevant config as far as I know:
services.jitsi-meet = {
enable = true;
excalidraw.enable = true;
excalidraw.port = 3004;
hostName = "meet.vikezor.click";
jibri.enable = true;
jigasi.enable = true;
interfaceConfig = {
SHOW_JITSI_WATERMARK = false;
SHOW_WATERMARK_FOR_GUESTS = false;
};
};
services.prosody = with lib; let
cfg = config.services.jitsi-meet;
in
{
enable = true;
package = pkgs.prosody.override {
withExtraLuaPackages = p: with p; [ luadbi-postgresql cjson ];
};
xmppComplianceSuite = true;
virtualHosts."vikezor.click" = {
enabled = true;
domain = "vikezor.click";
ssl.cert = "${config.security.acme.certs."vikezor.click".directory}/fullchain.pem";
ssl.key = "${config.security.acme.certs."vikezor.click".directory}/key.pem";
};
httpFileShare = {
domain = "pload.vikezor.click";
expires_after = "never";
size_limit = 1073741824;
};
extraConfig = ''
muc_mapper_domain_base = "${cfg.hostName}"
http_cors_override = {
websocket = { enabled = true }
}
unlimited_jids = {
"focus@auth.${cfg.hostName}",
"jvb@auth.${cfg.hostName}"
}
consider_websocket_secure = true;
storage = "sql"
sql = {
driver = "PostgreSQL";
database = "prosody";
username = "prosody";
}
archive_expires_after = "never"
turn_external_host = "vikezor.click"
turn_external_port = 3478
turn_external_secret = "$TURN_SECRET"
Component "focus.${cfg.hostName}" "client_proxy"
target_address = "focus@auth.${cfg.hostName}"
Component "jigasi.${cfg.hostName}" "client_proxy"
target_address = "jigasi@auth.${cfg.hostName}"
Component "speakerstats.${cfg.hostName}" "speakerstats_component"
muc_component = "conference.${cfg.hostName}"
Component "conferenceduration.${cfg.hostName}" "conference_duration_component"
muc_component = "conference.${cfg.hostName}"
Component "endconference.${cfg.hostName}" "end_conference"
muc_component = "conference.${cfg.hostName}"
Component "avmoderation.${cfg.hostName}" "av_moderation_component"
muc_component = "conference.${cfg.hostName}"
Component "metadata.${cfg.hostName}" "room_metadata_component"
muc_component = "conference.${cfg.hostName}"
breakout_rooms_component = "breakout.${cfg.hostName}"
'';
muc = [
{
domain = "muck.vikezor.click";
maxHistoryMessages = 9223372036854775807;
extraConfig = ''
modules_enabled = { "muc_mam" }
muc_log_presences = true
muc_log_expires_after = never
'';
}
{
domain = "conference.${cfg.hostName}";
name = "Jitsi Meet MUC";
allowners_muc = cfg.prosody.allowners_muc;
roomLocking = false;
roomDefaultPublicJids = true;
extraConfig = ''
restrict_room_creation = true
storage = "memory"
admins = { "focus@auth.${cfg.hostName}" }
'';
}
{
domain = "breakout.${cfg.hostName}";
name = "Jitsi Meet Breakout MUC";
roomLocking = false;
roomDefaultPublicJids = true;
extraConfig = ''
restrict_room_creation = true
storage = "memory"
admins = { "focus@auth.${cfg.hostName}", "jvb@auth.${cfg.hostName}" }
'';
}
{
domain = "internal.auth.${cfg.hostName}";
name = "Jitsi Meet Videobridge MUC";
roomLocking = false;
roomDefaultPublicJids = true;
extraConfig = ''
storage = "memory"
admins = { "focus@auth.${cfg.hostName}", "jvb@auth.${cfg.hostName}", "jigasi@auth.${cfg.hostName}" }
'';
#-- muc_room_cache_size = 1000
}
{
domain = "lobby.${cfg.hostName}";
name = "Jitsi Meet Lobby MUC";
roomLocking = false;
roomDefaultPublicJids = true;
extraConfig = ''
restrict_room_creation = true
storage = "memory"
'';
}
];
extraModules = [
"pubsub"
"smacks"
"speakerstats"
"external_services"
"conference_duration"
"muc_lobby_rooms"
"muc_breakout_rooms"
"av_moderation"
"muc_hide_all"
"muc_meeting_id"
"muc_domain_mapper"
"muc_rate_limit"
"limits_exception"
"persistent_lobby"
"room_metadata"
"mod_turn_external"
];
};
sops.templates."turn_secret.env" = {
content = "TURN_SECRET=${config.sops.placeholder."coturn/auth"}";
owner = "prosody";
};
systemd.services.prosody.serviceConfig.EnvironmentFile = config.sops.templates."turn_secret.env".path;
services.jitsi-videobridge = {
openFirewall = true;
nat.localAddress = "192.168.1.101";
nat.publicAddress = "212.90.91.238";
};
nixpkgs.config.permittedInsecurePackages = [ "jitsi-meet-1.0.8792" ];
I didn’t set services.jitsi-videobridge.nat at first; it was one of my attempts to fix it. All similar reports I have found on the web are people who did not have the videobridge running at all.