Jitsi Videobridge unavailable despite running

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.

seems to have been fixed after an update. i don’t know what else to say