Jitsi "You have been disconnected": causes and fixes

Short answer

Record the underlying browser error and the time of failure before changing settings. Check the actual signalling transport, proxy response and component health, then separate authentication, room admission and media problems. A 101 WebSocket response proves only an HTTP upgrade, and deleting Prosody data is not a routine password fix.

A disconnect banner is the starting point for investigation. Record the first relevant error and the failing request before repeatedly reloading or restarting services. This guide is for self-hosted administrators; participants should give the organizer a sanitized error and timestamp rather than changing server settings. [S1][S6]

Source scope: checked 24 October 2026 against Jitsi Meet 11248 source at f765042b and docker-jitsi-meet stable-11248-2, commit 74d3e6e. Local fixtures verify the HTTP upgrade probe’s request and reporting behavior. They do not reproduce a live Jitsi disconnect or establish a fix for your server. [S1][S2]

1. Capture the failure before choosing a fix

The reviewed client considers configuration, connection and conference errors when deciding whether to show a reload overlay. It selects the disconnect title for its configuration/connection failure branch; a conference error can take a different reload-message branch. Neither title names a particular failed server or transport. [S1]

Record the time with timezone, browser/app version, installed component versions, whether joining ever succeeded, and which clients or networks are affected. Use version inventory before applying a release-specific instruction. Keep room names and tokens out of shared screenshots. [S2][S6]

Observation Next evidence to collect
Web page or config request fails HTTP status, TLS/DNS result and proxy route
XMPP connection fails before room entry Actual signalling URL, upgrade/stream result and authentication error
Transport opens, then closes Close timing, service events and matching proxy/server logs
JWT or room admission fails Token validation and room/role policy, not just the banner
Audio/video fails when participant count changes Active media path and bridge/ICE evidence
Multiple clients fail at once Shared server, proxy or network events at that time
One client or office fails Controlled comparison with another approved client/network

These are diagnostic branches, not measured probabilities or confirmed causes. For JWT errors use token diagnostics; for media changing at the third participant use bridge-path diagnostics. [S1][S2]

2. Inspect the actual browser transport

In Chrome DevTools, open Network, reproduce once in a disposable meeting and inspect the relevant requests. If the client uses WebSocket, select its request and check the status and message/close sequence. Record the console’s error name privately; do not export and post an entire HAR or console dump. [S6]

The reviewed Docker web template configures /xmpp-websocket when XMPP WebSocket support is enabled, and also contains BOSH /http-bind routing. Inspect the browser-served config.js and actual requests instead of assuming every deployment uses the same transport. Tenant paths and custom frontends can differ. [S2]

For a conventional HTTP/1.1 WebSocket handshake:

Result What it establishes
101 The request upgraded; later XMPP or conference failure remains possible
400 or 404 Check request requirements and route/endpoint; this alone does not prove a broken proxy
502 or 504 Investigate gateway/upstream connectivity and timing
Redirect or HTML page Check the exact hostname/path and proxy routing
TLS/DNS failure or no HTTP status Investigate that earlier network stage first

Interpret the actual transport and HTTP version. A successful upgrade is not a full XMPP or meeting test. WebSocket protocols can use other HTTP mechanisms; the optional probe below deliberately tests HTTP/1.1. [S3][S4][S5]

Optional bounded HTTP/1.1 upgrade probe

Run this in Bash on an authorized machine against your own test server. Replace both example hostnames. Use the exact path from the browser for a tenant deployment. No JWT, room name or password belongs in this probe. [S2][S3][S4][S5]

Terminal
JITSI_WS_KEY="$(openssl rand -base64 16)" || exit 1
if curl --http1.1 --max-time 5 --silent --show-error \
  --output /dev/null --write-out 'http_status=%{http_code}\n' \
  -H 'Connection: Upgrade' -H 'Upgrade: websocket' \
  -H 'Sec-WebSocket-Version: 13' \
  -H "Sec-WebSocket-Key: $JITSI_WS_KEY" \
  -H 'Sec-WebSocket-Protocol: xmpp' \
  -H 'Origin: https://meet.example.com' \
  'https://meet.example.com/xmpp-websocket'; then
  JITSI_PROBE_EXIT=0
else
  JITSI_PROBE_EXIT=$?
fi
printf 'curl_exit=%s\n' "$JITSI_PROBE_EXIT"
unset JITSI_WS_KEY JITSI_PROBE_EXIT

The nonce decodes to 16 random bytes and the request asks for the xmpp subprotocol. The command reports only HTTP status and curl exit status, not response bodies or complete headers. It retains normal TLS verification and does not follow redirects. [S3][S4][S5]

