crm-calls

Jitsi Meet для Tvorymo CRM: https://crm-calls.volcanic.tes.gd

Розгортання: Coolify Вулканика (http://coolify.volcanic.tes.gd:8000), VPS 164.90.233.156 (DigitalOcean, *.volcanic.tes.gd), проєкт і застосунок 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.volcanic.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

Мережеві (змінюються в env Coolify без правок у репозиторії, після зміни — Redeploy):

  • JVB_PORT — UDP-порт JVB, публікується на хості (10000)
  • JVB_ADVERTISE_IPS — публічні адреси, які JVB повідомляє клієнтам, через кому (164.90.233.156)

Інші: PUBLIC_URL (https://crm-calls.volcanic.tes.gd), TZ (Europe/Kyiv), DEFAULT_LANGUAGE (uk), JITSI_IMAGE_VERSION (stable-11248).

Домен у Coolify (docker_compose_domains): web → https://crm-calls.volcanic.tes.gd:8000. :8000 тут — порт контейнера web, куди Traefik веде трафік; публічна адреса — звичайний HTTPS 443.

Мережа

VPS має публічну адресу 164.90.233.156 безпосередньо на інтерфейсі (без NAT), тому JVB_ADVERTISE_IPS=164.90.233.156.

Порт Протокол Куди Навіщо
443 (і 80) TCP Traefik → web:8000 веб, /xmpp-websocket
10000 UDP jvb (опублікований на хості) медіа і SCTP-канал до JVB

UDP 10000 має бути дозволений і в ufw/iptables на VPS, і в DigitalOcean Cloud Firewall (якщо він прив'язаний до droplet). Порт, опублікований Docker, зазвичай проходить повз ufw, але не повз Cloud Firewall.

Без UDP 10000 сторінка й кімната відкриваються, але аудіо/відео через JVB не буде.

Перевірка: під час дзвінка в chrome://webrtc-internals вибрана ICE-пара має вести на 164.90.233.156:10000 (udp). Або на VPS: sudo tcpdump -ni any udp port 10000 і ззовні echo test | nc -u -w1 164.90.233.156 10000.

TURN (на майбутнє, turn.volcanic.tes.gd)

Потрібен клієнтам, у яких заблокований UDP (корпоративні мережі, частина мобільних операторів). DNS turn.volcanic.tes.gd уже веде на 164.90.233.156 (wildcard).

Варіант 1 — класичний coturn (найкраща якість). Відкрити у файрволі VPS / DO: 3478 UDP+TCP, 5349 TCP (TURNS), relay-діапазон напр. 49160-49200 UDP. coturn: use-auth-secret, static-auth-secret=<секрет у Coolify env>, realm=crm-calls.volcanic.tes.gd, external-ip=164.90.233.156, min-port/max-port = relay-діапазон, TLS-сертифікат для turn.volcanic.tes.gd (5349), denied-peer-ip для приватних мереж.

Варіант 2 — TURNS на 443 через Traefik (нових портів не треба). coturn слухає TCP 3478 лише у внутрішній мережі; TCP-роутер Traefik HostSNI(turn.volcanic.tes.gd) на entrypoint https з TLS (letsencrypt) → coturn:3478. coturn ретранслює медіа на JVB усередині хоста. Працює там, де дозволений лише TCP 443; якість нижча (медіа по TCP).

В обох варіантах Jitsi (env prosody, через Coolify): TURN_CREDENTIALS=<той самий секрет>, TURNS_HOST=turn.volcanic.tes.gd, TURNS_PORT=5349 або 443, для варіанту 1 також TURN_HOST=turn.volcanic.tes.gd, TURN_PORT=3478, 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.volcanic.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).
Description
No description provided
Readme 344 KiB
Languages
C# 72.6%
TypeScript 22.9%
Shell 1.8%
Dockerfile 1.2%
JavaScript 0.8%
Other 0.7%