Mattermost es una plataforma de mensajería para equipos, de código abierto y autohospedada, con canales, mensajes directos, hilos, búsqueda y webhooks. Es una alternativa a Slack en la que los mensajes y archivos se quedan en tu servidor. En este tutorial instalarás Mattermost en Ubuntu 24.04 a partir del paquete oficial, con PostgreSQL como base de datos y Nginx como proxy inverso con HTTPS.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 vCPU y 4 GB de RAM (suficiente para equipos de unos cientos de usuarios).
  • Un usuario no root con privilegios sudo.
  • Un subdominio (en esta guía, chat.your_domain) con un registro DNS A que apunte a la IP pública del servidor.
  • Los puertos 80 y 443 accesibles desde Internet.

Paso 1: Instalar y preparar PostgreSQL

Mattermost usa PostgreSQL como base de datos. Instala la versión que incluye Ubuntu 24.04 (PostgreSQL 16):

sudo apt update
sudo apt install postgresql

Abre la consola de PostgreSQL como el superusuario postgres:

sudo -u postgres psql

Crea el usuario mmuser y una base de datos de la que sea propietario. Al ser propietario, tiene permisos sobre el esquema public, algo que desde PostgreSQL 15 ya no se concede a todos los usuarios. Sustituye your_strong_password por una contraseña larga y aleatoria:

CREATE USER mmuser WITH PASSWORD 'your_strong_password';
CREATE DATABASE mattermost OWNER mmuser;
\q

Comprueba que el usuario puede conectarse por TCP, que es como lo hará Mattermost:

psql -h 127.0.0.1 -U mmuser -d mattermost -c "SELECT current_user;"
 current_user
--------------
 mmuser
(1 row)

Paso 2: Descargar Mattermost

Consulta la última versión estable en la página de descargas de Mattermost (https://mattermost.com/download/) o en sus notas de versión, y guárdala en una variable. Sustituye X.Y.Z por el número real:

MM_VERSION=X.Y.Z
cd /tmp
wget "https://releases.mattermost.com/${MM_VERSION}/mattermost-${MM_VERSION}-linux-amd64.tar.gz"

Extrae el paquete en /opt y crea el directorio donde Mattermost guardará los archivos que suban los usuarios:

sudo tar -xzf "mattermost-${MM_VERSION}-linux-amd64.tar.gz" -C /opt
sudo mkdir /opt/mattermost/data

Crea un usuario de sistema sin shell para ejecutar el servicio y dale la propiedad del directorio:

sudo useradd --system --user-group mattermost
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost

Comprueba la versión instalada:

sudo -u mattermost /opt/mattermost/bin/mattermost version
Version: X.Y.Z
...

Paso 3: Configurar la conexión a la base de datos

La configuración de Mattermost está en un archivo JSON. Ábrelo:

sudo nano /opt/mattermost/config/config.json

Dentro de ServiceSettings, cambia estas dos claves. SiteURL debe ser la URL pública exacta, y ListenAddress hace que Mattermost escuche solo en local, ya que el acceso externo pasará por Nginx:

"SiteURL": "https://chat.your_domain",
"ListenAddress": "127.0.0.1:8065",

Dentro de SqlSettings, ajusta el controlador y la cadena de conexión con la contraseña del paso 1:

"DriverName": "postgres",
"DataSource": "postgres://mmuser:[email protected]:5432/mattermost?sslmode=disable&connect_timeout=10",

Protege el archivo, ya que contiene la contraseña de la base de datos:

sudo chmod 600 /opt/mattermost/config/config.json
sudo chown mattermost:mattermost /opt/mattermost/config/config.json

Paso 4: Crear el servicio de systemd

Crea una unidad de systemd para que Mattermost arranque con el sistema y se reinicie si falla:

sudo nano /etc/systemd/system/mattermost.service
[Unit]
Description=Mattermost
After=network.target postgresql.service
BindsTo=postgresql.service

[Service]
Type=notify
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152

[Install]
WantedBy=multi-user.target

Type=notify hace que systemd espere a que Mattermost confirme que ha arrancado. En el primer inicio, Mattermost crea todas las tablas, por eso el tiempo de arranque permitido es tan amplio.

Recarga systemd, activa el servicio y arráncalo:

sudo systemctl daemon-reload
sudo systemctl enable --now mattermost

Comprueba el estado y el endpoint de salud de la API:

systemctl status mattermost --no-pager
curl -s http://127.0.0.1:8065/api/v4/system/ping
● mattermost.service - Mattermost
     Active: active (running) since ...
{"ActiveSearchBackend":"database",...,"status":"OK"}

Si el servicio no arranca, revisa el registro con sudo journalctl -u mattermost -n 50: el error más habitual es una cadena DataSource incorrecta.

Paso 5: Configurar Nginx como proxy inverso

Instala Nginx y abre los puertos en el cortafuegos. Permite SSH antes de activar UFW para no perder la conexión:

sudo apt install nginx
sudo ufw allow OpenSSH
sudo ufw allow "Nginx Full"
sudo ufw enable

Crea el sitio de Mattermost:

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

La aplicación mantiene una conexión WebSocket abierta para recibir mensajes en tiempo real, por eso la ruta del WebSocket necesita las cabeceras Upgrade y Connection y un tiempo de lectura más largo:

upstream mattermost_backend {
    server 127.0.0.1:8065;
    keepalive 32;
}

server {
    listen 80;
    listen [::]:80;
    server_name chat.your_domain;

    client_max_body_size 100M;

    location ~ /api/v[0-9]+/(users/)?websocket$ {
        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 600s;
        proxy_pass http://mattermost_backend;
    }

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        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 600s;
        proxy_pass http://mattermost_backend;
    }
}

