bolt Valebyte VPS desde $4/mes — NVMe, despliegue en 60s.

Obtener VPS arrow_forward
eco Principiante Tutorial/Cómo hacer

Mattermost Self-Hosted en VPS

calendar_month Jun 08, 2026 schedule 20 min de lectura visibility 46 vistas
Self-hosted Mattermost на VPS: установка с Docker, Nginx, Push-уведомлениями и S3-бэкапами
info

¿Necesitas un servidor para esta guía? Ofrecemos servidores dedicados y VPS en más de 50 países con configuración instantánea.

¿Necesitas un VPS para esta guía?

Explore otras opciones de servidores dedicados en

Mattermost autoalojado en VPS: instalación con Docker, Nginx, notificaciones push y copias de seguridad S3

TL;DR

En esta guía detallada, configuraremos Mattermost, una potente plataforma de comunicación en equipo que sirve como una excelente alternativa a Slack, pero completamente controlada por usted. Lo implementaremos en un servidor virtual o dedicado (VPS/Dedicated) utilizando Docker y Docker Compose para simplificar la gestión, configuraremos Nginx como proxy inverso con certificados SSL de Let's Encrypt, habilitaremos las notificaciones push móviles y estableceremos un sistema fiable de copia de seguridad automática de datos en un almacenamiento compatible con S3.

  • Mattermost completamente gestionado por usted en Ubuntu Server 24.04 LTS.
  • Uso de Docker y Docker Compose para aislamiento y facilidad de implementación.
  • Configuración de Nginx para acceso seguro vía HTTPS con certificados SSL automáticos.
  • Soporte para notificaciones push móviles para todos los usuarios.
  • Copias de seguridad diarias automáticas de la base de datos y archivos en almacenamiento S3.
  • Versiones de software actualizadas, instrucciones para 2026.

Qué configuramos y por qué

Esquema: Qué configuramos y por qué
Esquema: Qué configuramos y por qué

Mattermost es una plataforma moderna de mensajería para equipos, desarrollada como una alternativa de código abierto a productos comerciales como Slack o Microsoft Teams. Proporciona todas las funciones necesarias para una comunicación eficaz: canales públicos y privados, mensajes directos, intercambio de archivos, integraciones con servicios externos, llamadas de voz y video (a través de plugins) y mucho más. La implementación autónoma de Mattermost (self-hosted) en su propio VPS o servidor dedicado le otorga control total sobre los datos, la seguridad y la capacidad de una configuración profunda para las necesidades únicas de su equipo o empresa.

En esta guía, recorreremos el camino desde un servidor vacío hasta una instancia de Mattermost completamente funcional, accesible desde cualquier parte del mundo a través de una conexión HTTPS segura. Nos centraremos en el uso de Docker y Docker Compose; estas herramientas permiten implementar, gestionar y actualizar aplicaciones fácilmente en contenedores aislados, lo que simplifica significativamente la operación. Nginx actuará como proxy inverso, procesando las solicitudes entrantes y dirigiéndolas al contenedor de Mattermost, además de garantizar el cifrado del tráfico mediante certificados SSL gratuitos de Let's Encrypt. Prestaremos especial atención a la configuración de las notificaciones push para clientes móviles y a la implementación de un sistema fiable de copia de seguridad automática de datos en un almacenamiento compatible con S3, lo cual es fundamental para cualquier sistema de producción.

Al final, obtendrá un sistema de comunicación tolerante a fallos y seguro que no depende de proveedores de la nube externos y está completamente bajo su control. Es una solución ideal para desarrolladores, startups, entusiastas de las criptomonedas y cualquiera que valore la privacidad y la soberanía sobre sus datos.

Alternativas: Cloud-managed vs Self-hosted

Al elegir una plataforma para la comunicación en equipo, generalmente hay dos opciones principales:

  • Soluciones Cloud-managed (Slack, Microsoft Teams, Mattermost Cloud): Estos servicios ofrecen la comodidad "llave en mano", sin requerir ningún conocimiento técnico para la instalación y el mantenimiento. Simplemente se registra, paga una tarifa de suscripción mensual y todo funciona. Sin embargo, confía completamente sus datos a un proveedor externo, pierde el control sobre su ubicación y seguridad, y está limitado en personalización e integraciones. El costo puede aumentar rápidamente con el número de usuarios.
  • Soluciones Self-hosted (Mattermost en VPS): Usted mismo implementa y gestiona la aplicación en su propio servidor. Esto requiere ciertas habilidades técnicas, pero ofrece ventajas innegables:
    • Control total sobre los datos: Sus datos permanecen en su servidor, bajo su control. Esto es crítico para empresas con altos requisitos de seguridad y confidencialidad.
    • Flexibilidad y personalización: Puede instalar cualquier plugin, modificar el código fuente (si es de código abierto), integrar con sistemas internos sin restricciones de API.
    • Ahorro: A largo plazo, una solución autoalojada suele ser más económica, especialmente para equipos grandes, ya que solo paga por el servidor, no por cada usuario.
    • Independencia: No depende de las políticas de precios ni de posibles fallos de un proveedor externo.

