# 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