If the connection upgrades and remains open, the deliberate five-second limit can produce curl exit 28 after http_status=101. That is not, by itself, proof the upgrade failed. Curl can also return zero for an HTTP error here because this probe does not use --fail; always read the HTTP status too. This probe does not send an XMPP stream, authenticate, join a room, verify WebSocket message handling or test media. Use the browser’s real connection for those checks. [S3][S4][S5]

3. Check component health without dumping configuration

Use the same Compose project, environment files, profiles and overlays that run the deployment. The commands below list stopped containers too and take a resource snapshot; they do not restart anything. [S7]

Terminal
docker compose ps --all
docker compose stats --no-stream

For stopped or restarting containers, inspect only selected state fields. This example deliberately avoids a full environment/configuration dump: [S7]

Terminal
for JITSI_ID in $(docker compose ps --all --quiet prosody jicofo jvb web); do
  docker inspect --type container --format \
    '{{.Name}} status={{.State.Status}} oom_killed={{.State.OOMKilled}} exit={{.State.ExitCode}} restarts={{.RestartCount}}' \
    "$JITSI_ID"
done
unset JITSI_ID

Use the state together with private logs and the recorded failure time. A restart count, exit code or resource snapshot does not establish the cause alone. An OOM flag is useful evidence about that container’s state, but a false value does not rule out every host or application resource failure. Do not claim a particular RAM size must cause an OOM kill. [S7]

Inspect a bounded time window of the relevant web, Prosody and Jicofo logs locally. Include JVB when media or bridge allocation is involved. Logs and browser exports can contain tokens, room links and personal data; the JWT diagnostic guide explains a constant-only filter for its specific error categories. Do not request or share unredacted log dumps. [S2][S9]

4. Match proxy routing to this release

The reviewed web template forwards /xmpp-websocket to Prosody with HTTP/1.1 and Upgrade/Connection handling, while /http-bind has its own route. An external proxy must preserve the route and transport your client actually uses. Check every hop rather than adding headers to an unrelated location block. [S2][S8]

These directives illustrate the HTTP/1.1 upgrade part inside an existing appropriate proxy location. They are not a complete proxy configuration: [S8]

Nginx
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Check the configured upstream scheme, host/container port, path, TLS termination and forwarded hostname. The reviewed Docker Compose maps host web ports to container 8000/8443. Older examples targeting container 80/443 need a release-specific review. Use the reverse-proxy guide for topology details. [S2]

Do not add an old /colibri-ws/ route as a universal fix: the reviewed base web and JVB templates do not define that legacy path. Conversely, do not remove routes from an older or customized deployment without checking its source and active configuration. [S2]

For time-related drops, correlate the observed interval with your actual proxy/load-balancer timeouts and upstream traffic. Nginx documents a default timeout between upstream reads and options for timeout or ping handling; that is a hypothesis to check, not a reason to increase every timeout blindly. Avoid changing public DNS/CDN routing as the first diagnostic step. [S8]

5. Check credentials and upgrade state without deleting data

If the failure started after .env changes or a rerun of gen-passwords.sh, investigate credential consistency and component authentication. The generator replaces service passwords. The pinned Prosody startup has a registration stage that attempts account creation after its readiness check; “credentials are only handled on the first start” is not a complete description of this release. Review that stage’s results and the consumers’ intended settings. [S2][S9]

Do not delete Prosody’s persistent data to test this theory. Preserve accounts, configuration and backups. Compare the intended credentials privately or restore a known working configuration through a planned recovery procedure. Coordinate any rotation across affected components and verify registration/authentication before reopening meetings. No secret or full configuration belongs in a public issue. [S2][S9]

For failures after an upgrade, check image references, matching release files, mounts and generated runtime paths. Follow the upgrade procedure and rootless migration notes when applicable. A mixed-version observation is evidence to investigate, not proof that it caused this disconnect. [S2]

PUBLIC_URL influences the generated browser signalling URLs. Compare the browser-served configuration and the URL users actually open, including any tenant mapping. After an evidenced environment change, Compose must recreate the changed configuration; a simple container restart does not apply new Compose environment values. Plan that interruption separately from the read-only checks. [S2][S10]

6. Compare affected clients and separate media failures

If permitted, compare one controlled test using another supported browser/profile or an independent network, keeping the server and meeting policy the same. A different outcome narrows the investigation to differences such as network routing, client state or authentication; it does not prove one network is faulty. Do not bypass an organization’s controls to run the comparison. [S1][S6]