Elegimos el enfoque autoalojado en un VPS para obtener el máximo de ventajas con costos razonables y control total.

Qué configuración de VPS se necesita para esta tarea

Esquema: Qué configuración de VPS se necesita para esta tarea
Esquema: Qué configuración de VPS se necesita para esta tarea

Los requisitos del servidor para Mattermost dependen del número de usuarios y la intensidad de uso. Las siguientes recomendaciones son válidas para la instalación de Mattermost Team Edition.

Requisitos mínimos (hasta 50 usuarios activos)

  • CPU: 2 núcleos (x86-64)
  • RAM: 4 GB
  • Disco: 80 GB SSD (para SO, imágenes Docker, BD y archivos de usuario)
  • Red: 100 Mbps, tráfico ilimitado

Configuración recomendada (hasta 200 usuarios activos)

  • CPU: 4 núcleos (x86-64)
  • RAM: 8 GB
  • Disco: 160-200 GB NVMe SSD (para el máximo rendimiento del subsistema de disco)
  • Red: 1 Gbps, tráfico ilimitado

Para nuestra tarea de implementar Mattermost con Nginx, Docker y copias de seguridad, recomendamos orientarse a la configuración: 4 vCPU, 8 GB RAM, 160 GB NVMe SSD, red de 1 Gbps. Un servidor así garantizará un funcionamiento cómodo para un equipo de hasta 200 personas y dejará margen para el crecimiento. Un VPS con las características indicadas será la elección óptima para la mayoría de los equipos.

Cuándo se necesita un dedicado, no un VPS

Un servidor dedicado (dedicated server) se vuelve preferible en los siguientes casos:

  • Equipos muy grandes: Si espera más de 500 usuarios activos o miles de conexiones simultáneas.
  • Altos requisitos de rendimiento: Para sistemas críticos donde los retrasos son inaceptables y se requiere el máximo rendimiento de disco y CPU sin la influencia de "vecinos" en el VPS.
  • Requisitos específicos de seguridad/cumplimiento: Cuando se necesita aislamiento completo a nivel físico, o se requiere la instalación de hardware/software personalizado que no es posible en un VPS.
  • Uso intensivo de plugins e integraciones: Algunos plugins que consumen muchos recursos pueden requerir más recursos de los que puede proporcionar un VPS promedio.

Para la mayoría de los escenarios descritos en esta guía, un VPS potente será más que suficiente.

Ubicación: qué factores influyen

La elección de la ubicación del VPS es importante para:

  • Latencia: Cuanto más cerca esté el servidor de la mayoría de sus usuarios, menor será el ping y más rápida la respuesta. Para un equipo internacional, elija una ubicación central o utilice una CDN.
  • Legislación: La ubicación del servidor determina la jurisdicción a la que están sujetos sus datos. Esto es importante para cumplir con GDPR, HIPAA y otras regulaciones.
  • Costo: Los precios de los VPS pueden variar según la ubicación.

Se recomienda elegir una ubicación que esté geográficamente cerca de la mayoría de los usuarios de Mattermost.

Preparación del servidor

Esquema: Preparación del servidor
Esquema: Preparación del servidor

Se asume que tiene un VPS recién instalado con el sistema operativo Ubuntu Server 24.04 LTS. Todos los comandos se ejecutarán como un usuario con privilegios sudo.

1. Actualización del sistema e instalación de utilidades básicas

Primero, actualizaremos el sistema e instalaremos los paquetes necesarios.


sudo apt update && sudo apt upgrade -y # Actualización de la lista de paquetes y su actualización
sudo apt install -y curl wget git nano htop ufw fail2ban # Instalación de utilidades útiles y herramientas de seguridad

2. Creación de un nuevo usuario con privilegios sudo (si aún no lo ha hecho)

Trabajar como usuario root no es seguro. Crearemos un nuevo usuario y le daremos privilegios sudo.


sudo adduser mattermostuser # Creamos un nuevo usuario
sudo usermod -aG sudo mattermostuser # Añadimos el usuario al grupo sudo

Ahora, cierre la sesión de root e inicie sesión como el nuevo usuario mattermostuser.


exit
# Inicie sesión de nuevo: ssh mattermostuser@your_vps_ip

3. Configuración de claves SSH (recomendado)

El uso de claves SSH en lugar de contraseñas aumenta significativamente la seguridad.

