├── public ├── favicon.ico ├── css │ └── additional.css ├── js │ ├── wurk-1.0.js │ └── popper.min.js ├── index.html ├── attendee.html ├── external_api.js └── moderator.html ├── create.sh ├── zip.sh ├── additional-config ├── scripts │ ├── renew-ssl.sh │ ├── stop-all.sh │ ├── restart-all.sh │ └── start-all.sh ├── nginx │ ├── websocket.conf │ └── meet.conf ├── site-confs │ └── default ├── README ├── docker-compose.yml ├── interface_config.js ├── LICENSE └── config.js ├── start.sh ├── README.md ├── server.js ├── example.env └── LICENSE /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/puthli/breakout-rooms/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /create.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | docker run -it --rm -v $(pwd):/src node:slim /bin/sh -c "cd /src; npm install;" 4 | -------------------------------------------------------------------------------- /zip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | zip -r deploy/docker-websocket.zip server.js package-lock.json package.json start.sh create.sh public 4 | zip -r deploy/additional-config.zip additional-config 5 | -------------------------------------------------------------------------------- /additional-config/scripts/renew-ssl.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Make sure the docker-jitsi-meet_web_1 container is running before running this script." 4 | 5 | docker exec docker-jitsi-meet_web_1 /defaults/letsencrypt-renew 6 | 7 | -------------------------------------------------------------------------------- /additional-config/nginx/websocket.conf: -------------------------------------------------------------------------------- 1 | location /ws/ { 2 | proxy_pass http://websocket/; 3 | proxy_http_version 1.1; 4 | proxy_set_header Upgrade $http_upgrade; 5 | proxy_set_header Connection "Upgrade"; 6 | proxy_set_header Host $host; 7 | } 8 | 9 | -------------------------------------------------------------------------------- /additional-config/site-confs/default: -------------------------------------------------------------------------------- 1 | upstream websocket { 2 | server websocket:8888; 3 | } 4 | 5 | server { 6 | listen 80 default_server; 7 | return 301 https://$host$request_uri; 8 | } 9 | 10 | server { 11 | listen 443 ssl; 12 | 13 | include /config/nginx/ssl.conf; 14 | include /config/nginx/meet.conf; 15 | include /config/nginx/websocket.conf; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /public/css/additional.css: -------------------------------------------------------------------------------- 1 | @keyframes blinker { 2 | from { visibility: visible } 3 | to { visibility: hidden } 4 | 5 | /* Alternatively you can do this: 6 | 0% { visibility: visible; } 7 | 50% { visibility: hidden; } 8 | 100% { visibility: visible; } 9 | if you don't want to use `alternate` */ 10 | } 11 | .blink_me { 12 | animation: blinker steps(1) 500ms infinite alternate; 13 | } -------------------------------------------------------------------------------- /additional-config/scripts/stop-all.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 Itude Mobile BV 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | #!/bin/bash 18 | 19 | cd /docker-jitsi-meet 20 | docker-compose down 21 | 22 | docker stop websocket 23 | cd / 24 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 Itude Mobile BV 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | #!/bin/bash 18 | docker run --rm --name websocket -v $(pwd):/src -w /src -p 8888:8888 node:slim npm install 19 | docker run -d --rm --name websocket -v $(pwd):/src -w /src -p 8888:8888 node:slim node /src/server.js 20 | docker network connect docker-jitsi-meet_meet.jitsi websocket 21 | -------------------------------------------------------------------------------- /additional-config/scripts/restart-all.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 Itude Mobile BV 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | #!/bin/bash 18 | 19 | # copy config files to volumes for the jitsi-web container 20 | sudo cp /additional-config/site-confs/default /config/web/nginx/site-confs/default 21 | sudo cp /additional-config/nginx/websocket.conf /config/web/nginx/ 22 | sudo cp /additional-config/nginx/meet.conf /config/web/nginx/ 23 | sudo cp /additional-config/interface_config.js /config/web/ 24 | sudo cp /additional-config/config.js /config/web/ 25 | 26 | cd /docker-jitsi-meet 27 | /usr/local/bin/docker-compose restart 28 | 29 | docker restart websocket 30 | cd / 31 | -------------------------------------------------------------------------------- /additional-config/scripts/start-all.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 Itude Mobile BV 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | #!/bin/bash 18 | 19 | # copy config files to volumes for the jitsi-web container 20 | sudo cp /additional-config/site-confs/default /config/web/nginx/site-confs/default 21 | sudo cp /additional-config/nginx/websocket.conf /config/web/nginx/ 22 | sudo cp /additional-config/nginx/meet.conf /config/web/nginx/ 23 | sudo cp /additional-config/interface_config.js /config/web/ 24 | sudo cp /additional-config/config.js /config/web/ 25 | sudo cp /additional-config/docker-compose.yml /docker-jitsi-meet/ 26 | 27 | cd /docker-jitsi-meet 28 | /usr/local/bin/docker-compose up -d 29 | 30 | cd /docker-websocket 31 | . ./start.sh 32 | 33 | cd / 34 | -------------------------------------------------------------------------------- /additional-config/nginx/meet.conf: -------------------------------------------------------------------------------- 1 | server_name _; 2 | 3 | client_max_body_size 0; 4 | 5 | root /usr/share/jitsi-meet; 6 | 7 | # ssi on with javascript for multidomain variables in config.js 8 | ssi on; 9 | ssi_types application/x-javascript application/javascript; 10 | 11 | index index.html index.htm; 12 | error_page 404 /static/404.html; 13 | 14 | location = /config.js { 15 | alias /config/config.js; 16 | } 17 | 18 | location = /interface_config.js { 19 | alias /config/interface_config.js; 20 | } 21 | 22 | location = /external_api.js { 23 | alias /usr/share/jitsi-meet/libs/external_api.min.js; 24 | } 25 | 26 | # ensure all static content can always be found first 27 | location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$ 28 | { 29 | expires 30d; 30 | add_header Cache-Control "public, no-transform"; 31 | add_header 'Access-Control-Allow-Origin' '*'; 32 | alias /usr/share/jitsi-meet/$1/$2; 33 | } 34 | 35 | # BOSH 36 | location = /http-bind { 37 | proxy_pass http://xmpp.meet.jitsi:5280/http-bind; 38 | proxy_set_header X-Forwarded-For $remote_addr; 39 | proxy_set_header Host meet.jitsi; 40 | } 41 | 42 | location ~ ^/([^/?&:'"]+)$ { 43 | try_files $uri @root_path; 44 | } 45 | 46 | location @root_path { 47 | rewrite ^/(.*)$ / break; 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # breakout-rooms 2 | Breakout-rooms add-on to to the Jitsi Meet and Jitsi Videobridge projects. Also includes a prometheus endpoint for the videoserver that you can poll to get statistics. 3 | 4 | ## prerequisites 5 | - Docker 6 | - Docker compose 7 | - Bash 8 | 9 | ## installation (work in progress) 10 | Copy the example.env file to .env and change the MYPUBLICURL and MYCONTACTEMAIL to your url and contact email. The letsencrypt script will attempt to create an ssh certificate for that url, so it needs to be something in your control. 11 | 12 | ### bundle the files into a zip file 13 | ``` 14 | . ./zip.sh 15 | ``` 16 | Will create two zip files. Copy them to the server you want to install breakout-rooms 17 | 18 | ### download and install jitsi docker 19 | 20 | ``` 21 | git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet 22 | 23 | mkdir /config 24 | mkdir -p /config/{web/letsencrypt,transcripts,prosody,jicofo,jvb} 25 | ``` 26 | To create the folders we need, do 27 | ``` 28 | docker-compose up -d 29 | ``` 30 | Then do 31 | ``` 32 | docker-compose down 33 | ``` 34 | 35 | ### add the breakout-rooms software 36 | 37 | ``` 38 | export CONFIG=/config 39 | mkdir /docker-websocket 40 | unzip /docker-websocket.zip -d /docker-websocket 41 | mkdir /additional-config 42 | unzip /additional-config.zip -d / 43 | cp /additional-config/docker-compose.yml /docker-jitsi-meet/ 44 | ``` 45 | Start all the services using: 46 | ``` 47 | . /additional-config/scripts/start-all.sh 48 | ``` -------------------------------------------------------------------------------- /additional-config/README: -------------------------------------------------------------------------------- 1 | Copyright 2020 Itude Mobile BV 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | *************************************************************************************************** 15 | 16 | 17 | 18 | Jitsi-meet with Breakout rooms 19 | v 1.0 20 | *************************************************************************************************** 21 | 22 | *** To start, stop or restart the services, use: 23 | . /additional-config/scripts/start-all.sh 24 | . /additional-config/scripts/stop-all.sh 25 | . /additional-config/scripts/restart-all.sh 26 | 27 | *** Breakout rooms website 28 | The web interface is available at https://[host]/ws/moderator.html 29 | The web resources can be modified in the folder /docker-websocket/public . 30 | The folder /docker-websocket/public is shared with a docker container running a node.js websocket 31 | and serving the web resources. 32 | Changes to the web resources are immediately reflected after browser reload 33 | 34 | *** Jitsi meet installation 35 | Nginx and Jitsi interface files can be modified in /additional-config/ 36 | Running the restart-all.sh script or start-all.sh script copies the ngingx and jitsi files to 37 | the jitsi-web container and (re)starts the services. 38 | The /config folder is shared with the running jitsi docker instances. Copying a file to this folder 39 | shares it with the docker instances, but it may need a restart of the container to pick up the file. 40 | /config/web is shared with the jitsi web server 41 | /config/jvb with the jitsi video bridge 42 | etc. 43 | 44 | *** SSL certificate renewal 45 | The SSL certificate is created and renewed by certbot. Certbot has a rate limiter of 5 renewals / week. 46 | A cron job runs every week, renewing the certificate. It can be manually run with the script: 47 | . /additional-config/scripts/renew-ssl.sh 48 | This can be customized in the crontab with crontab -e 49 | 50 | *** Restart services 51 | The jitsi video conferencing software can get slower after several week of uptime. 52 | To remedy this, the script . /additional-config/scripts/restart-all.sh runs every day at 00:00 UTC. This can be customized 53 | in the cron tab with crontab -e -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Itude Mobile BV 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | const request = require('request'); 17 | const WebSocket = require('ws'); 18 | let express = require('express') 19 | let app = express(); 20 | let expressWs = require('express-ws')(app); 21 | let path = require('path'); 22 | 23 | 24 | // Serve static files if no route matches 25 | app.use(express.static(path.join(__dirname, 'public'))); 26 | 27 | /**************** Websocket ***************/ 28 | 29 | function noop() { } 30 | 31 | function heartbeat() { 32 | console.log("Heartbeat received"); 33 | this.isAlive = true; 34 | } 35 | 36 | var wss = expressWs.getWss(); 37 | wss.on('connection', function connection(ws) { 38 | ws.isAlive = true; 39 | ws.on('pong', heartbeat); 40 | }); 41 | 42 | const interval = setInterval(function ping() { 43 | wss.clients.forEach(function each(ws) { 44 | if (ws.isAlive === false) { 45 | console.log("Terminated websocket client"); 46 | return ws.terminate(); 47 | } 48 | ws.isAlive = false; 49 | ws.ping(noop); 50 | }); 51 | }, 30000); 52 | 53 | const fs = require('fs'); 54 | 55 | app.get('/prometheus-stats', async function (req, res){ 56 | let url = "http://docker-jitsi-meet_jvb_1:8080/colibri/stats"; 57 | let options = {json: true}; 58 | 59 | request(url, options, (error, queryResponse, body) => { 60 | if (error) { 61 | res.error("Stats not available"); 62 | return console.log(error) 63 | }; 64 | 65 | if (!error && queryResponse.statusCode == 200) { 66 | let json = (body); 67 | // enumerate keys and values 68 | let output = ""; 69 | for (var key of Object.keys(json)) { 70 | if ("version" == key || "current_timestamp" == key 71 | || "graceful_shutdown" == key 72 | || Array.isArray(json[key])){ 73 | //for now, ignore arrays 74 | } 75 | else{ 76 | output = output + "jitsi_stats_" + key + " " + json[key] + "\n"; 77 | console.log(key + " " + json[key]) 78 | } 79 | } 80 | res.send(output); 81 | }; 82 | }); 83 | 84 | // http get localhost:8080/colibri/stats 85 | // parse json to text 86 | }); 87 | 88 | app.ws('/', function (ws, req) { 89 | ws.on('message', function (msg) { 90 | console.log("Dashboard: websocket received ", msg); 91 | //ws.send(msg); //echo back 92 | try { 93 | if (msg.startsWith("SUB:")){ 94 | var path = msg.substring(4); 95 | ws.path = path; 96 | console.log('Subscribed to :' + path) 97 | } 98 | else if (msg.startsWith("PUB:")){ 99 | var path = msg.substring(4); 100 | expressWs.getWss().clients.forEach(function each(client) { 101 | if (path.startsWith(client.path) && client !== ws && client.readyState === WebSocket.OPEN) { 102 | client.send(msg); 103 | } 104 | }); 105 | } 106 | else { 107 | console.log("Unrecognized message format, terminating websocket"); 108 | ws.terminate(); 109 | } 110 | } catch (error) { 111 | console.log(error); 112 | console.log("Most likely an attempt to breach security, terminating websocket"); 113 | ws.terminate(); 114 | } 115 | }); 116 | }); 117 | 118 | 119 | /**************** Start the server ****************/ 120 | 121 | app.listen(8888, () => { 122 | console.log('Okku Dashboard listening on port 8888!') 123 | }); 124 | 125 | module.exports = app -------------------------------------------------------------------------------- /public/js/wurk-1.0.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Itude Mobile BV 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | function uuidv4() { 18 | return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => 19 | (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) 20 | ); 21 | } 22 | 23 | function isCompatibleBrowser (){ 24 | // based on Duck Typing 25 | 26 | // Opera 8.0+ 27 | var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; 28 | 29 | // Firefox 1.0+ 30 | let isFirefox = typeof InstallTrigger !== 'undefined'; 31 | 32 | // Safari 3.0+ "[object HTMLElementConstructor]" 33 | let isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification)); 34 | 35 | // Internet Explorer 6-11 36 | let isIE = /*@cc_on!@*/false || !!document.documentMode; 37 | 38 | // Edge 20+ 39 | let isEdge = !isIE && !!window.StyleMedia; 40 | 41 | // Chrome 1+ 42 | let isChrome = !!window.chrome; 43 | 44 | if (isChrome || isEdge || isFirefox){ 45 | console.log('Supported browser detected'); 46 | return true; 47 | } 48 | else{ 49 | $("#incompatibleBrowser").modal("show"); 50 | return false; 51 | } 52 | } 53 | 54 | // set up locations of scripts and servers 55 | let wsUri = 'wss://'+window.location.host+'/ws/'; 56 | let jitsiDomain = window.location.host; 57 | var head = document.getElementsByTagName('head')[0]; 58 | var script = document.createElement('script'); 59 | script.src = '/external_api.js'; 60 | if (window.location.protocol == 'file:') { 61 | // for local testing 62 | wsUri = 'wss://dev.wurk.app/ws/'; 63 | jitsiDomain = 'dev.wurk.app'; 64 | script.src = 'https://dev.wurk.app/external_api.js'; 65 | } 66 | head.appendChild(script); 67 | 68 | function pad(num, padlen, padchar) { 69 | var pad_char = typeof padchar !== 'undefined' ? padchar : '0'; 70 | var pad = new Array(1 + padlen).join(pad_char); 71 | return (pad + num).slice(-pad.length); 72 | } 73 | 74 | function getRemainingTime() { 75 | let duration = (timeboxEnd - new Date()); 76 | var diffHrs = pad(Math.floor((duration % 86400000) / 3600000), 2); // hours 77 | var diffMins = pad(Math.floor(((duration % 86400000) % 3600000) / 60000), 2); 78 | var diffSecs = pad(Math.floor(((duration % 86400000) % 60000) / 1000), 2); 79 | return `${diffHrs}:${diffMins}:${diffSecs}` 80 | } 81 | 82 | function linkify(text) { 83 | let urlRegex =/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; 84 | return text.replace(urlRegex, function(url) { 85 | return "" + url + ""; 86 | }); 87 | } 88 | var output; 89 | let websocket; 90 | function init() { 91 | websocket = new WebSocket(wsUri); 92 | websocket.onopen = function (evt) { onOpen(evt) }; 93 | websocket.onclose = function (evt) { onClose(evt) }; 94 | websocket.onmessage = function (evt) { onMessage(evt) }; 95 | websocket.onerror = function (evt) { onError(evt) }; 96 | websocket.onping = function(evt) { heartbeat() }; 97 | output = document.getElementById("log"); 98 | if (window.location.protocol != 'file:'){ 99 | output.style.display="none"; 100 | } 101 | } 102 | function onClose(evt) { 103 | clearTimeout(this.pingTimeout); 104 | writeToScreen("DISCONNECTED"); 105 | } 106 | function heartbeat() { 107 | clearTimeout(this.pingTimeout); 108 | // Delay is be equal to the interval at which server 109 | // sends out pings plus a conservative assumption of the latency. 110 | this.pingTimeout = setTimeout(() => { 111 | this.terminate(); 112 | }, 30000 + 1000); 113 | } 114 | function onError(evt) { 115 | writeToScreen('ERROR: ' + evt.data); 116 | } 117 | function doSend(message) { 118 | writeToScreen("SENT: " + message); 119 | websocket.send(message); 120 | } 121 | function writeToScreen(message) { 122 | var pre = document.createElement("p"); 123 | pre.style.wordWrap = "break-word"; 124 | pre.innerHTML = message; 125 | output.appendChild(pre); 126 | console.log(message); 127 | } 128 | window.addEventListener("load", init, false); 129 | -------------------------------------------------------------------------------- /additional-config/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | # Frontend 5 | web: 6 | image: jitsi/web:latest 7 | restart: ${RESTART_POLICY} 8 | ports: 9 | - '${HTTP_PORT}:80' 10 | - '${HTTPS_PORT}:443' 11 | volumes: 12 | - ${CONFIG}/web:/config:Z 13 | - ${CONFIG}/web/letsencrypt:/etc/letsencrypt:Z 14 | - ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z 15 | environment: 16 | - ENABLE_AUTH 17 | - ENABLE_GUESTS 18 | - ENABLE_LETSENCRYPT 19 | - ENABLE_HTTP_REDIRECT 20 | - ENABLE_TRANSCRIPTIONS 21 | - DISABLE_HTTPS 22 | - JICOFO_AUTH_USER 23 | - LETSENCRYPT_DOMAIN 24 | - LETSENCRYPT_EMAIL 25 | - PUBLIC_URL 26 | - XMPP_DOMAIN 27 | - XMPP_AUTH_DOMAIN 28 | - XMPP_BOSH_URL_BASE 29 | - XMPP_GUEST_DOMAIN 30 | - XMPP_MUC_DOMAIN 31 | - XMPP_RECORDER_DOMAIN 32 | - ETHERPAD_URL_BASE 33 | - ETHERPAD_PUBLIC_URL 34 | - TZ 35 | - JIBRI_BREWERY_MUC 36 | - JIBRI_PENDING_TIMEOUT 37 | - JIBRI_XMPP_USER 38 | - JIBRI_XMPP_PASSWORD 39 | - JIBRI_RECORDER_USER 40 | - JIBRI_RECORDER_PASSWORD 41 | - ENABLE_RECORDING 42 | networks: 43 | meet.jitsi: 44 | aliases: 45 | - ${XMPP_DOMAIN} 46 | 47 | # XMPP server 48 | prosody: 49 | image: jitsi/prosody:latest 50 | restart: ${RESTART_POLICY} 51 | expose: 52 | - '5222' 53 | - '5347' 54 | - '5280' 55 | volumes: 56 | - ${CONFIG}/prosody/config:/config:Z 57 | - ${CONFIG}/prosody/prosody-plugins-custom:/prosody-plugins-custom:Z 58 | environment: 59 | - AUTH_TYPE 60 | - ENABLE_AUTH 61 | - ENABLE_GUESTS 62 | - ENABLE_LOBBY 63 | - GLOBAL_MODULES 64 | - GLOBAL_CONFIG 65 | - LDAP_URL 66 | - LDAP_BASE 67 | - LDAP_BINDDN 68 | - LDAP_BINDPW 69 | - LDAP_FILTER 70 | - LDAP_AUTH_METHOD 71 | - LDAP_VERSION 72 | - LDAP_USE_TLS 73 | - LDAP_TLS_CIPHERS 74 | - LDAP_TLS_CHECK_PEER 75 | - LDAP_TLS_CACERT_FILE 76 | - LDAP_TLS_CACERT_DIR 77 | - LDAP_START_TLS 78 | - XMPP_DOMAIN 79 | - XMPP_AUTH_DOMAIN 80 | - XMPP_GUEST_DOMAIN 81 | - XMPP_MUC_DOMAIN 82 | - XMPP_INTERNAL_MUC_DOMAIN 83 | - XMPP_MODULES 84 | - XMPP_MUC_MODULES 85 | - XMPP_INTERNAL_MUC_MODULES 86 | - XMPP_RECORDER_DOMAIN 87 | - JICOFO_COMPONENT_SECRET 88 | - JICOFO_AUTH_USER 89 | - JICOFO_AUTH_PASSWORD 90 | - JVB_AUTH_USER 91 | - JVB_AUTH_PASSWORD 92 | - JIGASI_XMPP_USER 93 | - JIGASI_XMPP_PASSWORD 94 | - JIBRI_XMPP_USER 95 | - JIBRI_XMPP_PASSWORD 96 | - JIBRI_RECORDER_USER 97 | - JIBRI_RECORDER_PASSWORD 98 | - JWT_APP_ID 99 | - JWT_APP_SECRET 100 | - JWT_ACCEPTED_ISSUERS 101 | - JWT_ACCEPTED_AUDIENCES 102 | - JWT_ASAP_KEYSERVER 103 | - JWT_ALLOW_EMPTY 104 | - JWT_AUTH_TYPE 105 | - JWT_TOKEN_AUTH_MODULE 106 | - LOG_LEVEL 107 | - TZ 108 | networks: 109 | meet.jitsi: 110 | aliases: 111 | - ${XMPP_SERVER} 112 | 113 | # Focus component 114 | jicofo: 115 | image: jitsi/jicofo:latest 116 | restart: ${RESTART_POLICY} 117 | volumes: 118 | - ${CONFIG}/jicofo:/config:Z 119 | environment: 120 | - AUTH_TYPE 121 | - ENABLE_AUTH 122 | - XMPP_DOMAIN 123 | - XMPP_AUTH_DOMAIN 124 | - XMPP_INTERNAL_MUC_DOMAIN 125 | - XMPP_SERVER 126 | - JICOFO_COMPONENT_SECRET 127 | - JICOFO_AUTH_USER 128 | - JICOFO_AUTH_PASSWORD 129 | - JICOFO_RESERVATION_REST_BASE_URL 130 | - JVB_BREWERY_MUC 131 | - JIGASI_BREWERY_MUC 132 | - JIGASI_SIP_URI 133 | - JIBRI_BREWERY_MUC 134 | - JIBRI_PENDING_TIMEOUT 135 | - TZ 136 | depends_on: 137 | - prosody 138 | networks: 139 | meet.jitsi: 140 | 141 | # Video bridge 142 | jvb: 143 | image: jitsi/jvb:latest 144 | restart: ${RESTART_POLICY} 145 | ports: 146 | - '${JVB_PORT}:${JVB_PORT}/udp' 147 | - '${JVB_TCP_PORT}:${JVB_TCP_PORT}' 148 | - '8080:8080' 149 | volumes: 150 | - ${CONFIG}/jvb:/config:Z 151 | environment: 152 | - DOCKER_HOST_ADDRESS 153 | - XMPP_AUTH_DOMAIN 154 | - XMPP_INTERNAL_MUC_DOMAIN 155 | - XMPP_SERVER 156 | - JVB_AUTH_USER 157 | - JVB_AUTH_PASSWORD 158 | - JVB_BREWERY_MUC 159 | - JVB_PORT 160 | - JVB_TCP_HARVESTER_DISABLED 161 | - JVB_TCP_PORT 162 | - JVB_STUN_SERVERS 163 | - JVB_ENABLE_APIS 164 | - TZ 165 | depends_on: 166 | - prosody 167 | networks: 168 | meet.jitsi: 169 | 170 | # Custom network so all services can communicate using a FQDN 171 | networks: 172 | meet.jitsi: 173 | -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | # 2 | # Basic configuration options 3 | # 4 | 5 | # Directory where all configuration will be stored 6 | CONFIG=~/.jitsi-meet-cfg 7 | 8 | # Exposed HTTP port 9 | HTTP_PORT=80 10 | 11 | # Exposed HTTPS port 12 | HTTPS_PORT=443 13 | 14 | # System time zone 15 | TZ=Europe/Amsterdam 16 | 17 | # Public URL for the web service 18 | PUBLIC_URL=https://MYPUBLICURL 19 | 20 | # IP address of the Docker host 21 | # See the "Running behind NAT or on a LAN environment" section in the README 22 | #DOCKER_HOST_ADDRESS=192.168.1.1 23 | 24 | 25 | # 26 | # Let's Encrypt configuration 27 | # 28 | 29 | # Enable Let's Encrypt certificate generation 30 | ENABLE_LETSENCRYPT=1 31 | 32 | # Domain for which to generate the certificate 33 | LETSENCRYPT_DOMAIN=MYPUBLICURL 34 | 35 | # E-Mail for receiving important account notifications (mandatory) 36 | LETSENCRYPT_EMAIL=MYCONTACTEMAIL 37 | 38 | 39 | # 40 | # Etherpad integration (for document sharing) 41 | # 42 | 43 | # Set etherpad-lite URL (uncomment to enable) 44 | #ETHERPAD_URL_BASE=http://etherpad.meet.jitsi:9001 45 | 46 | 47 | # 48 | # Basic Jigasi configuration options (needed for SIP gateway support) 49 | # 50 | 51 | # SIP URI for incoming / outgoing calls 52 | #JIGASI_SIP_URI=test@sip2sip.info 53 | 54 | # Password for the specified SIP account as a clear text 55 | #JIGASI_SIP_PASSWORD=passw0rd 56 | 57 | # SIP server (use the SIP account domain if in doubt) 58 | #JIGASI_SIP_SERVER=sip2sip.info 59 | 60 | # SIP server port 61 | #JIGASI_SIP_PORT=5060 62 | 63 | # SIP server transport 64 | #JIGASI_SIP_TRANSPORT=UDP 65 | 66 | # 67 | # Authentication configuration (see README for details) 68 | # 69 | 70 | # Enable authentication 71 | #ENABLE_AUTH=1 72 | 73 | # Enable guest access 74 | #ENABLE_GUESTS=1 75 | 76 | # Select authentication type: internal, jwt or ldap 77 | #AUTH_TYPE=internal 78 | 79 | # JWT authentication 80 | # 81 | 82 | # Application identifier 83 | #JWT_APP_ID=my_jitsi_app_id 84 | 85 | # Application secret known only to your token 86 | #JWT_APP_SECRET=my_jitsi_app_secret 87 | 88 | # (Optional) Set asap_accepted_issuers as a comma separated list 89 | #JWT_ACCEPTED_ISSUERS=my_web_client,my_app_client 90 | 91 | # (Optional) Set asap_accepted_audiences as a comma separated list 92 | #JWT_ACCEPTED_AUDIENCES=my_server1,my_server2 93 | 94 | 95 | # LDAP authentication (for more information see the Cyrus SASL saslauthd.conf man page) 96 | # 97 | 98 | # LDAP url for connection 99 | #LDAP_URL=ldaps://ldap.domain.com/ 100 | 101 | # LDAP base DN. Can be empty 102 | #LDAP_BASE=DC=example,DC=domain,DC=com 103 | 104 | # LDAP user DN. Do not specify this parameter for the anonymous bind 105 | #LDAP_BINDDN=CN=binduser,OU=users,DC=example,DC=domain,DC=com 106 | 107 | # LDAP user password. Do not specify this parameter for the anonymous bind 108 | #LDAP_BINDPW=LdapUserPassw0rd 109 | 110 | # LDAP filter. Tokens example: 111 | # %1-9 - if the input key is user@mail.domain.com, then %1 is com, %2 is domain and %3 is mail 112 | # %s - %s is replaced by the complete service string 113 | # %r - %r is replaced by the complete realm string 114 | #LDAP_FILTER=(sAMAccountName=%u) 115 | 116 | # LDAP authentication method 117 | #LDAP_AUTH_METHOD=bind 118 | 119 | # LDAP version 120 | #LDAP_VERSION=3 121 | 122 | # LDAP TLS using 123 | #LDAP_USE_TLS=1 124 | 125 | # List of SSL/TLS ciphers to allow 126 | #LDAP_TLS_CIPHERS=SECURE256:SECURE128:!AES-128-CBC:!ARCFOUR-128:!CAMELLIA-128-CBC:!3DES-CBC:!CAMELLIA-128-CBC 127 | 128 | # Require and verify server certificate 129 | #LDAP_TLS_CHECK_PEER=1 130 | 131 | # Path to CA cert file. Used when server sertificate verify is enabled 132 | #LDAP_TLS_CACERT_FILE=/etc/ssl/certs/ca-certificates.crt 133 | 134 | # Path to CA certs directory. Used when server sertificate verify is enabled 135 | #LDAP_TLS_CACERT_DIR=/etc/ssl/certs 136 | 137 | # Wether to use starttls, implies LDAPv3 and requires ldap:// instead of ldaps:// 138 | # LDAP_START_TLS=1 139 | 140 | 141 | # 142 | # Advanced configuration options (you generally don't need to change these) 143 | # 144 | 145 | # Internal XMPP domain 146 | XMPP_DOMAIN=meet.jitsi 147 | 148 | # Internal XMPP server 149 | XMPP_SERVER=xmpp.meet.jitsi 150 | 151 | # Internal XMPP server URL 152 | XMPP_BOSH_URL_BASE=http://xmpp.meet.jitsi:5280 153 | 154 | # Internal XMPP domain for authenticated services 155 | XMPP_AUTH_DOMAIN=auth.meet.jitsi 156 | 157 | # XMPP domain for the MUC 158 | XMPP_MUC_DOMAIN=muc.meet.jitsi 159 | 160 | # XMPP domain for the internal MUC used for jibri, jigasi and jvb pools 161 | XMPP_INTERNAL_MUC_DOMAIN=internal-muc.meet.jitsi 162 | 163 | # XMPP domain for unauthenticated users 164 | XMPP_GUEST_DOMAIN=guest.meet.jitsi 165 | 166 | # Custom Prosody modules for XMPP_DOMAIN (comma separated) 167 | XMPP_MODULES= 168 | 169 | # Custom Prosody modules for MUC component (comma separated) 170 | XMPP_MUC_MODULES= 171 | 172 | # Custom Prosody modules for internal MUC component (comma separated) 173 | XMPP_INTERNAL_MUC_MODULES= 174 | 175 | # MUC for the JVB pool 176 | JVB_BREWERY_MUC=jvbbrewery 177 | 178 | # XMPP user for JVB client connections 179 | JVB_AUTH_USER=jvb 180 | 181 | # XMPP password for JVB client connections 182 | JVB_AUTH_PASSWORD=passw0rd 183 | 184 | # STUN servers used to discover the server's public IP 185 | JVB_STUN_SERVERS=meet-jit-si-turnrelay.jitsi.net:443 186 | 187 | # Media port for the Jitsi Videobridge 188 | JVB_PORT=10000 189 | 190 | # TCP Fallback for Jitsi Videobridge for when UDP isn't available 191 | JVB_TCP_HARVESTER_DISABLED=true 192 | JVB_TCP_PORT=4443 193 | 194 | # A comma separated list of APIs to enable when the JVB is started [default: none] 195 | # See https://github.com/jitsi/jitsi-videobridge/blob/master/doc/rest.md for more information 196 | #JVB_ENABLE_APIS=rest,colibri 197 | 198 | # XMPP component password for Jicofo 199 | JICOFO_COMPONENT_SECRET=s3cr37 200 | 201 | # XMPP user for Jicofo client connections. 202 | # NOTE: this option doesn't currently work due to a bug 203 | JICOFO_AUTH_USER=focus 204 | 205 | # XMPP password for Jicofo client connections 206 | JICOFO_AUTH_PASSWORD=passw0rd 207 | 208 | # Base URL of Jicofo's reservation REST API 209 | #JICOFO_RESERVATION_REST_BASE_URL=http://reservation.example.com 210 | 211 | # XMPP user for Jigasi MUC client connections 212 | JIGASI_XMPP_USER=jigasi 213 | 214 | # XMPP password for Jigasi MUC client connections 215 | JIGASI_XMPP_PASSWORD=passw0rd 216 | 217 | # MUC name for the Jigasi pool 218 | JIGASI_BREWERY_MUC=jigasibrewery 219 | 220 | # Minimum port for media used by Jigasi 221 | JIGASI_PORT_MIN=20000 222 | 223 | # Maximum port for media used by Jigasi 224 | JIGASI_PORT_MAX=20050 225 | 226 | # Enable SDES srtp 227 | #JIGASI_ENABLE_SDES_SRTP=1 228 | 229 | # Keepalive method 230 | #JIGASI_SIP_KEEP_ALIVE_METHOD=OPTIONS 231 | 232 | # Health-check extension 233 | #JIGASI_HEALTH_CHECK_SIP_URI=keepalive 234 | 235 | # Health-check interval 236 | #JIGASI_HEALTH_CHECK_INTERVAL=300000 237 | # 238 | # Enable Jigasi transcription 239 | #ENABLE_TRANSCRIPTIONS=1 240 | 241 | # Jigasi will record audio when transcriber is on [default: false] 242 | #JIGASI_TRANSCRIBER_RECORD_AUDIO=true 243 | 244 | # Jigasi will send transcribed text to the chat when transcriber is on [default: false] 245 | #JIGASI_TRANSCRIBER_SEND_TXT=true 246 | 247 | # Jigasi will post an url to the chat with transcription file [default: false] 248 | #JIGASI_TRANSCRIBER_ADVERTISE_URL=true 249 | 250 | # Credentials for connect to Cloud Google API from Jigasi 251 | # Please read https://cloud.google.com/text-to-speech/docs/quickstart-protocol 252 | # section "Before you begin" paragraph 1 to 5 253 | # Copy the values from the json to the related env vars 254 | #GC_PROJECT_ID= 255 | #GC_PRIVATE_KEY_ID= 256 | #GC_PRIVATE_KEY= 257 | #GC_CLIENT_EMAIL= 258 | #GC_CLIENT_ID= 259 | #GC_CLIENT_CERT_URL= 260 | 261 | # Enable recording 262 | #ENABLE_RECORDING=1 263 | 264 | # XMPP domain for the jibri recorder 265 | XMPP_RECORDER_DOMAIN=recorder.meet.jitsi 266 | 267 | # XMPP recorder user for Jibri client connections 268 | JIBRI_RECORDER_USER=recorder 269 | 270 | # XMPP recorder password for Jibri client connections 271 | JIBRI_RECORDER_PASSWORD=passw0rd 272 | 273 | # Directory for recordings inside Jibri container 274 | JIBRI_RECORDING_DIR=/config/recordings 275 | 276 | # The finalizing script. Will run after recording is complete 277 | JIBRI_FINALIZE_RECORDING_SCRIPT_PATH=/config/finalize.sh 278 | 279 | # XMPP user for Jibri client connections 280 | JIBRI_XMPP_USER=jibri 281 | 282 | # XMPP password for Jibri client connections 283 | JIBRI_XMPP_PASSWORD=passw0rd 284 | 285 | # MUC name for the Jibri pool 286 | JIBRI_BREWERY_MUC=jibribrewery 287 | 288 | # MUC connection timeout 289 | JIBRI_PENDING_TIMEOUT=90 290 | 291 | # When jibri gets a request to start a service for a room, the room 292 | # jid will look like: roomName@optional.prefixes.subdomain.xmpp_domain 293 | # We'll build the url for the call by transforming that into: 294 | # https://xmpp_domain/subdomain/roomName 295 | # So if there are any prefixes in the jid (like jitsi meet, which 296 | # has its participants join a muc at conference.xmpp_domain) then 297 | # list that prefix here so it can be stripped out to generate 298 | # the call url correctly 299 | JIBRI_STRIP_DOMAIN_JID=muc 300 | 301 | # Directory for logs inside Jibri container 302 | JIBRI_LOGS_DIR=/config/logs 303 | 304 | # Disable HTTPS: handle TLS connections outside of this setup 305 | #DISABLE_HTTPS=1 306 | 307 | # Redirect HTTP traffic to HTTPS 308 | # Necessary for Let's Encrypt, relies on standard HTTPS port (443) 309 | ENABLE_HTTP_REDIRECT=1 310 | -------------------------------------------------------------------------------- /additional-config/interface_config.js: -------------------------------------------------------------------------------- 1 | var interfaceConfig = { 2 | // TO FIX: this needs to be handled from SASS variables. There are some 3 | // methods allowing to use variables both in css and js. 4 | DEFAULT_BACKGROUND: '#474747', 5 | 6 | /** 7 | * Whether or not the blurred video background for large video should be 8 | * displayed on browsers that can support it. 9 | */ 10 | DISABLE_VIDEO_BACKGROUND: false, 11 | 12 | INITIAL_TOOLBAR_TIMEOUT: 20000, 13 | TOOLBAR_TIMEOUT: 4000, 14 | TOOLBAR_ALWAYS_VISIBLE: false, 15 | DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Wurker', 16 | DEFAULT_LOCAL_DISPLAY_NAME: 'me', 17 | SHOW_JITSI_WATERMARK: false, 18 | JITSI_WATERMARK_LINK: 'https://jitsi.org', 19 | 20 | // if watermark is disabled by default, it can be shown only for guests 21 | SHOW_WATERMARK_FOR_GUESTS: false, 22 | SHOW_BRAND_WATERMARK: false, 23 | BRAND_WATERMARK_LINK: '', 24 | SHOW_POWERED_BY: false, 25 | SHOW_DEEP_LINKING_IMAGE: false, 26 | GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true, 27 | DISPLAY_WELCOME_PAGE_CONTENT: true, 28 | DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false, 29 | APP_NAME: 'WURK', 30 | NATIVE_APP_NAME: 'WURK', 31 | PROVIDER_NAME: 'WURK.APP', 32 | LANG_DETECTION: true, // Allow i18n to detect the system language 33 | INVITATION_POWERED_BY: true, 34 | 35 | /** 36 | * If we should show authentication block in profile 37 | */ 38 | AUTHENTICATION_ENABLE: true, 39 | 40 | /** 41 | * The name of the toolbar buttons to display in the toolbar. If present, 42 | * the button will display. Exceptions are "livestreaming" and "recording" 43 | * which also require being a moderator and some values in config.js to be 44 | * enabled. Also, the "profile" button will not display for user's with a 45 | * jwt. 46 | */ 47 | TOOLBAR_BUTTONS: [ 48 | 'microphone', 'camera', 'desktop', 'fullscreen', 49 | 'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording', 50 | 'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand', 51 | 'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts', 52 | 'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone', 53 | 'e2ee' 54 | ], 55 | 56 | SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ], 57 | 58 | // Determines how the video would fit the screen. 'both' would fit the whole 59 | // screen, 'height' would fit the original video height to the height of the 60 | // screen, 'width' would fit the original video width to the width of the 61 | // screen respecting ratio. 62 | VIDEO_LAYOUT_FIT: 'both', 63 | 64 | /** 65 | * Whether to only show the filmstrip (and hide the toolbar). 66 | */ 67 | filmStripOnly: false, 68 | 69 | /** 70 | * Whether to show thumbnails in filmstrip as a column instead of as a row. 71 | */ 72 | VERTICAL_FILMSTRIP: true, 73 | 74 | // A html text to be shown to guests on the close page, false disables it 75 | CLOSE_PAGE_GUEST_HINT: false, 76 | SHOW_PROMOTIONAL_CLOSE_PAGE: false, 77 | RANDOM_AVATAR_URL_PREFIX: false, 78 | RANDOM_AVATAR_URL_SUFFIX: false, 79 | FILM_STRIP_MAX_HEIGHT: 120, 80 | 81 | // Enables feedback star animation. 82 | ENABLE_FEEDBACK_ANIMATION: false, 83 | DISABLE_FOCUS_INDICATOR: false, 84 | DISABLE_DOMINANT_SPEAKER_INDICATOR: false, 85 | 86 | /** 87 | * Whether the speech to text transcription subtitles panel is disabled. 88 | * If {@code undefined}, defaults to {@code false}. 89 | * 90 | * @type {boolean} 91 | */ 92 | DISABLE_TRANSCRIPTION_SUBTITLES: false, 93 | 94 | /** 95 | * Whether the ringing sound in the call/ring overlay is disabled. If 96 | * {@code undefined}, defaults to {@code false}. 97 | * 98 | * @type {boolean} 99 | */ 100 | DISABLE_RINGING: false, 101 | AUDIO_LEVEL_PRIMARY_COLOR: 'rgba(255,255,255,0.4)', 102 | AUDIO_LEVEL_SECONDARY_COLOR: 'rgba(255,255,255,0.2)', 103 | POLICY_LOGO: null, 104 | LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9 105 | REMOTE_THUMBNAIL_RATIO: 1, // 1:1 106 | // Documentation reference for the live streaming feature. 107 | LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live', 108 | 109 | /** 110 | * Whether the mobile app Jitsi Meet is to be promoted to participants 111 | * attempting to join a conference in a mobile Web browser. If 112 | * {@code undefined}, defaults to {@code true}. 113 | * 114 | * @type {boolean} 115 | */ 116 | MOBILE_APP_PROMO: true, 117 | 118 | /** 119 | * Maximum coeficient of the ratio of the large video to the visible area 120 | * after the large video is scaled to fit the window. 121 | * 122 | * @type {number} 123 | */ 124 | MAXIMUM_ZOOMING_COEFFICIENT: 1.3, 125 | 126 | /* 127 | * If indicated some of the error dialogs may point to the support URL for 128 | * help. 129 | */ 130 | SUPPORT_URL: 'https://community.jitsi.org/', 131 | 132 | /** 133 | * Whether the connection indicator icon should hide itself based on 134 | * connection strength. If true, the connection indicator will remain 135 | * displayed while the participant has a weak connection and will hide 136 | * itself after the CONNECTION_INDICATOR_HIDE_TIMEOUT when the connection is 137 | * strong. 138 | * 139 | * @type {boolean} 140 | */ 141 | CONNECTION_INDICATOR_AUTO_HIDE_ENABLED: true, 142 | 143 | /** 144 | * How long the connection indicator should remain displayed before hiding. 145 | * Used in conjunction with CONNECTION_INDICATOR_AUTOHIDE_ENABLED. 146 | * 147 | * @type {number} 148 | */ 149 | CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT: 5000, 150 | 151 | /** 152 | * If true, hides the connection indicators completely. 153 | * 154 | * @type {boolean} 155 | */ 156 | CONNECTION_INDICATOR_DISABLED: false, 157 | 158 | /** 159 | * If true, hides the video quality label indicating the resolution status 160 | * of the current large video. 161 | * 162 | * @type {boolean} 163 | */ 164 | VIDEO_QUALITY_LABEL_DISABLED: false, 165 | 166 | /** 167 | * If true, will display recent list 168 | * 169 | * @type {boolean} 170 | */ 171 | RECENT_LIST_ENABLED: true, 172 | 173 | // Names of browsers which should show a warning stating the current browser 174 | // has a suboptimal experience. Browsers which are not listed as optimal or 175 | // unsupported are considered suboptimal. Valid values are: 176 | // chrome, chromium, edge, electron, firefox, nwjs, opera, safari 177 | OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'nwjs', 'electron', 'safari' ], 178 | 179 | // Browsers, in addition to those which do not fully support WebRTC, that 180 | // are not supported and should show the unsupported browser page. 181 | UNSUPPORTED_BROWSERS: [], 182 | 183 | /** 184 | * A UX mode where the last screen share participant is automatically 185 | * pinned. Valid values are the string "remote-only" so remote participants 186 | * get pinned but not local, otherwise any truthy value for all participants, 187 | * and any falsy value to disable the feature. 188 | * 189 | * Note: this mode is experimental and subject to breakage. 190 | */ 191 | AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only', 192 | 193 | /** 194 | * If true, presence status: busy, calling, connected etc. is not displayed. 195 | */ 196 | DISABLE_PRESENCE_STATUS: false, 197 | 198 | /** 199 | * If true, notifications regarding joining/leaving are no longer displayed. 200 | */ 201 | DISABLE_JOIN_LEAVE_NOTIFICATIONS: false, 202 | 203 | /** 204 | * Decides whether the chrome extension banner should be rendered on the landing page and during the meeting. 205 | * If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s) 206 | * being already installed is done before rendering. 207 | */ 208 | SHOW_CHROME_EXTENSION_BANNER: false, 209 | 210 | /** 211 | * When enabled, the kick participant button will not be presented for users without a JWT 212 | */ 213 | // HIDE_KICK_BUTTON_FOR_GUESTS: false, 214 | 215 | /** 216 | * How many columns the tile view can expand to. The respected range is 217 | * between 1 and 5. 218 | */ 219 | // TILE_VIEW_MAX_COLUMNS: 5, 220 | 221 | /** 222 | * Specify custom URL for downloading android mobile app. 223 | */ 224 | // MOBILE_DOWNLOAD_LINK_ANDROID: 'https://play.google.com/store/apps/details?id=org.jitsi.meet', 225 | 226 | /** 227 | * Specify URL for downloading ios mobile app. 228 | */ 229 | // MOBILE_DOWNLOAD_LINK_IOS: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905', 230 | 231 | /** 232 | * Specify mobile app scheme for opening the app from the mobile browser. 233 | */ 234 | // APP_SCHEME: 'org.jitsi.meet', 235 | 236 | /** 237 | * Specify the Android app package name. 238 | */ 239 | // ANDROID_APP_PACKAGE: 'org.jitsi.meet', 240 | 241 | /** 242 | * Override the behavior of some notifications to remain displayed until 243 | * explicitly dismissed through a user action. The value is how long, in 244 | * milliseconds, those notifications should remain displayed. 245 | */ 246 | // ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000, 247 | 248 | // List of undocumented settings 249 | /** 250 | INDICATOR_FONT_SIZES 251 | MOBILE_DYNAMIC_LINK 252 | PHONE_NUMBER_REGEX 253 | */ 254 | 255 | // Allow all above example options to include a trailing comma and 256 | // prevent fear when commenting out the last value. 257 | makeJsonParserHappy: 'even if last key had a trailing comma' 258 | 259 | // no configuration value should follow this line. 260 | }; -------------------------------------------------------------------------------- /additional-config/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | 10. This software bundles: 178 | docker, which is available under an Apache 2.0 license. For details see https://docs.docker.com/engine/ 179 | node.js, which is available under a BSD license. For details see https://github.com/nodejs/node/blob/master/LICENSE 180 | jitsi, which is available under an Apache 2.0 license. For details see https://github.com/jitsi/jitsi/blob/master/LICENSE 181 | 182 | END OF TERMS AND CONDITIONS 183 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 |
21 | 22 |You can safely dismiss this message, the remaining time is shown at the top of the window
84 |You are not in a room right now.
79 |Select a room and press 'join' to join in the conversation.
80 | 81 |