4.7 KiB
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).
Варианты (делает админ сети):
- Проброс на роутере Netia
195.128.172.198:10000/udp → 192.168.50.73:10000/udp. ЗатемJVB_ADVERTISE_IPS=192.168.50.73,195.128.172.198. - 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).