client_max_body_size limita el tamaño de los archivos adjuntos; ajústalo al valor de Tamaño máximo de archivo que configures en Mattermost.

Activa el sitio, desactiva el sitio por defecto y recarga Nginx:

sudo ln -s /etc/nginx/sites-available/mattermost /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Paso 6: Activar HTTPS con Let's Encrypt

Instala Certbot con el plugin de Nginx y solicita el certificado. Certbot añade la configuración TLS al sitio y la redirección de HTTP a HTTPS:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d chat.your_domain

Comprueba que la renovación automática funcionará:

sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/chat.your_domain/fullchain.pem (success)

Y que el sitio responde por HTTPS:

curl -s https://chat.your_domain/api/v4/system/ping
{"ActiveSearchBackend":"database",...,"status":"OK"}

Paso 7: Crear el administrador y el primer equipo

Abre https://chat.your_domain en el navegador. La primera cuenta que se registra se convierte en administrador del sistema, así que hazlo en cuanto termines la instalación:

  1. Crea tu cuenta con correo, nombre de usuario y contraseña.
  2. Indica el nombre de tu organización y crea el primer equipo.
  3. Sáltate o completa el resto del asistente inicial.

A continuación, entra en Consola del sistema (menú de productos, arriba a la izquierda) y revisa estos ajustes:

  • Autenticación > Registro: desactiva la creación abierta de cuentas si solo quieres que entren usuarios invitados.
  • Entorno > SMTP: configura un servidor de correo para que funcionen las invitaciones, el restablecimiento de contraseñas y las notificaciones por email.
  • Entorno > Almacenamiento de archivos: el valor por defecto guarda los adjuntos en /opt/mattermost/data. Puedes cambiarlo a un almacenamiento compatible con S3.

Los cambios de la consola se guardan en config.json, por eso el usuario mattermost necesita permiso de escritura sobre él.

Para verificar que el tiempo real funciona, abre Mattermost en dos navegadores con dos usuarios distintos y envía un mensaje directo: debe aparecer al instante sin recargar la página. Si solo aparece al recargar, la ruta del WebSocket en Nginx no está bien configurada.

Paso 8: Hacer copias de seguridad

