Files
crm-calls/README.md
2026-10-14 16:12:54 +00:00

5.7 KiB
Raw Blame History

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 у prosody
  • JVB_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 заблоковано (корпоративні мережі, частина мобільних операторів).

  1. Додати сервіс coturn (наприклад coturn/coturn) у compose або окремим застосунком у Coolify, network_mode: host або опублікувати порти.
  2. Пробросити на роутері до 192.168.50.73:
    • 3478 UDP і TCP (TURN/STUN),
    • 5349 TCP (TURNS/TLS) — або краще TURNS на 443 окремої IP/піддомену, бо 443 вже зайнятий Traefik,
    • діапазон relay-портів, напр. 49160-49200 UDP (задається в min-port/max-port coturn).
  3. 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.
  4. 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).