En su máquina local:


ssh-keygen -t rsa -b 4096 # Generamos una nueva clave SSH (si no existe)
ssh-copy-id mattermostuser@your_vps_ip # Copiamos la clave pública al servidor

Ahora puede deshabilitar la autenticación por contraseña en SSH en el servidor. Edite el archivo /etc/ssh/sshd_config:


sudo nano /etc/ssh/sshd_config

Encuentre y modifique las siguientes líneas (o añádalas si no existen):


#...
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
#...

Reinicie el servicio SSH:


sudo systemctl restart sshd

4. Configuración del firewall (UFW)

UFW (Uncomplicated Firewall) es un firewall fácil de usar para Linux.


sudo ufw allow OpenSSH # Permitimos conexiones SSH
sudo ufw allow http # Permitimos HTTP (puerto 80)
sudo ufw allow https # Permitimos HTTPS (puerto 443)
sudo ufw enable # Habilitamos UFW
sudo ufw status # Verificamos el estado del firewall

Asegúrese de que SSH esté permitido antes de habilitar UFW, de lo contrario, podría perder el acceso al servidor.

5. Configuración de Fail2ban

Fail2ban protege el servidor contra ataques de fuerza bruta, bloqueando las direcciones IP desde las que se producen múltiples intentos fallidos de inicio de sesión.

Después de la instalación, funciona "de fábrica" con SSH. Para configurar reglas adicionales, puede crear el archivo /etc/fail2ban/jail.local:


sudo nano /etc/fail2ban/jail.local

Ejemplo de contenido (para SSH):


