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:
    Dica
    mattermost-team-edition é a versão gratuita com todas as funcionalidades essenciais. A Professional edition (~$10/usuário/mês) adiciona SSO, compliance reports e suporte dedicado.

    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

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes