Jitsi: голосовой режим (custom-config.js), лимиты памяти JVB/jicofo, Jibri 800x480@5fps с finalize (только звук), muc_size, сеть crm-calls-bridge
This commit is contained in:
@@ -11,7 +11,12 @@
|
||||
# (docker-compose.calls.yml, https://crm-calls.volcanic.tes.gd): HS256, iss tvorymo-crm, aud jitsi,
|
||||
# one room, context.user.moderator -> owner via prosody token_affiliation.
|
||||
#
|
||||
# Secrets (JICOFO_AUTH_PASSWORD, JVB_AUTH_PASSWORD, JWT_APP_SECRET) live only in Coolify env vars.
|
||||
# Voice-only calls: jitsi/custom-config.js is appended to the server config.js (browser and mobile app).
|
||||
# Recording: jibri (one instance, started by the calls module over its HTTP API on the crm-calls-bridge network),
|
||||
# jitsi/finalize.sh keeps only audio and deletes the video; files go to RECORDINGS_HOST_DIR shared with the module.
|
||||
#
|
||||
# Secrets (JICOFO_AUTH_PASSWORD, JVB_AUTH_PASSWORD, JWT_APP_SECRET, JIBRI_RECORDER_PASSWORD, JIBRI_XMPP_PASSWORD)
|
||||
# live only in Coolify env vars.
|
||||
|
||||
services:
|
||||
web:
|
||||
@@ -26,6 +31,8 @@ services:
|
||||
volumes:
|
||||
- jitsi-web-config:/config
|
||||
- jitsi-web-storage:/storage
|
||||
# Voice-only settings appended to config.js (see the file).
|
||||
- ./jitsi/custom-config.js:/config/custom-config.js:ro
|
||||
environment:
|
||||
TZ: '${TZ:-Europe/Kyiv}'
|
||||
PUBLIC_URL: '${PUBLIC_URL:-https://meet.volcanic.tes.gd}'
|
||||
@@ -46,6 +53,10 @@ services:
|
||||
ENABLE_GUESTS: '0'
|
||||
# The calls module shows its own "open in app / continue in browser" page.
|
||||
DISABLE_DEEP_LINKING: 'true'
|
||||
# Recording on: config gets hiddenDomain, so jibri can join as the hidden recorder.
|
||||
ENABLE_RECORDING: '1'
|
||||
START_AUDIO_ONLY: 'true'
|
||||
START_WITH_VIDEO_MUTED: 'true'
|
||||
# Only the calls module may embed Jitsi (call window). Jitsi's nginx sets no X-Frame-Options.
|
||||
CSP_HEADER: "frame-ancestors ${CALLS_ORIGIN:-https://crm-calls.volcanic.tes.gd}"
|
||||
depends_on:
|
||||
@@ -88,6 +99,16 @@ services:
|
||||
JWT_ACCEPTED_AUDIENCES: '${JWT_AUDIENCE:-jitsi}'
|
||||
# context.user.moderator=true in the pass -> room owner (moderator); guests -> member.
|
||||
XMPP_MUC_MODULES: token_affiliation
|
||||
# HTTP /room?room=… (occupants) on prosody:5280 — the calls module polls it (concurrency limit, recording start/stop).
|
||||
XMPP_MODULES: muc_size
|
||||
ENABLE_RECORDING: '1'
|
||||
JIBRI_RECORDER_PASSWORD: '${JIBRI_RECORDER_PASSWORD}'
|
||||
JIBRI_XMPP_PASSWORD: '${JIBRI_XMPP_PASSWORD}'
|
||||
networks:
|
||||
default:
|
||||
calls-bridge:
|
||||
aliases:
|
||||
- jitsi-prosody
|
||||
|
||||
jicofo:
|
||||
image: ghcr.io/jitsi/jicofo:${JITSI_IMAGE_VERSION:-stable-11248}
|
||||
@@ -111,6 +132,10 @@ services:
|
||||
# Moderators come only from the pass (prosody token_affiliation); nobody becomes owner automatically.
|
||||
JICOFO_ENABLE_AUTH: '0'
|
||||
ENABLE_AUTO_OWNER: 'false'
|
||||
ENABLE_RECORDING: '1'
|
||||
JIBRI_XMPP_PASSWORD: '${JIBRI_XMPP_PASSWORD}'
|
||||
# Java heap (default 3072m — more than the whole server).
|
||||
JICOFO_MAX_MEMORY: '${JICOFO_MAX_MEMORY:-256m}'
|
||||
depends_on:
|
||||
- prosody
|
||||
|
||||
@@ -138,10 +163,65 @@ services:
|
||||
JVB_PORT: '${JVB_PORT:-10000}'
|
||||
# Comma-separated public IP(s) announced to clients; set in Coolify env (164.90.233.156).
|
||||
JVB_ADVERTISE_IPS: '${JVB_ADVERTISE_IPS:-164.90.233.156}'
|
||||
# Java heap (default 3072m — more than the whole server).
|
||||
VIDEOBRIDGE_MAX_MEMORY: '${VIDEOBRIDGE_MAX_MEMORY:-512m}'
|
||||
depends_on:
|
||||
- prosody
|
||||
|
||||
# One recorder (MAX_CONCURRENT_CALLS=1). Started/stopped by the calls module via http://jitsi-jibri:2222.
|
||||
# Minimal video (800x480, 5 fps): only the audio is kept, see jitsi/finalize.sh.
|
||||
jibri:
|
||||
image: ghcr.io/jitsi/jibri:${JITSI_IMAGE_VERSION:-stable-11248}
|
||||
restart: unless-stopped
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /run:size=256M,mode=1750,exec
|
||||
- /tmp:size=256M,mode=1777,noexec
|
||||
shm_size: '1gb'
|
||||
volumes:
|
||||
- jitsi-jibri-config:/config
|
||||
- jitsi-jibri-storage:/storage
|
||||
- '${RECORDINGS_HOST_DIR:-/data/crm-calls/recordings}:/recordings'
|
||||
- ./jitsi/finalize.sh:/opt/crm-calls/finalize.sh:ro
|
||||
environment:
|
||||
TZ: '${TZ:-Europe/Kyiv}'
|
||||
PUBLIC_URL: '${PUBLIC_URL:-https://meet.volcanic.tes.gd}'
|
||||
XMPP_SERVER: prosody
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_HIDDEN_DOMAIN: hidden.meet.jitsi
|
||||
JIBRI_RECORDER_PASSWORD: '${JIBRI_RECORDER_PASSWORD}'
|
||||
JIBRI_XMPP_PASSWORD: '${JIBRI_XMPP_PASSWORD}'
|
||||
JIBRI_HTTP_API_EXTERNAL_PORT: '2222'
|
||||
JIBRI_RECORDING_DIR: /recordings
|
||||
JIBRI_FINALIZE_RECORDING_SCRIPT_PATH: /opt/crm-calls/finalize.sh
|
||||
JIBRI_RECORDING_RESOLUTION: '800x480'
|
||||
JIBRI_RECORDING_FRAMERATE: '5'
|
||||
JIBRI_RECORDING_CONSTANT_RATE_FACTOR: '40'
|
||||
JIBRI_RECORDING_VIDEO_ENCODE_PRESET_RECORDING: ultrafast
|
||||
# Jibri's own JVM: small heap. Voice calls: people may stay muted/silent for long —
|
||||
# Jibri must not stop the recording on "no media"/"all muted"; the module stops it when the room empties.
|
||||
JAVA_TOOL_OPTIONS: '-Xmx256m -Djibri.call-status-checks.no-media-timeout=4h -Djibri.call-status-checks.all-muted-timeout=4h -Djibri.call-status-checks.default-call-empty-timeout=60s'
|
||||
CALLS_AUDIO_BITRATE: '${CALLS_AUDIO_BITRATE:-32k}'
|
||||
CALLS_CHUNK_SECONDS: '${CALLS_CHUNK_SECONDS:-1200}'
|
||||
depends_on:
|
||||
- jicofo
|
||||
networks:
|
||||
default:
|
||||
calls-bridge:
|
||||
aliases:
|
||||
- jitsi-jibri
|
||||
|
||||
networks:
|
||||
# Shared with the calls module app (docker-compose.calls.yml, external network of the same name).
|
||||
calls-bridge:
|
||||
name: crm-calls-bridge
|
||||
|
||||
volumes:
|
||||
jitsi-jibri-config:
|
||||
jitsi-jibri-storage:
|
||||
jitsi-web-config:
|
||||
jitsi-web-storage:
|
||||
jitsi-prosody-config:
|
||||
|
||||
Reference in New Issue
Block a user