Goal of this guide
This guide shows how to install, enable, test and fix grommunio Meet on a grommunio 2026.06.1 appliance. The goal is not merely opening the UI. The important part is that multiple users can join the same room and that the connection remains stable afterwards.
You install the Meet/Jitsi components on the existing appliance.
You enable the Meet plugin for grommunio Web.
You validate Prosody, Jicofo, Videobridge, nginx and the Meet routes.
You recognise `videobridgeNotAvailable` and an unhealthy JVB.
You fix Jicofo configuration, JVB configuration, Colibri WebSocket, UDP 10000 and ICE/NAT mapping.
You test two and three participants with real browser sessions.
The grommunio series stays intentionally practical: first install grommunio 2026.06.1, then grommunio-auth with Keycloak, grommunio-antispam with Rspamd and now grommunio Meet. Product context is available on the grommunio product page.
Architecture: what works together in Meet
grommunio Meet is based on Jitsi components. The web UI loads the room, Prosody handles XMPP signalling, Jicofo orchestrates conferences and Jitsi Videobridge forwards audio/video streams as an SFU. That is why HTTP 200 on `/meet/` is not enough for acceptance: if UDP, ICE or the Videobridge are wrong, the room may look fine at first and only fail when the second or third participant joins.
Browser-> /meet/ through nginx-> /meet/http-bind or /meet/xmpp-websocket-> Prosody-> Jicofo-> Jitsi Videobridge-> UDP 10000 for media and Colibri WebSocket for the control channel
Prerequisites
A working grommunio 2026.06.1 appliance with a valid FQDN.
Working HTTPS access to grommunio Web and grommunio Admin.
DNS, firewall and reverse proxy must match the FQDN in use.
For production use, clients must be able to reach UDP `10000` on the Videobridge.
If the Videobridge is behind NAT or in a private network, you need correct ICE/NAT mapping.
You need administrative shell access to the appliance.
Install Meet
On the validated appliance Prosody was already present, but Jicofo, Jitsi Meet and Jitsi Videobridge were installed by the Meet setup. First check whether the packages are already present.
rpm -qa | egrep 'jitsi|prosody|grommunio-web' | sortsystemctl is-enabled prosody jitsi-jicofo jitsi-videobridge 2>/dev/null || true
The grommunio appliance ships a setup part for Meet. Use the real FQDN of your environment. In the validated test environment this was `mail.example.test`.
export FQDN="$(hostname -f)"/usr/share/grommunio-setup/parts/grommunio-meet.sh
After setup, Prosody, Jicofo and Videobridge must be active. This is where Jicofo initially failed in the test because the systemd unit did not read the expected config path.
systemctl status --no-pager prosody jitsi-jicofo jitsi-videobridgejournalctl -u jitsi-jicofo -n 120 --no-pagerjournalctl -u jitsi-videobridge -n 120 --no-pager
Enable Meet in grommunio Web
grommunio Web loads Meet through the existing Meet plugin. Check the configuration and enable the plugin deliberately. Afterwards restart the web/PHP components.
grep -R "meet" -n /etc/grommunio-web /usr/share/grommunio-web/plugins/meet 2>/dev/null | head -80# /etc/grommunio-web/config-meet.php# Der Eintrag muss sinngemäß aktiv sein:# 'enable' => true,systemctl restart nginx php-fpm
Then validate the public Meet routes. `/meet/`, `/meet/config.js`, `/meet/http-bind`, `/meet/xmpp-websocket` and the Colibri WebSocket paths must be reachable through the same FQDN that users use in the browser.
curl -kI https://mail.example.test/meet/curl -kI https://mail.example.test/meet/config.jscurl -kI https://mail.example.test/meet/test-room
Screenshot: The Meet room loads and shows the join dialog. This alone is not a technical acceptance test.
Jicofo fix: set the config path explicitly
In the test, Jicofo did not start cleanly at first. The message was essentially that Jicofo needs a configuration file and expects `JAVA_SYS_PROPS` with `-Dconfig.file=...`. The robust fix is an explicit `/etc/jitsi/jicofo/config` and a clear HOCON file.
cat >/etc/jitsi/jicofo/config <<'EOF'JAVA_SYS_PROPS="-Dconfig.file=/etc/jitsi/jicofo/jicofo.conf"EOF# /etc/jitsi/jicofo/jicofo.confjicofo {xmpp {client {hostname = "localhost"port = 5222domain = "auth.mail.example.test"xmpp-domain = "mail.example.test"username = "focus"password = "<generated-focus-password>"conference-muc-jid = "conference.mail.example.test"client-proxy = "focus.mail.example.test"disable-certificate-verification = true}trusted-domains = [ "recorder.mail.example.test" ]}bridge {brewery-jid = "JvbBrewery@internal.auth.mail.example.test"}}systemctl restart jitsi-jicofosystemctl is-active jitsi-jicofo
Do not publish passwords or generated XMPP secrets in tickets, screenshots or blog posts. This guide therefore uses a placeholder.
JVB fix: load config, set WebSocket, validate UDP and ICE
The Videobridge must actually load its HOCON configuration. In the validated package layout this required a systemd override. Without it, a clean-looking file may exist while JVB still ignores it.
mkdir -p /etc/systemd/system/jitsi-videobridge.service.dcat >/etc/systemd/system/jitsi-videobridge.service.d/override.conf <<'EOF'[Service]Environment=JAVA_SYS_PROPS=-Dconfig.file=/etc/jitsi/videobridge/jvb.confEOFsystemctl daemon-reload
For an internal or NAT topology, separate two things: the local bridge address and the address clients can actually reach. In our validated internal environment the bridge inside the VM was `10.0.2.15`, while the browser reached it through the internal host address. In production, replace these values with your real addresses.
# /etc/jitsi/videobridge/jvb.confvideobridge {http-servers {public {host = 0.0.0.0port = 9090send-server-version = false}private {port = 8081tls-port = -1}}health {# Für rein interne 10.x-Topologien sinnvoll; bei Public Deployments vorher bewusst prüfen.require-valid-address = false}websockets {enabled = truedomains = [ "mail.example.test:443" ]tls = true}apis.xmpp-client.configs {shard {hostname = "localhost"domain = "auth.mail.example.test"username = "jvb"password = "<generated-jvb-password>"muc_jids = "JvbBrewery@internal.auth.mail.example.test"muc_nickname = "<unique-bridge-id>"disable-certificate-verification = true}}}ice4j {harvest {use-ipv6 = falsemapping {aws.enabled = falsestun.enabled = falsestatic-mappings = [{local-address = "10.0.2.15"public-address = "10.10.0.12"}]}}}systemctl restart jitsi-videobridge jitsi-jicofo
Important: `public-address` is not automatically a public Internet address. It is the address your clients can reach. In an internal-only deployment this can be an internal 10.x address. For external participants it must be the externally reachable address, and firewall/NAT must forward UDP `10000` accordingly.
ss -lntup | egrep '(:10000|:5222|:5280|:5281|:8081|:9090)' || truejournalctl -u jitsi-videobridge -n 120 --no-pager | egrep -i 'static mapping|Authenticated|Joined MUC|Health|No valid IP|SEVERE|ERROR' || truecurl -sS -w 'HTTP_STATUS=%{http_code}\n' http://127.0.0.1:8081/about/health || true
Failure pattern: when the second participant breaks everything
The typical failure is deceptive. The first user can open the room, the second user may join briefly, then participants disappear, the UI shows reconnect and the browser reports `conference.videobridgeNotAvailable` or the BridgeChannel closes.
CONFERENCE FAILED: conference.videobridgeNotAvailableBridgeChannel closedtriggering ice restart# Serverseitig war das entscheidende Signal:Health check failed: No valid IP addresses available for harvesting.
In our test, the cause was not grommunio Web and not the room itself. Jicofo, Prosody and JVB had to work together correctly, and the media path through UDP `10000` had to be reachable by clients.
Test two users
Do not test Meet with a single browser window. Use two separate browser contexts, two profiles or two real devices. Both users must see the same room and the participant count must remain stable.
Screenshot: The first user is in the room. The video comes from a test device to keep the flow reproducible.
Screenshot: After the fix, two separate browser sessions remain connected in the same room.
Acceptance criteria for two users:- both click "Join"- both see the other participant- participant count remains at 2- no failed /meet or /colibri-ws requests- no videobridgeNotAvailable- no ICE restart- no BridgeChannel close
Test three users and stability
The second test goes further: three separate browser sessions join the same room. The test does not stop immediately afterwards; it checks the room after 30, 60 and 120 seconds. This reveals a Videobridge that only falls out of the pool after its health interval.
Screenshot: The third user joins the running room.
Screenshot: After 30 seconds, all three participants are still visible.
Screenshot: After 60 seconds, the conference remains stable.
Screenshot: After 120 seconds, all three participants are still connected.
Final acceptance from the test:- Prosody: active- Jicofo: active- Jitsi Videobridge: active- JVB health: HTTP 200- three participants visible after 30 seconds- three participants visible after 60 seconds- three participants visible after 120 seconds- failedRequests: 0- videobridgeNotAvailable: 0- BridgeChannel closed: 0
Production checklist
Validate FQDN, TLS certificate and nginx routes for `/meet/`.
Monitor Prosody, Jicofo and JVB as systemd services.
Open UDP `10000` from the real client networks to the Videobridge.
Test Colibri WebSocket through HTTPS/WebSocket proxying.
For NAT, configure static ICE mapping with local bridge address and reachable client address.
For internal-only 10.x use, align JVB health with that topology deliberately.
Keep IPv6 enabled only when DNS, routing and firewall are correct for it.
Test two and three participants with separate devices or browser profiles.
Check logs for `videobridgeNotAvailable`, `No valid IP addresses available for harvesting`, ICE restarts and BridgeChannel errors.
Repeat the same multi-user test after updates.
Sources and validated basis
grommunio 2026.06.1 release notes: grommunio Suite with meetings, identities and the new admin interface.
grommunio roadmap: 2026.06.1 as the current stable GA version with openSUSE Leap 16.0 appliance base.
Jitsi self-hosting guide: static ICE/NAT mapping in `ice4j.harvest.mapping.static-mappings` for Videobridges behind NAT.
Validated appliance: grommunio 2026.06.1, Meet/Jitsi packages from the grommunio repository, synthetic FQDN `mail.example.test`, multi-user test with real browser contexts.
grommunio 2026 step by step
This series is meant as a practical sequence: start with the base installation, then add mail protection, central sign-in, video meetings and chat.
- Install grommunio 2026
- Set up grommunio-antispam with Rspamd
- Set up grommunio-auth with Keycloak
- Set up and test grommunio Meet (you are here)
- Set up and test grommunio Chat
Licensing and evaluation
If you want to evaluate grommunio or need licences for a production environment, you can contact ForgeOne. As a grommunio Gold Partner, we support architecture, licensing, installation, migration, SSO, antispam, Meet, monitoring, backup and support.
Introduce grommunio Meet in production
ForgeOne plans, licenses and operates grommunio as a sovereign collaboration platform including mail, calendars, contacts, grommunio-auth, grommunio-antispam, grommunio Meet, monitoring, backup and support. If you want to integrate video meetings into your grommunio environment, we can review network path, TLS, TURN/STUN, firewall, user privileges and operations with you.






