622 lines
16 KiB
Markdown
622 lines
16 KiB
Markdown
# Configuração do Jitsi Meet no SGSE
|
|
|
|
## Introdução
|
|
|
|
O sistema de videochamadas do SGSE utiliza o Jitsi Meet, uma solução open-source para comunicação por vídeo e áudio. Este documento fornece um guia completo para configurar o Jitsi Meet no sistema SGSE.
|
|
|
|
### Benefícios
|
|
|
|
- **Chamadas de vídeo e áudio** em tempo real
|
|
- **Autenticação JWT** para controle de acesso
|
|
- **Suporte a múltiplos ambientes** (desenvolvimento, staging, produção)
|
|
- **Gravação de chamadas** (quando habilitado no servidor)
|
|
- **Integração nativa** com o sistema de chat
|
|
|
|
### Visão Geral da Arquitetura
|
|
|
|
```
|
|
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
|
│ Cliente │────────▶│ Backend │────────▶│ Jitsi │
|
|
│ (Navegador)│ │ (Convex) │ │ Servidor │
|
|
└─────────────┘ └──────────────┘ └─────────────┘
|
|
│ │ │
|
|
│ │ │
|
|
└─────────────────────────┴────────────────────────┘
|
|
Token JWT (opcional)
|
|
```
|
|
|
|
## Requisitos do Sistema
|
|
|
|
### Requisitos de Hardware
|
|
|
|
- **CPU**: Mínimo 2 cores (recomendado: 4+ cores)
|
|
- **RAM**: Mínimo 4GB (recomendado: 8GB+)
|
|
- **Largura de Banda**: Mínimo 1 Mbps por participante (recomendado: 2+ Mbps)
|
|
|
|
### Requisitos de Software
|
|
|
|
- **Docker** e **Docker Compose** (para instalação self-hosted)
|
|
- **Node.js** 18+ (já incluído no SGSE)
|
|
- **Navegador moderno** com suporte a WebRTC (Chrome, Firefox, Safari, Edge)
|
|
|
|
### Requisitos de Rede
|
|
|
|
- **Portas necessárias**:
|
|
- `80` (HTTP) ou `443` (HTTPS) - Web
|
|
- `4443` (TURN/TCP) - Retransmissão de mídia
|
|
- `10000/udp` (RTP/RTCP) - Streaming de mídia
|
|
- **Firewall**: Permitir tráfego UDP e TCP nas portas acima
|
|
- **DNS**: Configurar registro A ou CNAME para o domínio (produção)
|
|
|
|
### Requisitos de Certificados SSL
|
|
|
|
- **Produção**: Certificado válido (Let's Encrypt recomendado)
|
|
- **Desenvolvimento**: Certificado autoassinado aceitável
|
|
|
|
## Tipos de Instalação
|
|
|
|
### 1. Jitsi Self-Hosted com Docker
|
|
|
|
Esta é a opção recomendada para produção e oferece controle total sobre o servidor.
|
|
|
|
#### Pré-requisitos
|
|
|
|
1. Servidor com Docker e Docker Compose instalados
|
|
2. Domínio configurado (para produção) ou acesso a `localhost` (desenvolvimento)
|
|
3. Certificado SSL (para produção)
|
|
|
|
#### Passo a Passo
|
|
|
|
1. **Instalar Docker e Docker Compose**
|
|
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt-get update
|
|
sudo apt-get install docker.io docker-compose
|
|
|
|
# Verificar instalação
|
|
docker --version
|
|
docker-compose --version
|
|
```
|
|
|
|
2. **Criar diretório para configuração**
|
|
|
|
```bash
|
|
mkdir -p ~/jitsi-meet
|
|
cd ~/jitsi-meet
|
|
```
|
|
|
|
3. **Baixar arquivos de configuração**
|
|
|
|
```bash
|
|
# Baixar docker-compose.yml oficial
|
|
curl -L https://github.com/jitsi/docker-jitsi-meet/archive/refs/heads/master.zip -o jitsi.zip
|
|
unzip jitsi.zip
|
|
cd docker-jitsi-meet-master
|
|
```
|
|
|
|
4. **Configurar variáveis de ambiente**
|
|
|
|
```bash
|
|
# Copiar arquivo de exemplo
|
|
cp env.example .env
|
|
|
|
# Editar .env com suas configurações
|
|
nano .env
|
|
```
|
|
|
|
Configurações importantes no `.env`:
|
|
|
|
```env
|
|
# Domínio
|
|
CONFIG=~/.jitsi-meet-cfg
|
|
TZ=America/Recife
|
|
HTTP_PORT=8000
|
|
HTTPS_PORT=8443
|
|
PUBLIC_URL=https://meet.example.com
|
|
DOMAIN=meet.example.com
|
|
|
|
# Autenticação
|
|
ENABLE_AUTH=1
|
|
ENABLE_GUESTS=0
|
|
|
|
# JWT
|
|
JWT_APP_ID=sgse-app
|
|
JWT_APP_SECRET=seu-jwt-secret-aqui-minimo-32-caracteres
|
|
|
|
# Gravação (opcional)
|
|
ENABLE_RECORDING=0
|
|
|
|
# Outras configurações
|
|
ENABLE_PREJOIN_PAGE=0
|
|
START_AUDIO_MUTED=0
|
|
START_VIDEO_MUTED=0
|
|
ENABLE_XMPP_WEBSOCKET=1
|
|
ENABLE_P2P=1
|
|
MAX_NUMBER_OF_PARTICIPANTS=10
|
|
```
|
|
|
|
5. **Gerar JWT Secret seguro**
|
|
|
|
```bash
|
|
# Gerar secret aleatório de 64 caracteres
|
|
openssl rand -hex 32
|
|
```
|
|
|
|
6. **Criar diretório de configuração**
|
|
|
|
```bash
|
|
mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
|
|
```
|
|
|
|
7. **Iniciar containers**
|
|
|
|
```bash
|
|
docker-compose up -d
|
|
```
|
|
|
|
8. **Verificar status**
|
|
|
|
```bash
|
|
docker-compose ps
|
|
```
|
|
|
|
9. **Verificar logs**
|
|
|
|
```bash
|
|
docker-compose logs -f
|
|
```
|
|
|
|
#### Configuração de Certificados SSL
|
|
|
|
**Para Produção (Let's Encrypt):**
|
|
|
|
O Jitsi Docker suporta Let's Encrypt automaticamente. Configure:
|
|
|
|
```env
|
|
ENABLE_LETSENCRYPT=1
|
|
LETSENCRYPT_DOMAIN=meet.example.com
|
|
LETSENCRYPT_EMAIL=admin@example.com
|
|
```
|
|
|
|
**Para Desenvolvimento (Autoassinado):**
|
|
|
|
```env
|
|
ENABLE_LETSENCRYPT=0
|
|
```
|
|
|
|
E aceite o certificado no navegador na primeira conexão.
|
|
|
|
### 2. Jitsi as a Service (JaaS/8x8)
|
|
|
|
JaaS é uma solução gerenciada pela 8x8 que oferece Jitsi como serviço.
|
|
|
|
#### Passo a Passo
|
|
|
|
1. **Criar conta no JaaS**
|
|
- Acesse https://jaas.8x8.vc
|
|
- Crie uma conta ou faça login
|
|
|
|
2. **Obter credenciais**
|
|
- No painel do JaaS, vá em "Settings" > "API Keys"
|
|
- Copie o **Application ID** e **Application Secret**
|
|
|
|
3. **Configurar no SGSE**
|
|
- Use o domínio: `8x8.vc` ou seu domínio personalizado
|
|
- App ID: O Application ID do JaaS
|
|
- JWT Secret: O Application Secret do JaaS
|
|
|
|
4. **Domínio personalizado (opcional)**
|
|
- No painel JaaS, configure um domínio personalizado
|
|
- Atualize o domínio no SGSE
|
|
|
|
### 3. Desenvolvimento Local
|
|
|
|
Para desenvolvimento rápido sem Docker:
|
|
|
|
1. **Usar Jitsi Meet público** (não recomendado para produção)
|
|
- Domínio: `meet.jit.si`
|
|
- Não requer configuração de servidor
|
|
- Limitações: Sem JWT, sem controle total
|
|
|
|
2. **Docker local simplificado**
|
|
- Siga os passos do "Jitsi Self-Hosted"
|
|
- Use `localhost:8443` como domínio
|
|
- Configure certificado autoassinado
|
|
|
|
## Configuração de JWT no Servidor Jitsi
|
|
|
|
### Para Jitsi Self-Hosted
|
|
|
|
#### 1. Gerar JWT Secret
|
|
|
|
```bash
|
|
# Gerar secret seguro
|
|
openssl rand -hex 32
|
|
```
|
|
|
|
#### 2. Configurar Prosody
|
|
|
|
Edite `~/.jitsi-meet-cfg/prosody/config/conf.d/jitsi-meet.cfg.lua`:
|
|
|
|
```lua
|
|
-- Habilitar autenticação JWT
|
|
authentication = "token";
|
|
|
|
-- Configurar verificação de token
|
|
asap_accepted_audiences = "sgse-app"
|
|
asap_accepted_issuers = "sgse-app"
|
|
|
|
-- Módulo de verificação de token
|
|
Component "conference.meet.example.com" "muc"
|
|
modules_enabled = {
|
|
"token_verification";
|
|
}
|
|
```
|
|
|
|
#### 3. Configurar Jicofo
|
|
|
|
Edite `~/.jitsi-meet-cfg/jicofo/sip-communicator.properties`:
|
|
|
|
```properties
|
|
org.jitsi.jicofo.auth.URL=XMPP:meet.example.com
|
|
org.jitsi.jicofo.jwt.secret=seu-jwt-secret-aqui
|
|
org.jitsi.jicofo.jwt.appId=sgse-app
|
|
```
|
|
|
|
#### 4. Reiniciar serviços
|
|
|
|
```bash
|
|
docker-compose restart prosody jicofo
|
|
```
|
|
|
|
### Para JaaS
|
|
|
|
JWT já está configurado. Apenas use as credenciais fornecidas no painel.
|
|
|
|
## Configuração no Painel SGSE
|
|
|
|
### Acesso ao Painel
|
|
|
|
1. Faça login como usuário com permissão de TI (TI_MASTER, TI_USUARIO ou ADMIN)
|
|
2. Navegue para: **TI** > **Configurações do Jitsi**
|
|
|
|
### Preenchimento de Campos
|
|
|
|
#### Domínio
|
|
|
|
- **Formato**: FQDN (ex: `meet.example.com`) ou `localhost:porta` (ex: `localhost:8443`)
|
|
- **Exemplos**:
|
|
- Produção: `meet.example.com`
|
|
- Desenvolvimento: `localhost:8443`
|
|
- JaaS: `8x8.vc` ou seu domínio personalizado
|
|
|
|
#### App ID
|
|
|
|
- **Formato**: Alfanumérico, pode conter hífens e underscores
|
|
- **Exemplos**: `sgse-app`, `my-app`, `app_123`
|
|
- **Onde encontrar**:
|
|
- Self-hosted: Configurado no `.env` como `JWT_APP_ID`
|
|
- JaaS: Application ID no painel do JaaS
|
|
|
|
#### JWT Secret
|
|
|
|
- **Requisitos**: Mínimo 16 caracteres (recomendado: 32+)
|
|
- **Onde encontrar**:
|
|
- Self-hosted: Configurado no `.env` como `JWT_APP_SECRET`
|
|
- JaaS: Application Secret no painel do JaaS
|
|
- **Segurança**: O secret será criptografado antes de ser armazenado
|
|
|
|
#### Prefixo de Sala
|
|
|
|
- **Formato**: Apenas letras, números e hífens
|
|
- **Exemplo**: `sgse`, `meeting`, `call-123`
|
|
- **Uso**: Prefixo usado para gerar nomes únicos de salas
|
|
|
|
#### Ambiente
|
|
|
|
- **Opções**: Desenvolvimento, Staging, Produção
|
|
- **Uso**: Permite múltiplas configurações para diferentes ambientes
|
|
- **Padrão**: Deixe vazio para configuração padrão
|
|
|
|
#### JWT Audience e Issuer (Opcionais)
|
|
|
|
- **Audience**: Padrão é o domínio do servidor
|
|
- **Issuer**: Padrão é o App ID
|
|
- **Quando configurar**: Apenas se necessário para compatibilidade com configurações específicas do servidor
|
|
|
|
### Teste de Conexão
|
|
|
|
1. Preencha os campos básicos (Domínio, App ID)
|
|
2. Clique em **"Testar Conexão"**
|
|
3. Aguarde a validação
|
|
4. Se houver erros, verifique:
|
|
- Servidor está online
|
|
- Domínio está correto
|
|
- Portas estão acessíveis
|
|
- Certificado SSL (se HTTPS)
|
|
|
|
### Geração de Token de Teste
|
|
|
|
1. Configure o JWT Secret
|
|
2. Clique em **"Gerar Token de Teste"**
|
|
3. O token será gerado automaticamente quando você criar uma chamada
|
|
|
|
## Troubleshooting
|
|
|
|
### Problemas de Conexão
|
|
|
|
#### Servidor não acessível
|
|
|
|
**Sintomas**: Timeout ou erro de conexão
|
|
|
|
**Soluções**:
|
|
1. Verificar se o servidor está online: `ping meet.example.com`
|
|
2. Verificar portas: `telnet meet.example.com 443`
|
|
3. Verificar firewall: Permitir portas 80, 443, 4443, 10000/udp
|
|
4. Verificar DNS: `nslookup meet.example.com`
|
|
|
|
#### Timeout de conexão
|
|
|
|
**Sintomas**: Conexão demora muito ou falha
|
|
|
|
**Soluções**:
|
|
1. Verificar largura de banda
|
|
2. Verificar latência de rede
|
|
3. Verificar se há proxy ou firewall bloqueando
|
|
4. Testar de outra rede
|
|
|
|
#### Erro de DNS
|
|
|
|
**Sintomas**: "DNS resolution failed"
|
|
|
|
**Soluções**:
|
|
1. Verificar se o domínio está configurado corretamente
|
|
2. Verificar registros DNS (A ou CNAME)
|
|
3. Aguardar propagação DNS (até 48 horas)
|
|
|
|
### Problemas de Certificado SSL
|
|
|
|
#### Certificado inválido
|
|
|
|
**Sintomas**: Aviso de certificado não confiável
|
|
|
|
**Soluções**:
|
|
1. **Produção**: Usar certificado válido (Let's Encrypt)
|
|
2. **Desenvolvimento**: Habilitar "Aceitar Certificados Autoassinados" no painel
|
|
|
|
#### Certificado autoassinado não aceito
|
|
|
|
**Sintomas**: Erro mesmo com opção habilitada
|
|
|
|
**Soluções**:
|
|
1. Aceitar certificado manualmente no navegador na primeira conexão
|
|
2. Adicionar exceção no navegador
|
|
3. Para produção, usar certificado válido
|
|
|
|
#### Erro de cadeia de certificados
|
|
|
|
**Sintomas**: "Certificate chain incomplete"
|
|
|
|
**Soluções**:
|
|
1. Verificar se o certificado inclui a cadeia completa
|
|
2. Reinstalar certificado com cadeia completa
|
|
3. Verificar configuração do servidor web
|
|
|
|
### Problemas com JWT
|
|
|
|
#### Token inválido
|
|
|
|
**Sintomas**: Erro de autenticação ao conectar
|
|
|
|
**Soluções**:
|
|
1. Verificar se JWT Secret está correto no servidor e no SGSE
|
|
2. Verificar se App ID corresponde
|
|
3. Verificar se token não expirou (padrão: 1 hora)
|
|
4. Regenerar token
|
|
|
|
#### Token expirado
|
|
|
|
**Sintomas**: Conexão funciona inicialmente, depois falha
|
|
|
|
**Soluções**:
|
|
1. Tokens são regenerados automaticamente
|
|
2. Verificar se o relógio do servidor está sincronizado (NTP)
|
|
3. Aumentar tempo de expiração (se necessário)
|
|
|
|
#### Secret incorreto
|
|
|
|
**Sintomas**: Erro de autenticação persistente
|
|
|
|
**Soluções**:
|
|
1. Verificar JWT Secret no servidor (`.env` ou configuração)
|
|
2. Verificar JWT Secret no painel SGSE
|
|
3. Garantir que são idênticos (sem espaços extras)
|
|
4. Reiniciar serviços do Jitsi após alterar secret
|
|
|
|
#### Claims incorretos
|
|
|
|
**Sintomas**: Conexão estabelecida mas sem permissões
|
|
|
|
**Soluções**:
|
|
1. Verificar claims do token (iss, aud, room, moderator)
|
|
2. Verificar configuração do Prosody
|
|
3. Verificar logs do servidor Jitsi
|
|
|
|
### Problemas de Firewall
|
|
|
|
#### Portas bloqueadas
|
|
|
|
**Sintomas**: Conexão HTTP funciona, mas mídia não
|
|
|
|
**Soluções**:
|
|
1. Abrir portas necessárias:
|
|
- `80/tcp`, `443/tcp` (HTTP/HTTPS)
|
|
- `4443/tcp` (TURN)
|
|
- `10000/udp` (RTP/RTCP)
|
|
2. Verificar regras de firewall
|
|
3. Testar com `telnet` ou `nc`
|
|
|
|
#### UDP não funcionando
|
|
|
|
**Sintomas**: Áudio/vídeo cortando ou não funcionando
|
|
|
|
**Soluções**:
|
|
1. Verificar se UDP está habilitado no firewall
|
|
2. Verificar se NAT está configurado corretamente
|
|
3. Configurar TURN server para fallback
|
|
|
|
#### WebRTC bloqueado
|
|
|
|
**Sintomas**: Navegador não consegue estabelecer conexão WebRTC
|
|
|
|
**Soluções**:
|
|
1. Verificar se WebRTC está habilitado no navegador
|
|
2. Verificar se não há extensões bloqueando WebRTC
|
|
3. Verificar configurações de proxy/VPN
|
|
|
|
### Problemas de Performance
|
|
|
|
#### Qualidade de vídeo ruim
|
|
|
|
**Sintomas**: Vídeo pixelado ou com baixa resolução
|
|
|
|
**Soluções**:
|
|
1. Verificar largura de banda disponível
|
|
2. Reduzir número de participantes simultâneos
|
|
3. Ajustar resolução nas configurações do Jitsi
|
|
4. Verificar recursos do servidor (CPU, RAM)
|
|
|
|
#### Áudio cortando
|
|
|
|
**Sintomas**: Áudio intermitente ou com atraso
|
|
|
|
**Soluções**:
|
|
1. Verificar latência de rede
|
|
2. Verificar recursos do servidor
|
|
3. Configurar codec de áudio adequado
|
|
4. Verificar dispositivos de áudio do cliente
|
|
|
|
#### Alta latência
|
|
|
|
**Sintomas**: Atraso perceptível entre áudio/vídeo
|
|
|
|
**Soluções**:
|
|
1. Verificar latência de rede (ping)
|
|
2. Verificar localização do servidor (usar servidor próximo)
|
|
3. Configurar TURN server próximo aos usuários
|
|
4. Otimizar configurações de codec
|
|
|
|
## Exemplos de Configuração
|
|
|
|
### Exemplo 1: Desenvolvimento Local
|
|
|
|
```yaml
|
|
Domínio: localhost:8443
|
|
App ID: sgse-app
|
|
Prefixo de Sala: sgse-dev
|
|
HTTPS: Sim
|
|
Certificados Autoassinados: Sim
|
|
JWT Secret: (opcional para desenvolvimento)
|
|
Ambiente: desenvolvimento
|
|
```
|
|
|
|
### Exemplo 2: Produção Self-Hosted
|
|
|
|
```yaml
|
|
Domínio: meet.example.com
|
|
App ID: sgse-app
|
|
Prefixo de Sala: sgse
|
|
HTTPS: Sim
|
|
Certificados Autoassinados: Não
|
|
JWT Secret: [secret de 32+ caracteres]
|
|
JWT Audience: meet.example.com
|
|
JWT Issuer: sgse-app
|
|
Ambiente: producao
|
|
```
|
|
|
|
### Exemplo 3: JaaS com Domínio Personalizado
|
|
|
|
```yaml
|
|
Domínio: meet.seudominio.com
|
|
App ID: [Application ID do JaaS]
|
|
Prefixo de Sala: sgse
|
|
HTTPS: Sim
|
|
Certificados Autoassinados: Não
|
|
JWT Secret: [Application Secret do JaaS]
|
|
Ambiente: producao
|
|
```
|
|
|
|
### Exemplo 4: Múltiplos Ambientes
|
|
|
|
**Desenvolvimento:**
|
|
```yaml
|
|
Ambiente: desenvolvimento
|
|
Domínio: localhost:8443
|
|
```
|
|
|
|
**Staging:**
|
|
```yaml
|
|
Ambiente: staging
|
|
Domínio: meet-staging.example.com
|
|
```
|
|
|
|
**Produção:**
|
|
```yaml
|
|
Ambiente: producao
|
|
Domínio: meet.example.com
|
|
```
|
|
|
|
## Boas Práticas
|
|
|
|
### Segurança
|
|
|
|
1. **Use HTTPS em produção**: Sempre use certificados válidos
|
|
2. **JWT Secret forte**: Mínimo 32 caracteres, use gerador seguro
|
|
3. **Rotação de secrets**: Rotacione JWT secrets periodicamente
|
|
4. **Limitação de acesso**: Configure firewall para permitir apenas IPs necessários (opcional)
|
|
5. **Logs de auditoria**: Monitore logs para atividades suspeitas
|
|
|
|
### Performance
|
|
|
|
1. **Recursos do servidor**: Aloque recursos adequados (CPU, RAM, largura de banda)
|
|
2. **Otimização de codecs**: Use codecs eficientes (VP8, Opus)
|
|
3. **Configuração de P2P**: Habilite P2P para reduzir carga no servidor
|
|
4. **Monitoramento**: Monitore métricas de CPU, RAM, largura de banda
|
|
|
|
### Monitoramento
|
|
|
|
1. **Logs importantes**:
|
|
- Logs do Prosody (XMPP)
|
|
- Logs do Jicofo (conferências)
|
|
- Logs do JVB (vídeo bridge)
|
|
- Logs do nginx (web server)
|
|
|
|
2. **Métricas a acompanhar**:
|
|
- Número de participantes ativos
|
|
- Largura de banda utilizada
|
|
- CPU e RAM do servidor
|
|
- Latência de conexão
|
|
|
|
3. **Alertas recomendados**:
|
|
- Alta utilização de CPU/RAM
|
|
- Falhas de conexão
|
|
- Certificados próximos do vencimento
|
|
- Erros de autenticação JWT
|
|
|
|
## Referências
|
|
|
|
- **Documentação oficial do Jitsi Meet**: https://jitsi.github.io/handbook/
|
|
- **Especificação JWT do Jitsi**: https://github.com/jitsi/lib-jitsi-meet/blob/master/doc/tokens.md
|
|
- **Guia de instalação Docker**: https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker
|
|
- **Comunidade Jitsi**: https://community.jitsi.org/
|
|
- **JaaS (8x8)**: https://jaas.8x8.vc
|
|
|
|
## Suporte
|
|
|
|
Para problemas ou dúvidas:
|
|
1. Consulte a seção de Troubleshooting acima
|
|
2. Verifique os logs do servidor Jitsi
|
|
3. Consulte a documentação oficial do Jitsi
|
|
4. Entre em contato com a equipe de TI
|