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 у prosodyJVB_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).