Signalling and media use different paths, and participant count can change media routing. Keep browser error/transport evidence alongside ICE and bridge evidence. If signalling remains established but media fails, continue with three-participant bridge diagnostics or one-to-one media diagnostics instead of repeatedly changing the WebSocket proxy. [S2]

For package installations, Docker variables and container paths do not apply. Inspect the installed Prosody, Jicofo, JVB and web-proxy services using their package configuration and private service logs. A restart is a planned operational change, not a diagnostic observation. Follow upstream’s package installation layout and the documentation for the installed version. [S11]

Verify the correction

After correcting the evidenced cause on a test setup, reproduce the original case and verify:

  1. Configuration loads and the intended signalling transport remains established.
  2. Authentication and room admission work for the intended host and participant policies.
  3. Audio/video work on the relevant two-person and multi-person paths.
  4. The session survives beyond the previously observed drop interval.
  5. A reconnect or fresh join still works without broadening access or discarding state.

These are proposed acceptance checks, not results measured on your deployment. Keep a sanitized timestamped record and change one cause at a time. [S1][S2][S3]

Open questions and maintenance

We checked pinned client and Docker source, shell syntax, and a local HTTP fixture that accepts or rejects upgrade requests and demonstrates an upgraded connection reaching the probe timeout. No full WebSocket/XMPP stream, real Jitsi meeting, proxy deployment, password rotation, data deletion, OOM injection or live package operation was tested for this revision.

Recheck after client error handling, transport, startup/registration or container-port changes. For help, contact our engineers with sanitized versions, timestamps, error names and transport/status observations. This page does not promise a cause from a banner or an unreviewed log dump.

Sources

Reviewed 24 October 2026; pinned source is not proof of every installed image’s contents.

Written by the Jitsi Help engineering team

Jitsi infrastructure engineers who deploy and run Jitsi Meet servers in production. Last updated . How we write our guides

Stuck on something this page does not cover? Ask a question below. Jitsi Help engineers read every one.

Did this fix it?

Something on this page is outdated or wrong?

Collect debug info

These commands gather what an engineer needs to diagnose a Jitsi server. Copy them, run them, and keep the output.

Terminal
# Run on the server, from your docker-jitsi-meet folder

# 1. Every service should be "running" (or "healthy")
docker compose ps

# 2. Which images and release tags are running
docker compose images

# 3. Recent logs from the core services
docker compose logs --tail=200 web prosody jicofo jvb

# 4. The settings most fixes depend on
grep -E '^(PUBLIC_URL|JVB_ADVERTISE_IPS|ENABLE_LETSENCRYPT|ENABLE_AUTH|AUTH_TYPE)=' .env

# 5. Is anything listening for media on UDP 10000?
sudo ss -ulnp | grep 10000

Installed with the Debian packages instead of Docker? Read the service logs with:

Terminal
sudo journalctl -u prosody -u jicofo -u jitsi-videobridge2 --since "1 hour ago"

Remove passwords, secrets and tokens before you share any output.

Send the output to an engineer

Frequently asked questions

Does the disconnect message identify one cause?

No. Read the underlying error and check the failing request. The reviewed client selects disconnect or reload overlays from configuration, connection and conference error state. The message alone does not establish a broken proxy, invalid token or media-port problem.

Does HTTP 101 prove a Jitsi meeting works?

No. A 101 response confirms an HTTP protocol upgrade for that request. XMPP stream setup, authentication, room admission, sustained transport and media still need separate verification.

Should I delete Prosody data after changing passwords?

Do not delete persistent Prosody data as a routine diagnostic. Preserve accounts and backups, inspect service-authentication and registration errors privately, and reconcile the intended credentials in a controlled maintenance window.

Does everyone disconnecting prove the server is at fault?

It suggests a shared dependency but does not identify it. Check the server, reverse proxy, load balancer and any network shared by those users. Compare an independent client or network before assigning the cause.

What should I share when asking for help?

Share versions, the failure time with timezone, affected client/network scope, sanitized error names and whether the transport upgraded or later closed. Remove JWTs, passwords, cookies, private room links and personal details from browser exports and logs.

Discussion

    Stuck, or would rather not do this by hand?

    Deploy it in one click

    A private Jitsi server in your own AWS account with SSL, your domain and optional recording, transcription and JWT. Free 15 minute trial.

    Start free trial

    Talk to a Jitsi engineer

    Setup, fixes, branding, recording, scaling. Tell us what is happening and we reply with a plan and a quote.

    Get expert help

    Related

    Recently updated