Una copia de Mattermost se compone de la base de datos, el directorio data (adjuntos) y el archivo config.json. Crea un script para generarla:

sudo nano /usr/local/bin/mattermost-backup
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/mattermost"
STAMP="$(date +%F_%H%M)"

mkdir -p "$BACKUP_DIR"
sudo -u postgres pg_dump -Fc mattermost > "$BACKUP_DIR/db_${STAMP}.dump"
tar -czf "$BACKUP_DIR/files_${STAMP}.tar.gz" -C /opt/mattermost data config/config.json

# Conserva solo las copias de los últimos 7 días
find "$BACKUP_DIR" -type f -mtime +7 -delete

Hazlo ejecutable y pruébalo:

sudo chmod 750 /usr/local/bin/mattermost-backup
sudo /usr/local/bin/mattermost-backup
sudo ls -lh /var/backups/mattermost
-rw-r--r-- 1 root root 2.1M ... db_2026-09-25_0300.dump
-rw-r--r-- 1 root root  15M ... files_2026-09-25_0300.tar.gz

Programa la copia cada noche a las 03:00 con el crontab de root:

sudo crontab -e
0 3 * * * /usr/local/bin/mattermost-backup

Para restaurar la base de datos en un servidor nuevo, detén Mattermost y usa sudo -u postgres pg_restore --clean -d mattermost db_FECHA.dump. Copia las copias fuera del servidor para que sirvan si este se pierde.

Paso 9: Actualizar Mattermost

Para actualizar, detén el servicio, haz una copia de seguridad y sustituye los binarios conservando config, data, logs y los plugins. Descarga y extrae la nueva versión en /tmp:

sudo systemctl stop mattermost
sudo /usr/local/bin/mattermost-backup
MM_VERSION=X.Y.Z
cd /tmp
wget "https://releases.mattermost.com/${MM_VERSION}/mattermost-${MM_VERSION}-linux-amd64.tar.gz"
tar -xzf "mattermost-${MM_VERSION}-linux-amd64.tar.gz" --transform='s,^[^/]\+,mattermost-upgrade,'

Borra de la instalación actual todo excepto los directorios con datos (incluidos los plugins del cliente), copia los archivos nuevos y restablece los permisos:

sudo find /opt/mattermost/ -mindepth 1 -maxdepth 1 \
  ! -name config ! -name data ! -name logs ! -name plugins ! -name client \
  -exec rm -rf {} +
sudo find /opt/mattermost/client/ -mindepth 1 -maxdepth 1 ! -name plugins -exec rm -rf {} +
sudo cp -an /tmp/mattermost-upgrade/. /opt/mattermost/
sudo chown -R mattermost:mattermost /opt/mattermost
sudo systemctl start mattermost

cp -an no sobrescribe archivos existentes, así que tu config.json se conserva. Lee siempre las notas de versión antes de saltar varias versiones mayores: algunas requieren pasos adicionales.

Solución de problemas

  • Error 502 Bad Gateway: Mattermost no está escuchando. Comprueba systemctl status mattermost y curl http://127.0.0.1:8065/api/v4/system/ping.
  • "Please check connection, Mattermost unreachable" en el navegador: falla el WebSocket. Revisa el bloque location del WebSocket en Nginx y que SiteURL coincide exactamente con la URL que usas.
  • "pq: password authentication failed for user mmuser" en journalctl -u mattermost: la contraseña de DataSource no coincide con la de PostgreSQL o contiene caracteres sin codificar.
  • Los adjuntos grandes fallan con error 413: aumenta client_max_body_size en Nginx y recarga el servicio.

Conclusión

Ya tienes Mattermost funcionando en Ubuntu 24.04 con PostgreSQL, Nginx y HTTPS, con copias de seguridad diarias. Como siguientes pasos, configura el SMTP para enviar invitaciones, conecta tus herramientas con webhooks entrantes desde Integraciones y valida el acceso desde las aplicaciones de escritorio y móvil de Mattermost.