gemini generated image 5qj1tr5qj1tr5qj1

Deploy Definitivo do Rocket.Chat com Authentik SSO

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ísticaStarter Plan (Padrão)Community Edition
Limite de Usuários50 UsuáriosIlimitado
Conexões MAC (Mensais)100 ConexõesIlimitado
Recursos EnterpriseSim (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 tag email_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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *