5.7 KiB
crm-calls
Jitsi Meet для Tvorymo CRM: https://crm-calls.tes.gd
Розгортання: Coolify (сервер storage, 192.168.50.73), застосунок crm-calls, build pack dockercompose,
файл docker-compose.yml. Основа: офіційний docker-jitsi-meet, образи stable-11248.
Сервіси
| Сервіс | Що робить | Як доступний ззовні |
|---|---|---|
| web | nginx + веб-застосунок Jitsi | HTTPS 443 через Traefik (Coolify) → web:8000 |
| prosody | XMPP-сервер | лише wss://crm-calls.tes.gd/xmpp-websocket (проксі через web) |
| jicofo | фокус конференцій | ззовні не доступний |
| jvb | відеоміст (медіа) | UDP 10000 напряму, повз Traefik |
Colibri-websocket у цій версії Jitsi не використовується: канал «клієнт ↔ JVB» іде через SCTP усередині того самого медіа-з'єднання (UDP 10000). Тому через 443 ходять лише веб і XMPP.
Змінні оточення (Coolify)
Секрети задаються лише в env застосунку в Coolify, у репозиторії їх немає:
JICOFO_AUTH_PASSWORD— пароль jicofo у prosodyJVB_AUTH_PASSWORD— пароль jvb у prosody
Необов'язкові (є значення за замовчуванням у compose):
PUBLIC_URL(https://crm-calls.tes.gd)JVB_ADVERTISE_IPS(46.101.119.200,192.168.50.73)TZ(Europe/Kyiv),DEFAULT_LANGUAGE(uk),JITSI_IMAGE_VERSION(stable-11248)
Мережа: що треба пробросити
Публічна адреса 46.101.119.200, сервер storage — 192.168.50.73 у внутрішній мережі.
| Звідки (зовні) | Куди | Протокол | Навіщо |
|---|---|---|---|
46.101.119.200:10000 |
192.168.50.73:10000 |
UDP | медіа JVB (обов'язково) |
46.101.119.200:80, 443 |
192.168.50.73:80, 443 |
TCP | вже працює (Traefik) |
Також на самому storage має бути відкритий вхідний UDP 10000 (якщо там є ufw/iptables;
порт, опублікований Docker, зазвичай проходить повз ufw).
Перевірка після прокидання (з машини поза мережею):
# на storage:
sudo tcpdump -ni any udp port 10000
# ззовні:
echo test | nc -u -w1 46.101.119.200 10000
У tcpdump має з'явитися пакет. Під час дзвінка в chrome://webrtc-internals вибрана
ICE-пара має бути з віддаленою адресою 46.101.119.200:10000.
Без UDP 10000 сторінка й кімната відкриваються, але дзвінок з 3+ учасниками (через JVB) не матиме звуку/відео. Дзвінок удвох може працювати в режимі P2P (напряму між браузерами через STUN), але не за суворим NAT/корпоративним файрволом — для цього потрібен TURN.
TURN (на майбутнє)
Потрібен для клієнтів, у яких UDP заблоковано (корпоративні мережі, частина мобільних операторів).
- Додати сервіс
coturn(наприкладcoturn/coturn) у compose або окремим застосунком у Coolify,network_mode: hostабо опублікувати порти. - Пробросити на роутері до
192.168.50.73:3478UDP і TCP (TURN/STUN),5349TCP (TURNS/TLS) — або краще TURNS на 443 окремої IP/піддомену, бо 443 вже зайнятий Traefik,- діапазон relay-портів, напр.
49160-49200UDP (задається вmin-port/max-portcoturn).
- coturn:
external-ip=46.101.119.200/192.168.50.73,realm=crm-calls.tes.gd,use-auth-secret,static-auth-secret=<секрет у Coolify env>, TLS-сертифікат для домену TURN (напр.turn.tes.gd) для 5349. - Jitsi: задати в env prosody
TURN_HOST=turn.tes.gd,TURN_PORT=3478,TURNS_HOST=turn.tes.gd,TURNS_PORT=5349,TURN_CREDENTIALS=<той самий секрет>,TURN_TRANSPORT=udp,tcp(prosody черезmod_external_servicesроздає клієнтам тимчасові TURN-облікові дані).
Вбудовування (iframe) у вікі / CRM
- Jitsi nginx не ставить
X-Frame-Options; framing задається черезContent-Security-Policy: frame-ancestors 'self' https://*.tes.gd https://test.units.tvorymo.com(зміннаCSP_HEADERу compose, сервісweb). Щоб додати домен — дописати його туди. - Вбудовувати через
https://crm-calls.tes.gd/external_api.js(JitsiMeetExternalAPI), iframe має матиallow="camera; microphone; display-capture; autoplay; clipboard-write; fullscreen". - Авторизація (postMessage → JWT) поки не налаштована: кімнати відкриті для всіх, хто знає URL.
Для CRM планується
ENABLE_AUTH=1,AUTH_TYPE=jwt,JWT_APP_ID,JWT_APP_SECRET(секрет — лише в Coolify).