[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h

Reinicie Fail2ban:


sudo systemctl restart fail2ban
sudo fail2ban-client status # Verificamos el estado

Con esto, la preparación básica del servidor está completa.

Instalación de software — paso a paso

Diagrama: Instalación de software — paso a paso
Diagrama: Instalación de software — paso a paso

En esta sección, instalaremos Docker, Docker Compose, Nginx y los configuraremos para trabajar con Mattermost. Todas las versiones de software están actualizadas a 2026, lo que implica el uso de las últimas versiones estables.

1. Instalación de Docker Engine y Docker Compose

Docker es una plataforma para desarrollar, entregar y ejecutar aplicaciones en contenedores. Docker Compose permite definir y ejecutar aplicaciones Docker multicontenedor.


# Añadimos el repositorio de Docker
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Instalamos Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # Instalación de Docker y Docker Compose (v2)

# Añadimos el usuario actual al grupo docker para trabajar sin sudo
sudo usermod -aG docker mattermostuser # Reemplace mattermostuser con su nombre de usuario
newgrp docker # Aplicamos los cambios para la sesión actual, o reinicie sesión

# Verificamos la instalación de Docker
docker run hello-world # Ejecución de un contenedor de prueba
docker compose version # Verificación de la versión de Docker Compose

A partir de 2026, docker-compose-plugin es la forma preferida de instalar Docker Compose v2, que está integrado en la CLI de Docker.

2. Instalación de Nginx

Nginx funcionará como un proxy inverso para Mattermost, gestionando los certificados SSL y dirigiendo el tráfico.


sudo apt update
sudo apt install -y nginx # Instalación de Nginx (versión ~1.26.x para 2026 en Ubuntu 24.04 LTS)

sudo systemctl enable nginx # Habilitamos el inicio automático de Nginx
sudo systemctl start nginx # Iniciamos Nginx
sudo systemctl status nginx # Verificamos el estado de Nginx

Verifique la disponibilidad de Nginx abriendo la dirección IP de su servidor en el navegador. Debería ver la página "Welcome to Nginx!".

3. Instalación de Certbot (para Let's Encrypt SSL)

Certbot es un cliente para obtener y renovar automáticamente certificados SSL de Let's Encrypt.


sudo apt install -y certbot python3-certbot-nginx # Instalación de Certbot y el plugin para Nginx

Para que Certbot funcione, necesitará un nombre de dominio que apunte a la dirección IP de su VPS. Por ejemplo, chat.yourdomain.com.

4. Creación de directorios para Mattermost

Crearemos la estructura de directorios para almacenar la configuración de Mattermost, los datos y la base de datos PostgreSQL.


sudo mkdir -p /opt/mattermost/{app,data,db,logs,config,plugins,client/plugins} # Creación de la estructura principal
sudo chown -R mattermostuser:mattermostuser /opt/mattermost # Asignación de permisos al usuario actual
sudo chmod -R 770 /opt/mattermost # Establecimiento de permisos de acceso

Asegúrese de que su usuario mattermostuser tenga permisos de escritura en estos directorios.

Configuración

Diagrama: Configuración
Diagrama: Configuración

Esta sección se dedica a la configuración de todos los componentes: Docker Compose para Mattermost y PostgreSQL, Nginx para proxy y SSL, así como Mattermost para notificaciones push y copias de seguridad S3.

1. Preparación del archivo .env para secretos

Crearemos un archivo .env para almacenar variables de entorno y secretos, con el fin de no codificarlos directamente en docker-compose.yml.


nano /opt/mattermost/.env

Ejemplo del contenido de /opt/mattermost/.env:


# Mattermost
MM_HOSTNAME=chat.yourdomain.com # Reemplace con su dominio
MM_SITEURL=https://chat.yourdomain.com # Reemplace con su dominio
MM_DB_USERNAME=mmuser
MM_DB_PASSWORD=your_strong_db_password # Genere una contraseña segura
MM_DB_NAME=mattermost

# PostgreSQL
POSTGRES_USER=mmuser
POSTGRES_PASSWORD=your_strong_db_password
POSTGRES_DB=mattermost

Importante: Genere contraseñas realmente seguras para la base de datos. Utilice generadores en línea o un comando como openssl rand -base64 32.

2. Creación del archivo docker-compose.yml

Crearemos el archivo principal docker-compose.yml, que definirá los servicios de Mattermost, PostgreSQL y Nginx.


nano /opt/mattermost/docker-compose.yml

Ejemplo del contenido de /opt/mattermost/docker-compose.yml:


version: '3.8'

services:
  app:
    container_name: mattermost-app
    image: mattermost/mattermost-team-edition:9.6 # Versión actual para 2026, o use latest
    restart: unless-stopped
    environment:
      MM_SQLSETTINGS_DRIVERNAME: postgres
      MM_SQLSETTINGS_DATASOURCE: postgres://${MM_DB_USERNAME}:${MM_DB_PASSWORD}@db:5432/${MM_DB_NAME}?sslmode=disable&connect_timeout=10
      MM_SERVICESETTINGS_SITEURL: ${MM_SITEURL}
      MM_LOGSETTINGS_FILELOCATION: /mattermost/logs/mattermost.log
      MM_FILESETTINGS_DIRECTORY: /mattermost/data
      MM_EMAILSETTINGS_SENDEMAILNOTIFICATIONS: "true" # Habilite después de configurar SMTP
      MM_EMAILSETTINGS_FEEDBACKEMAIL: "[email protected]"
      MM_EMAILSETTINGS_SMTPUSERNAME: "smtp_user" # Reemplace con sus datos SMTP
      MM_EMAILSETTINGS_SMTPPASSWORD: "smtp_password"
      MM_EMAILSETTINGS_SMTPSERVER: "smtp.yourprovider.com"
      MM_EMAILSETTINGS_SMTPPORT: "587"
      MM_EMAILSETTINGS_CONNECTIONSECURITY: "STARTTLS"
      MM_EMAILSETTINGS_ENABLESMTPAUTH: "true"
      MM_MESSAGINGSETTINGS_ENABLEEMAILBATCHING: "true"
      MM_MESSAGINGSETTINGS_EMAILBATCHINGBUFFERSIZE: "256"
      MM_MESSAGINGSETTINGS_EMAILBATCHINGINTERVAL: "30" # Seconds
      MM_PUSHNOTIFICATIONSSETTINGS_ENABLEEXTENSIBLESERVICE: "true"
      MM_PUSHNOTIFICATIONSSETTINGS_GATEWAYURL: "https://push.mattermost.com" # Utilizamos la pasarela oficial
      # MM_PUSHNOTIFICATIONSSETTINGS_ANDROIDPUSHPROXYURL: "http://localhost:8065" # Para su propio MPNS
      # MM_PUSHNOTIFICATIONSSETTINGS_IOSPUSHPROXYURL: "http://localhost:8065" # Para su propio MPNS
    volumes:
      - /opt/mattermost/app:/mattermost:rw
      - /opt/mattermost/data:/mattermost/data:rw
      - /opt/mattermost/config:/mattermost/config:rw
      - /opt/mattermost/logs:/mattermost/logs:rw
      - /opt/mattermost/plugins:/mattermost/plugins:rw
      - /opt/mattermost/client/plugins:/mattermost/client/plugins:rw
    ports:
      - "8065:8065" # Mattermost escucha en 8065, Nginx actuará como proxy
    depends_on:
      - db
    networks:
      - mattermost-bridge

  db:
    container_name: mattermost-db
    image: postgres:16-alpine # Versión actual de PostgreSQL para 2026
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - /opt/mattermost/db:/var/lib/postgresql/data:rw
    networks:
      - mattermost-bridge

networks:
  mattermost-bridge:
    driver: bridge

Explicaciones:

  • mattermost-team-edition:9.6: Este es un ejemplo de la versión actual de Mattermost para 2026. Utilice siempre la última versión estable.
  • postgres:16-alpine: Última versión estable de PostgreSQL.
  • MM_SQLSETTINGS_DATASOURCE: Cadena de conexión a la base de datos. Utiliza variables de .env.
  • MM_SERVICESETTINGS_SITEURL: Parámetro importante que define la URL base de su instancia de Mattermost. Debe ser HTTPS.
  • volumes: Montaje de directorios locales del servidor en los contenedores para que los datos (configuraciones, archivos, DB) se conserven después de reiniciar los contenedores.
  • networks: Creamos una red interna de Docker para una interacción segura entre los contenedores.
  • Configuración SMTP: Reemplace con los datos de su proveedor SMTP para el envío de notificaciones por correo electrónico.
  • Notificaciones push: Por defecto, utilizamos la pasarela oficial de Mattermost (https://push.mattermost.com), que es la forma más sencilla. Configurar su propio MPNS (Mattermost Push Notification Service) requerirá un esfuerzo significativamente mayor y un servidor o contenedor separado.

3. Configuración de Nginx

Crearemos un archivo de configuración de Nginx para Mattermost. Primero, eliminaremos la configuración predeterminada:


sudo rm /etc/nginx/sites-enabled/default

Luego, crearemos un nuevo archivo de configuración para su dominio:


sudo nano /etc/nginx/sites-available/mattermost.conf

Ejemplo del contenido de /etc/nginx/sites-available/mattermost.conf:


server {
    listen 80;
    server_name chat.yourdomain.com; # Reemplace con su dominio

    location / {
        return 301 https://$host$request_uri; # Redirigimos todo el tráfico HTTP a HTTPS
    }
}

server {
    listen 443 ssl http2;
    server_name chat.yourdomain.com; # Reemplace con su dominio

    ssl_certificate /etc/letsencrypt/live/chat.yourdomain.com/fullchain.pem; # Ruta a su certificado SSL
    ssl_certificate_key /etc/letsencrypt/live/chat.yourdomain.com/privkey.pem; # Ruta a la clave privada
    ssl_trusted_certificate /etc/letsencrypt/live/chat.yourdomain.com/chain.pem;

    # Configuración SSL para seguridad
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1h;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
    ssl_dhparam /etc/ssl/certs/dhparam.pem; # Lo generaremos más tarde

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # Agregamos encabezados de seguridad
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer-when-downgrade";
    add_header Content-Security-Policy "frame-ancestors 'self'";

    client_max_body_size 50M; # Aumentamos el límite de tamaño de los archivos subidos
    client_body_buffer_size 128k;

    location ~ /api/v[0-9]+/(users/)?websocket$ {
        proxy_pass http://localhost:8065; # Mattermost escucha en 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_set_header X-Frame-Options SAMEORIGIN;
        proxy_buffering off; # Deshabilitamos el almacenamiento en búfer para WebSocket
    }

    location / {
        proxy_pass http://localhost:8065; # Mattermost escucha en 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_set_header X-Frame-Options SAMEORIGIN;
        proxy_buffers 256 16k; # Aumentamos los búferes del proxy
        proxy_buffer_size 16k;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}

Cree un enlace simbólico a este archivo en sites-enabled:


sudo ln -s /etc/nginx/sites-available/mattermost.conf /etc/nginx/sites-enabled/mattermost.conf

Genere el archivo dhparam.pem para fortalecer la seguridad SSL. Esto puede tardar varios minutos:


sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 # O 4096 para mayor seguridad

Verifique la sintaxis de Nginx y reinícielo:


sudo nginx -t # Verificación de sintaxis
sudo systemctl restart nginx # Reinicio de Nginx

4. Obtención de certificados SSL con Certbot

Ahora que Nginx está configurado y escucha en el puerto 80, se pueden obtener los certificados de Let's Encrypt.


sudo certbot --nginx -d chat.yourdomain.com # Reemplace con su dominio

Certbot hará varias preguntas (correo electrónico, aceptación de términos, redirección HTTP a HTTPS). Elija la redirección automática (opción 2, si se le ofrece). Certbot actualizará automáticamente su configuración de Nginx e instalará los certificados.

Verifique que la actualización automática funcione:


sudo systemctl status certbot.timer # Verificación del temporizador systemd para Certbot
sudo certbot renew --dry-run # Actualización de prueba

5. Inicio de Mattermost con Docker Compose

Vaya al directorio con docker-compose.yml e inicie los servicios.


cd /opt/mattermost
docker compose up -d # Inicio de contenedores en segundo plano

Verifique el estado de los contenedores:


docker compose ps

Debería ver que los contenedores mattermost-app y mattermost-db están en estado running.

6. Verificación de la funcionalidad

Abra su dominio en el navegador (por ejemplo, https://chat.yourdomain.com). Debería ver la página de bienvenida de Mattermost y la opción de crear una cuenta de administrador.

También puede verificar la disponibilidad usando curl en el servidor:


curl -I https://chat.yourdomain.com # Verificación de acceso HTTPS
curl http://localhost:8065/api/v4/system/ping # Verificación de acceso directo a la API de Mattermost desde el servidor

Si todo está configurado correctamente, la primera solicitud mostrará HTTP/200 OK, y la segunda — {"status":"OK"} o una respuesta similar.

Copias de seguridad y mantenimiento

Esquema: Copias de seguridad y mantenimiento
Esquema: Copias de seguridad y mantenimiento

Una copia de seguridad fiable es un aspecto crítico de cualquier sistema de producción. Configuraremos copias de seguridad automáticas de la base de datos y los archivos de Mattermost en un almacenamiento compatible con S3.

1. Qué respaldar

Para Mattermost, es necesario respaldar tres grupos principales de datos:

  1. Base de datos PostgreSQL: Contiene toda la información sobre usuarios, canales, mensajes, configuraciones, etc. Esta es la parte más importante.
  2. Archivos de usuario: Todos los archivos subidos por los usuarios (imágenes, documentos, etc.) se almacenan en el directorio /opt/mattermost/data.
  3. Archivos de configuración: El archivo config.json (en /opt/mattermost/config) y docker-compose.yml, .env.

2. Instalación de AWS CLI y configuración de S3

Utilizaremos AWS CLI para interactuar con el almacenamiento compatible con S3. Puede ser Amazon S3 o cualquier otro proveedor que admita la API de S3 (por ejemplo, MinIO, DigitalOcean Spaces, Vultr Object Storage).


sudo apt install -y python3-pip # Instalamos pip, si no está presente
pip install awscli # Instalamos AWS CLI

Configure AWS CLI, especificando las credenciales de S3. Necesitará Access Key ID, Secret Access Key y region.


aws configure # Ejecute e introduzca sus datos
# AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID
# AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
# Default region name [None]: YOUR_S3_REGION (por ejemplo, us-east-1 o ru-central1)
# Default output format [None]: json

3. Script de copia de seguridad automática

Crearemos un script que realizará un volcado de la base de datos, archivará los archivos y subirá todo a S3.


nano /opt/mattermost/backup_mattermost.sh

Ejemplo del contenido de /opt/mattermost/backup_mattermost.sh:


#!/bin/bash

# Load environment variables
source /opt/mattermost/.env

# --- Configuration ---
BACKUP_DIR="/opt/mattermost/backups"
S3_BUCKET="s3://your-mattermost-backup-bucket" # Reemplace con el nombre de su bucket S3
DATE=$(date +%Y-%m-%d-%H%M%S)
DB_BACKUP_FILE="${BACKUP_DIR}/mattermost_db_${DATE}.sql"
FILES_BACKUP_FILE="${BACKUP_DIR}/mattermost_files_${DATE}.tar.gz"
CONFIG_BACKUP_FILE="${BACKUP_DIR}/mattermost_config_${DATE}.tar.gz"
LOG_FILE="/var/log/mattermost_backup.log"

# --- Create backup directory ---
mkdir -p "$BACKUP_DIR" >> "$LOG_FILE" 2>&1
echo "--- Starting Mattermost backup at ${DATE} ---" >> "$LOG_FILE"

# --- 1. Database Backup ---
echo "Dumping PostgreSQL database..." >> "$LOG_FILE"
docker compose exec -T db pg_dump -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" > "${DB_BACKUP_FILE}" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
    echo "Database dump successful: ${DB_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Database dump FAILED!" >> "$LOG_FILE"
fi

# --- 2. Files Backup ---
echo "Archiving Mattermost data files..." >> "$LOG_FILE"
tar -czf "${FILES_BACKUP_FILE}" -C /opt/mattermost data >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
    echo "Files archive successful: ${FILES_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Files archive FAILED!" >> "$LOG_FILE"
fi

# --- 3. Configuration Files Backup ---
echo "Archiving Mattermost configuration files..." >> "$LOG_FILE"
tar -czf "${CONFIG_BACKUP_FILE}" -C /opt/mattermost config docker-compose.yml .env >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
    echo "Config archive successful: ${CONFIG_BACKUP_FILE}" >> "$LOG_FILE"
else
    echo "Config archive FAILED!" >> "$LOG_FILE"
fi

# --- Upload to S3 ---
echo "Uploading backups to S3 bucket: ${S3_BUCKET}..." >> "$LOG_FILE"
aws s3 cp "${DB_BACKUP_FILE}" "${S3_BUCKET}/db/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1
aws s3 cp "${FILES_BACKUP_FILE}" "${S3_BUCKET}/files/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1
aws s3 cp "${CONFIG_BACKUP_FILE}" "${S3_BUCKET}/config/" --region YOUR_S3_REGION >> "$LOG_FILE" 2>&1

if [ $? -eq 0 ]; then
    echo "S3 upload successful." >> "$LOG_FILE"
else
    echo "S3 upload FAILED!" >> "$LOG_FILE"
fi

# --- Cleanup local backups (optional) ---
echo "Cleaning up local backup files older than 7 days..." >> "$LOG_FILE"
find "${BACKUP_DIR}" -type f -name "mattermost_.sql" -mtime +7 -delete >> "$LOG_FILE" 2>&1
find "${BACKUP_DIR}" -type f -name "mattermost_.tar.gz" -mtime +7 -delete >> "$LOG_FILE" 2>&1
echo "Cleanup complete." >> "$LOG_FILE"

echo "--- Mattermost backup finished at $(date +%Y-%m-%d-%H%M%S) ---" >> "$LOG_FILE"
echo "" >> "$LOG_FILE" # Add a newline for readability

Haga el script ejecutable:


chmod +x /opt/mattermost/backup_mattermost.sh

Pruebe el script manualmente:


/opt/mattermost/backup_mattermost.sh

Verifique el contenido de /var/log/mattermost_backup.log y su bucket S3.

4. Configuración de Cron para el inicio automático

Añadiremos el script al programador Cron para su ejecución diaria, por ejemplo, a las 3 de la madrugada.


crontab -e

Añada la siguiente línea al final del archivo:


0 3 * * * /opt/mattermost/backup_mattermost.sh >> /var/log/cron.log 2>&1

Esta línea significa: "Cada día a las 3:00 de la madrugada ejecutar el script backup_mattermost.sh".

5. Mantenimiento y actualizaciones

  • Actualización del SO: Ejecute regularmente sudo apt update && sudo apt upgrade -y para mantener su sistema operativo actualizado.
  • Actualización de Docker y Docker Compose: Se actualizan junto con el SO, si están instalados desde los repositorios.
  • Actualización de Mattermost: Para actualizar el contenedor de Mattermost, cambie la etiqueta de la imagen en docker-compose.yml a la nueva versión (por ejemplo, de 9.6 a 9.7), luego ejecute:
    
    cd /opt/mattermost
    docker compose pull app # Descargar la nueva imagen
    docker compose up -d # Recrear el contenedor con la nueva imagen
    

    Lea siempre la documentación oficial de Mattermost antes de actualizar, ya que puede haber cambios en la base de datos que requieran migración.

  • Actualización de Nginx: Se actualiza junto con el SO.
  • Monitorización: Supervise el uso de los recursos del servidor (CPU, RAM, disco) con htop o sistemas de monitorización más avanzados.
  • Registros: Revise regularmente los registros de Mattermost (/opt/mattermost/logs/mattermost.log) y de los contenedores Docker (docker compose logs app) en busca de errores.

Troubleshooting + FAQ

Aquí se recopilan las respuestas a las preguntas frecuentes y las soluciones a los problemas típicos que pueden surgir durante la instalación y operación de Mattermost.

Mattermost no se inicia, error de conexión a la base de datos. ¿Qué hacer?

Qué verificar: Asegúrese de que el contenedor mattermost-db esté en ejecución y accesible. Revise los registros del contenedor de la base de datos en busca de errores. También verifique el archivo .env para la corrección del nombre de usuario, contraseña y nombre de la base de datos. Asegúrese de que los puertos no estén ocupados por otros procesos. Es posible que el contenedor de Mattermost se haya iniciado antes de que PostgreSQL se inicializara por completo.

Cómo solucionarlo:


        cd /opt/mattermost
        docker compose logs db # Ver registros de la BD
        docker compose restart db app # Reiniciar primero la BD, luego la aplicación
        

Asegúrese de que MM_SQLSETTINGS_DATASOURCE en docker-compose.yml se refiere correctamente al servicio db (postgres://user:pass@db:5432/dbname).

¿Qué configuración mínima de VPS es adecuada?

Para un equipo pequeño de hasta 50 usuarios activos, un VPS con 2 vCPU, 4 GB de RAM y 80 GB de SSD será mínimamente adecuado. Esto permitirá ejecutar Docker, Mattermost y PostgreSQL, así como Nginx y proporcionar un rendimiento básico. Sin embargo, para un trabajo cómodo y margen de crecimiento, especialmente al usar plugins, se recomienda 4 vCPU, 8 GB de RAM y 160 GB de NVMe SSD.

Nginx devuelve un error 502 Bad Gateway.

Qué verificar: El error 502 generalmente significa que Nginx no pudo comunicarse con el servicio de backend (en nuestro caso, con el contenedor de Mattermost en el puerto 8065). Verifique si el contenedor mattermost-app está en ejecución: docker compose ps. Asegúrese de que Mattermost esté escuchando en el puerto 8065 dentro del contenedor y que en docker-compose.yml el puerto esté correctamente mapeado (8065:8065).

Cómo solucionarlo:


        docker compose logs app # Ver registros de Mattermost
        sudo systemctl restart nginx # Reiniciar Nginx
        

Asegúrese de que en el archivo /etc/nginx/sites-available/mattermost.conf la línea proxy_pass http://localhost:8065; esté especificada correctamente.

¿Qué elegir: VPS o dedicado para esta tarea?

Para la mayoría de los equipos de hasta 500 usuarios y cargas de trabajo medias, un VPS será una solución óptima y económicamente ventajosa. Un servidor dedicado debe elegirse si tiene un equipo muy grande (más de 500 usuarios activos), requisitos de rendimiento críticamente altos sin demoras, requisitos específicos de aislamiento de hardware o si planea ejecutar muchas otras aplicaciones que consumen muchos recursos en el mismo servidor.

No llegan las notificaciones push móviles.

Qué verificar: Asegúrese de que en config.json de Mattermost (que se puede editar a través de la interfaz web en la sección "System Console" -> "Notifications" -> "Push Notifications") el parámetro "Enable Push Notifications" esté activado y "Push Notification Server" esté configurado en https://push.mattermost.com (o en la dirección de su propio MPNS). Verifique que su servidor tenga acceso saliente a esta URL. También asegúrese de que en docker-compose.yml las variables de entorno para las notificaciones push estén configuradas, como se indica en la sección "Configuración".

Cómo solucionarlo: Revise los registros de Mattermost en busca de errores relacionados con las notificaciones push. Si utiliza su propio MPNS, asegúrese de que esté configurado correctamente y sea accesible. Verifique que en su servidor el tráfico saliente esté abierto en el puerto 443 para push.mattermost.com. Si acaba de configurarlo, intente volver a iniciar sesión en la aplicación móvil.

El certificado SSL no funciona o ha caducado.

Qué verificar: Asegúrese de que Certbot haya configurado correctamente la renovación automática. Verifique el estado del temporizador de Certbot: sudo systemctl status certbot.timer. Asegúrese de que el nombre de dominio chat.yourdomain.com (o el suyo) esté correctamente especificado en la configuración de Nginx y en el comando Certbot. Revise los registros de Certbot en busca de errores durante la renovación.

Cómo solucionarlo: Intente renovar manualmente los certificados: sudo certbot renew --force-renewal. Si esto no ayuda, verifique que los registros DNS de su dominio apunten correctamente a la IP de su servidor. Asegúrese de que el puerto 80 esté abierto para Certbot durante el proceso de renovación.

Conclusiones y próximos pasos

Esquema: Conclusiones y próximos pasos
Esquema: Conclusiones y próximos pasos

¡Felicidades! Ha desplegado con éxito un servidor Mattermost completamente funcional en su VPS. Ahora tiene una plataforma potente, segura y totalmente controlada para la comunicación en equipo, que se ejecuta en Docker, está protegida por Nginx con SSL y admite notificaciones push móviles, así como copias de seguridad automáticas en un almacenamiento compatible con S3. Esto le otorga total soberanía sobre sus datos y flexibilidad en la configuración.

Próximos pasos para la optimización y expansión de la funcionalidad:

  • Configuración SMTP: Asegúrese de configurar el envío de correo electrónico (SMTP) en la Consola del Sistema de Mattermost para el registro de usuarios, restablecimiento de contraseñas y notificaciones.
  • Integraciones y plugins: Explore el rico ecosistema de plugins e integraciones de Mattermost. Puede añadir soporte para llamadas de voz/video (Jitsi, Zoom), integraciones con sistemas de control de versiones (GitHub, GitLab), sistemas CI/CD y muchos otros servicios.
  • Monitorización y registro: Para sistemas de producción, se recomienda configurar una monitorización más avanzada (Prometheus, Grafana) y un registro centralizado (ELK Stack o Graylog) para el seguimiento del rendimiento y la respuesta rápida a los problemas.
  • Escalado: Si su equipo crece significativamente, considere escalar Mattermost, separando la base de datos y el almacenamiento de archivos en servidores individuales o utilizando soluciones de clúster para Mattermost.

¿Te fue útil esta guía?

Mattermost autoalojado en VPS: instalación con Docker, Nginx, notificaciones push y
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.