Files
urbanLifeline/docker/jitsi/docker-compose.yml

199 lines
6.6 KiB
YAML
Raw Permalink Normal View History

2026-01-02 14:55:57 +08:00
# ================================================
# Jitsi Meet 视频会议服务
#
# 使用方式:
# docker compose up -d
#
# 环境变量配置:
# 复制 .env.example 为 .env 并修改
# ================================================
services:
# ====================== Jitsi Web ======================
jitsi-web:
image: jitsi/web:${JITSI_IMAGE_TAG:-stable-9584}
container_name: urban-lifeline-jitsi-web
restart: unless-stopped
networks:
- urban-lifeline
ports:
- "${JITSI_WEB_HTTP_PORT:-8280}:80"
- "${JITSI_WEB_HTTPS_PORT:-8443}:443"
environment:
TZ: ${TZ:-Asia/Shanghai}
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com}
ENABLE_HTTPS: ${JITSI_ENABLE_HTTPS:-0}
ENABLE_HTTP_REDIRECT: 0
DISABLE_HTTPS: ${JITSI_DISABLE_HTTPS:-1}
# XMPP 配置
XMPP_DOMAIN: meet.jitsi
XMPP_AUTH_DOMAIN: auth.meet.jitsi
XMPP_BOSH_URL_BASE: http://jitsi-prosody:5280
XMPP_MUC_DOMAIN: muc.meet.jitsi
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
XMPP_GUEST_DOMAIN: guest.meet.jitsi
# 组件认证
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
JICOFO_AUTH_USER: focus
JVB_AUTH_USER: jvb
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
# JWT 认证
ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1}
ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0}
AUTH_TYPE: jwt
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production}
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
JWT_ACCEPTED_AUDIENCES: jitsi
JWT_ALLOW_EMPTY: 0
JWT_AUTH_TYPE: token
JWT_TOKEN_AUTH_MODULE: token_verification
# 功能开关
ENABLE_RECORDING: ${JITSI_ENABLE_RECORDING:-0}
ENABLE_TRANSCRIPTIONS: 0
ENABLE_SUBDOMAINS: 0
ENABLE_XMPP_WEBSOCKET: 1
ENABLE_SCTP: 1
volumes:
- ${DATA_ROOT:-../volumes}/jitsi/web:/config
- ${DATA_ROOT:-../volumes}/jitsi/transcripts:/usr/share/jitsi-meet/transcripts
depends_on:
- jitsi-prosody
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# ====================== Jitsi Prosody (XMPP) ======================
jitsi-prosody:
image: jitsi/prosody:${JITSI_IMAGE_TAG:-stable-9584}
container_name: urban-lifeline-jitsi-prosody
restart: unless-stopped
networks:
- urban-lifeline
expose:
- "5222"
- "5347"
- "5280"
environment:
TZ: ${TZ:-Asia/Shanghai}
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com}
# XMPP 配置
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_GUEST_DOMAIN: guest.meet.jitsi
# 组件认证
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
JICOFO_AUTH_USER: focus
JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password}
JVB_AUTH_USER: jvb
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
# JWT 认证
ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1}
ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0}
AUTH_TYPE: jwt
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production}
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
JWT_ACCEPTED_AUDIENCES: jitsi
JWT_ALLOW_EMPTY: 0
JWT_AUTH_TYPE: token
JWT_TOKEN_AUTH_MODULE: token_verification
JWT_DISABLE_AUTO_MODERATOR: true
LOG_LEVEL: ${JITSI_LOG_LEVEL:-info}
volumes:
- ${DATA_ROOT:-../volumes}/jitsi/prosody/config:/config
- ${DATA_ROOT:-../volumes}/jitsi/prosody/prosody-plugins-custom:/prosody-plugins-custom
healthcheck:
test: ["CMD", "prosodyctl", "status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 90s
# ====================== Jitsi Jicofo (会议焦点) ======================
jitsi-jicofo:
image: jitsi/jicofo:${JITSI_IMAGE_TAG:-stable-9584}
container_name: urban-lifeline-jitsi-jicofo
restart: unless-stopped
networks:
- urban-lifeline
environment:
TZ: ${TZ:-Asia/Shanghai}
# XMPP 配置
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_SERVER: jitsi-prosody
# 组件认证
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
JICOFO_AUTH_USER: focus
JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password}
AUTH_TYPE: jwt
JVB_BREWERY_MUC: jvbbrewery
# 功能配置
JICOFO_ENABLE_HEALTH_CHECKS: true
JICOFO_ENABLE_AUTO_OWNER: false
JICOFO_ENABLE_AUTO_LOGIN: false
JICOFO_CONFERENCE_INITIAL_OWNER: ""
volumes:
- ${DATA_ROOT:-../volumes}/jitsi/jicofo:/config
depends_on:
- jitsi-prosody
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8888/about/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 90s
# ====================== Jitsi JVB (视频桥接) ======================
jitsi-jvb:
image: jitsi/jvb:${JITSI_IMAGE_TAG:-stable-9584}
container_name: urban-lifeline-jitsi-jvb
restart: unless-stopped
networks:
- urban-lifeline
ports:
- "${JVB_PORT:-10000}:10000/udp"
- "${JVB_TCP_PORT:-4443}:4443/tcp"
environment:
TZ: ${TZ:-Asia/Shanghai}
# XMPP 配置
XMPP_DOMAIN: meet.jitsi
XMPP_AUTH_DOMAIN: auth.meet.jitsi
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
XMPP_SERVER: jitsi-prosody
# 组件认证
JVB_AUTH_USER: jvb
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
JVB_BREWERY_MUC: jvbbrewery
# 网络配置
JVB_PORT: ${JVB_PORT:-10000}
JVB_STUN_SERVERS: ${JVB_STUN_SERVERS:-stun.l.google.com:19302,stun1.l.google.com:19302}
DOCKER_HOST_ADDRESS: ${JVB_HOST_ADDRESS}
JVB_ADVERTISE_IPS: ${JVB_HOST_ADDRESS}
JVB_ENABLE_APIS: rest,colibri
JVB_TCP_HARVESTER_DISABLED: "false"
JVB_TCP_PORT: ${JVB_TCP_PORT:-4443}
JVB_TCP_MAPPED_PORT: ${JVB_TCP_PORT:-4443}
volumes:
- ${DATA_ROOT:-../volumes}/jitsi/jvb:/config
depends_on:
- jitsi-prosody
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/about/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 90s
networks:
urban-lifeline:
name: urban-lifeline