Mattermost self-hosted na VPS

Mattermost é o substituto open-source do Slack mais completo, canais, DMs, threads, chamadas de vídeo, bots, webhooks e apps mobile nativos. Self-hosteado na VPS, todas as mensagens e arquivos da equipe ficam na sua infraestrutura, sem planos por usuário e sem dependência de serviço externo.

Instalar Mattermost com Docker Compose

Stack com Mattermost e PostgreSQL para produção:

yaml
# docker-compose.yml
services:
  mattermost:
    image: mattermost/mattermost-team-edition:latest
    restart: always
    ports:
      - "127.0.0.1:8065:8065"
    environment:
      MM_SQLSETTINGS_DRIVERNAME: postgres
      MM_SQLSETTINGS_DATASOURCE: postgres://mattermost:${POSTGRES_PASSWORD}@postgres:5432/mattermost?sslmode=disable
      MM_SERVICESETTINGS_SITEURL: https://chat.seudominio.com.br
      MM_FILESETTINGS_DRIVERNAME: local     # ou 'amazons3' para MinIO/S3
    volumes:
      - mattermost_data:/mattermost/data
      - mattermost_logs:/mattermost/logs
      - mattermost_config:/mattermost/config
      - mattermost_plugins:/mattermost/plugins
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: mattermost
      POSTGRES_USER: mattermost
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  mattermost_data:
  mattermost_logs:
  mattermost_config:
  mattermost_plugins:
  postgres_data:

Configurar Nginx com SSL e WebSocket

O Mattermost usa WebSocket para mensagens em tempo real, configuração específica necessária:

nginx
# /etc/nginx/conf.d/mattermost.conf
server {
    listen 80;
    server_name chat.seudominio.com.br;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name chat.seudominio.com.br;

    ssl_certificate     /etc/letsencrypt/live/chat.seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.seudominio.com.br/privkey.pem;

    client_max_body_size 100M;

    location ~ /api/v[0-9]+/(users/)?websocket$ {
        # Rota WebSocket do Mattermost
        proxy_pass http://127.0.0.1:8065;
        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;
        proxy_read_timeout 86400s;
    }

    location / {
        proxy_pass http://127.0.0.1:8065;
        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;
        proxy_read_timeout 90s;
    }
}

Configurar armazenamento de arquivos no MinIO

Usar MinIO self-hosted como storage S3-compatible para uploads:

yaml
# No Mattermost — System Console → File Storage
# File Storage System: Amazon S3

# Configurações (via variáveis de ambiente ou System Console):
MM_FILESETTINGS_DRIVERNAME: amazons3
MM_FILESETTINGS_AMAZONS3BUCKET: mattermost
MM_FILESETTINGS_AMAZONS3REGION: us-east-1
MM_FILESETTINGS_AMAZONS3ENDPOINT: s3.seudominio.com.br   # seu MinIO
MM_FILESETTINGS_AMAZONS3ACCESSKEYID: ACCESS_KEY
MM_FILESETTINGS_AMAZONS3SECRETACCESSKEY: SECRET_KEY
MM_FILESETTINGS_AMAZONS3SSL: "true"
MM_FILESETTINGS_AMAZONS3PATHSTYLE: "true"   # obrigatório para MinIO

# Criar bucket no MinIO:
mc mb myminio/mattermost
mc anonymous set none myminio/mattermost    # privado (Mattermost gerencia acesso)

# Migrar arquivos existentes do local para MinIO:
docker compose exec mattermost \
  ./bin/mmctl files migrate-to-s3 --confirm

Integrações e webhooks

Conectar o Mattermost ao n8n e outros serviços:

bash
# Webhook de entrada (para enviar mensagens ao Mattermost):
# System Console → Integrations → Incoming Webhooks → Add
# Copiar a URL gerada

# Enviar mensagem via webhook:
curl -X POST "https://chat.seudominio.com.br/hooks/WEBHOOK_ID" \
  -H "Content-Type: application/json" \
  -d '{"text": "Deploy concluído! ✅", "channel": "deploys"}'

# Com attachment (mensagem formatada):
curl -X POST "https://chat.seudominio.com.br/hooks/WEBHOOK_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "attachments": [{
      "color": "#36a64f",
      "title": "Deploy Produção",
      "text": "Versão 1.2.3 em produção",
      "fields": [
        {"title": "Branch", "value": "main", "short": true},
        {"title": "Por", "value": "github-actions", "short": true}
      ]
    }]
  }'

# Integração com n8n: Mattermost node nativo no n8n
# (buscar por "Mattermost" nos nodes do n8n)

Backup e manutenção

Backup completo incluindo mensagens e arquivos:

bash
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/var/backups/mattermost"
mkdir -p "$BACKUP_DIR"

# 1. Backup do banco PostgreSQL (mensagens, usuários, canais)
docker compose exec -T postgres \
  pg_dump -U mattermost mattermost | gzip > "$BACKUP_DIR/mm_db_${DATE}.sql.gz"

# 2. Backup de arquivos locais (se não usar MinIO)
docker run --rm \
  -v mattermost_data:/data \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/mm_data_${DATE}.tar.gz" /data

# 3. Backup da configuração
docker run --rm \
  -v mattermost_config:/config \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/mm_config_${DATE}.tar.gz" /config

# Atualizar Mattermost:
docker compose pull mattermost
docker compose up -d mattermost

# Verificar saúde:
curl -s https://chat.seudominio.com.br/api/v4/system/ping | python3 -m json.tool

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Mattermost Team Edition: mais leve, interface similar ao Slack, apps mobile nativos excelentes, open-source. Rocket.Chat: mais features na versão gratuita (videoconferência nativa, livechat), mais pesado. Zulip: modelo de threads diferente (tópicos obrigatórios). Para equipes de desenvolvimento que usam Slack: Mattermost tem a menor curva de aprendizado.

Sim, os apps oficiais do Mattermost (iOS e Android) funcionam com qualquer servidor self-hosted. Na tela de login: insira a URL do seu servidor (https://chat.seudominio.com.br). Push notifications: requerem configuração de MPNS (Mattermost Push Notification Service) ou use o serviço de push gratuito da Mattermost (envia via servidores deles, mas sem conteúdo de mensagem).

Até 10.000 usuários registrados na Team Edition. Na prática, a capacidade depende dos recursos da VPS, para equipes de até 50 usuários ativos simultâneos: 4 GB RAM e 2 vCPUs são suficientes. Para crescimento: Mattermost escala horizontalmente com múltiplos app nodes.

Com o plugin Calls (disponível na Team Edition): suporte a chamadas de áudio e vídeo WebRTC diretamente nos canais. Para funcionar: requer configuração de STUN/TURN server (pode usar coturn self-hosted) para usuários fora da rede local. Alternativa: integração com Jitsi Meet self-hosted via plugin.

O Mattermost tem ferramenta oficial de migração do Slack: exportar dados do Slack (arquivo ZIP) e importar com mmctl slack import. Importa mensagens, arquivos, canais e usuários. DMs diretos e alguns tipos de mensagens podem não ser importados completamente. Usuários precisam criar senhas no Mattermost após a migração.