Files
crm-calls/README.md

4.7 KiB
Raw Blame History

crm-calls

Сервис звонков для CRM (Tvorymo Soft): Jitsi Meet на базе docker-jitsi-meet stable-11248 (образы ghcr.io/jitsi/{web,prosody,jicofo,jvb}), разворачивается в Coolify (сервер storage) как docker-compose приложение.

  • URL: https://crm-calls.tes.gd
  • Coolify: проект crm-calls, приложение crm-calls (uuid в deploy.json, он в .gitignore)

Сеть

Что Порт Путь
Веб, BOSH, XMPP-websocket TCP 443 VPS 46.101.119.200 → storage Traefik → web:8000
Медиа JVB (звук/видео + bridge channel по SCTP) UDP 10000 напрямую на хост storage (192.168.50.73), мимо Traefik

В текущих версиях Jitsi bridge channel идёт через SCTP data channel внутри медиа-соединения, отдельный colibri-websocket не нужен — достаточно 443 + UDP 10000.

Media / UDP — внешняя зависимость

storage стоит за NAT Netia; снаружи сейчас доходят только TCP 80/443 через VPS. Пока UDP 10000 не проброшен, веб открывается и в комнату можно зайти, но звук/видео между участниками из интернета не пойдут (в офисной LAN — пойдут, через 192.168.50.73).

Варианты (делает админ сети):

  1. Проброс на роутере Netia 195.128.172.198:10000/udp → 192.168.50.73:10000/udp. Затем JVB_ADVERTISE_IPS=192.168.50.73,195.128.172.198.
  2. UDP-форвард через VPS 46.101.119.200:10000/udp → storage:10000/udp (по тому же туннелю, что и 80/443). Ответы должны уходить обратно через VPS (SNAT/MASQUERADE или туннель), иначе клиенты получат пакеты с IP Netia и ICE не сойдётся. JVB_ADVERTISE_IPS=192.168.50.73,46.101.119.200 (значение по умолчанию).

Менять: Coolify → приложение → Environment Variables → JVB_ADVERTISE_IPS / JVB_PORT → Redeploy. При смене JVB_PORT проброс должен вести на тот же порт.

Проверка с внешней машины после проброса: создать комнату с двух устройств из разных сетей; в jvb логах должно появиться ICE connected/Selected pair.

TURN (опционально)

В prosody уже прокинуты TURN_HOST, TURN_PORT, TURN_TRANSPORT, TURNS_HOST, TURNS_PORT, TURN_CREDENTIALS — достаточно поднять coturn (3478 udp/tcp, 5349 tls) и задать переменные. coturn требует тех же входящих портов, что сейчас закрыты, поэтому без админа сети он тоже не поможет — кроме варианта TURNS на 443 через SNI-маршрутизацию Traefik (отдельный хостнейм, TCP-роутер с TLS passthrough).

Встраивание в crm-wiki / CRM (iframe)

  • CSP_HEADER по умолчанию: frame-ancestors 'self' https://wiki-crm.tes.gd https://*.tes.gd (nginx в контейнере web). X-Frame-Options не выставляется.
  • На стороне родителя: <iframe allow="camera; microphone; display-capture; autoplay; clipboard-write; fullscreen"> или external_api.js (https://crm-calls.tes.gd/external_api.js, new JitsiMeetExternalAPI(...)).

JWT-авторизация (когда понадобится)

Переменные уже прокинуты в web/prosody/jicofo:

ENABLE_AUTH=1
AUTH_TYPE=jwt
JWT_APP_ID=crm-calls
JWT_APP_SECRET=<общий секрет HS256 с бэкендом CRM/wiki>
JWT_ACCEPTED_ISSUERS=crm,crm-wiki
JWT_ACCEPTED_AUDIENCES=crm-calls
ENABLE_GUESTS=0            # 1 — пускать гостей без токена в уже созданные комнаты

Бэкенд CRM подписывает токен (iss, aud, sub=crm-calls.tes.gd или *, room, context.user) и передаёт его в iframe (?jwt=... или jwt в JitsiMeetExternalAPI); токен можно получить родителем и передать через postMessage → JS в странице хоста создаёт API с ним.

Секреты

JICOFO_AUTH_PASSWORD, JVB_AUTH_PASSWORD задаются только в Coolify env vars (внутренние XMPP-пароли компонентов). Деплой-конфиг — deploy.json (не в git).