Ter uma comunicação interna isolada e segura é o pilar de qualquer infraestrutura moderna. Implementar o Rocket.Chat dentro da sua própria malha de rede resolve a questão da privacidade, mas traz alguns desafios técnicos. Neste guia, vamos realizar o deploy do Rocket.Chat usando Podman, conectá-lo à nossa malha privada (Headscale) e resolver a autenticação centralizada (SSO) usando o Authentik.
“O maior mito do self-hosting atual é achar que tudo é ilimitado por padrão. A partir da versão 6.5+, o Rocket.Chat matricula novas instâncias em um ‘Starter Plan’ gratuito, porém restrito a 50 usuários e 100 contatos ativos mensais. Se você precisa de acesso ilimitado, deverá rebaixar ativamente para a versão Community e abrir mão de alguns recursos premium.”
Antes de colocarmos a mão na massa, vamos entender as diferenças estruturais que impactam nossa arquitetura, especialmente os requisitos de banco de dados e os limites da licença.
| Característica | Starter Plan (Padrão) | Community Edition |
|---|---|---|
| Limite de Usuários | 50 Usuários | Ilimitado |
| Conexões MAC (Mensais) | 100 Conexões | Ilimitado |
| Recursos Enterprise | Sim (limitados por cota) | Não (apenas recursos base) |
Para aprender mais sobre como governar sua infraestrutura de forma profissional, visite sempre o blog.raem.me.
1. Preparando a Estrutura de Diretórios
Vamos criar os diretórios onde residirão os dados persistentes da nossa aplicação e do banco de dados.
mkdir -p /home/klaus/RaemNetwork/rocketchat/data
mkdir -p /home/klaus/RaemNetwork/rocketchat/mongo-data
cd /home/klaus/RaemNetwork/rocketchat
2. Variáveis de Ambiente
O arquivo .env armazenará nossas credenciais e as URLs de conexão. O Rocket.Chat exige a URL do MongoDB em formato Replica Set.
cat > .env << 'EOF'
ROOT_URL=http://rocketchat.raem.io
MONGO_URL=mongodb://mongo:27017/rocketchat?replicaSet=rs0
MONGO_OPLOG_URL=mongodb://mongo:27017/local?replicaSet=rs0
TZ=Europe/Dublin
EOF
3. Criando o compose.yml
Atenção redobrada aqui: as versões recentes do Rocket.Chat (8.x) exigem o MongoDB 8.0+. Se você tentar utilizar a imagem antiga mongo:6, o container principal irá falhar silenciosamente ao iniciar.
cat > compose.yml << 'EOF'
services:
mongo:
image: docker.io/library/mongo:8
container_name: raem-rocketchat-db
restart: unless-stopped
command: mongod --replSet rs0 --oplogSize 128 --bind_ip_all
volumes:
- ./mongo-data:/data/db
networks:
- raem-network
mongo-init-replica:
image: docker.io/library/mongo:8
container_name: raem-rocketchat-db-init
restart: "no"
depends_on:
- mongo
entrypoint: >
bash -c "sleep 10 && mongosh mongo/rocketchat --eval 'rs.initiate({_id: \"rs0\", members: [{_id: 0, host: \"mongo:27017\"}]})'"
networks:
- raem-network
rocketchat:
image: docker.io/rocketchat/rocket.chat:latest
container_name: raem-rocketchat
restart: unless-stopped
environment:
- MONGO_URL=${MONGO_URL}
- MONGO_OPLOG_URL=${MONGO_OPLOG_URL}
- ROOT_URL=${ROOT_URL}
- TZ=${TZ}
ports:
- "100.64.0.1:3000:3000"
depends_on:
- mongo
- mongo-init-replica
volumes:
- ./data:/app/uploads
networks:
- raem-network
networks:
raem-network:
external: true
EOF
4. Inicializando o Replica Set do MongoDB
O Rocket.Chat não funciona com uma instância standalone do MongoDB. É fundamental inicializar o replica set antes da aplicação principal.
podman-compose up -d mongo
sleep 8
podman-compose up mongo-init-replica
podman logs raem-rocketchat-db-init
Verifique nos logs se o retorno foi { ok: 1 }. Isso confirma que o banco está pronto.
5. Inicializando a Aplicação
podman-compose up -d rocketchat
podman logs -f raem-rocketchat
Aguarde até visualizar a mensagem SERVER RUNNING.
6. Teste de Conexão Local
Antes de aplicar regras de proxy ou DNS, garanta que o serviço responde no IP da sua interface Headscale.
curl -I http://100.64.0.1:3000
Acesse esse endereço no navegador para criar sua conta de administrador e concluir o assistente inicial.
7. Nginx Proxy Manager (NPM) e WebSockets
No painel do NPM, crie um Proxy Host apontando rocketchat.raem.io para raem-rocketchat:3000. É obrigatório habilitar o suporte a WebSockets, caso contrário o chat carregará, mas as mensagens não chegarão em tempo real.
Na aba Advanced do NPM, adicione o bloco abaixo para forçar os cabeçalhos corretos:
location / {
proxy_pass http://raem-rocketchat:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
8. MagicDNS via Headscale
Para resolvermos o domínio internamente na malha VPN, edite as configurações do Headscale:
nano /home/klaus/RaemNetwork/headscale/config/config.yaml
Adicione o seguinte registro DNS:
- name: "rocketchat.raem.io"
type: "A"
value: "100.64.0.1"
Reinicie o serviço para aplicar:
cd /home/klaus/RaemNetwork/headscale
podman-compose restart
9. Configurando o Provider no Authentik
Acesse seu Authentik. Vá em Applications → Providers → Create. Escolha OAuth2/OpenID Provider.
- Name: Rocket.Chat Provider
- Client type: Confidential
- Redirect URIs: http://rocketchat.raem.io/_oauth/authentik
Salve e anote o Client ID e Client Secret. Crie uma aplicação vinculada a este provider.
10. O “Erro Fatal” do SSO no Rocket.Chat
No Rocket.Chat, vá em Admin → Settings → Third-party login → OAuth → Add custom OAuth. Nomeie como Authentik.
A Lição Aprendida: Ao configurar o SSO, preencha os caminhos básicos (/token, /userinfo, /authorize). Mas NUNCA deixe os campos de mapeamento em branco. Sem mapear Username, Email e Name, o Rocket.Chat entende que o e-mail não foi verificado, forçando o usuário para uma tela de redefinição de senha e quebrando o SSO, mesmo que o token do Authentik retorne os dados corretos.
Preencha exatamente assim:
- Scope: openid email profile
- Id e Secret: Copiados do Authentik
- Login Style: Redirect
- Username field: preferred_username
- Email field: email
- Name field: name
11. Verificação Final
Faça logout da conta local do Rocket.Chat. Abra uma janela anônima em http://rocketchat.raem.io. O botão de login via “Authentik” deverá redirecionar para seu provedor de identidade e retornar autenticado perfeitamente, sem pedir nova senha.
Perguntas Frequentes (FAQ)
- Por que o Rocket.Chat acusa falha no banco de dados com mongo:6?
A partir da versão 8.x, o Rocket.Chat alterou o requisito mínimo do banco de dados para o MongoDB 8. Você deve atualizar a imagem no seu compose. - Como cancelo o Starter Plan e volto para o ilimitado?
Acesse Admin → Subscription e gerencie a licença para fazer o downgrade para a versão Community. - Por que meu SSO do Authentik pede para redefinir a senha?
Isso ocorre porque o Rocket.Chat não conseguiu ler a tagemail_verified. Garanta que mapeou os campos de Username, Email e Name nas configurações Custom OAuth do Rocket.Chat.
Pronto para o Próximo Nível?
A infraestrutura corporativa self-hosted exige atenção aos detalhes. Para não perder os próximos tutoriais práticos da Raem Network, acesse blog.raem.me e domine suas próprias ferramentas.
#RocketChat #SelfHosted #KlausRaem #Authentik



