--- title: "Cómo instalar Mattermost en Ubuntu 24.04 con PostgreSQL" description: "Instala Mattermost en Ubuntu 24.04 con PostgreSQL, publícalo detrás de Nginx con HTTPS de Let's Encrypt y crea tu primer equipo de chat autohospedado." category: "Hosting de Aplicaciones Web" language: es source: https://cubepath.com/es/docs/hosting-de-aplicaciones-web/instalacion-de-mattermost-para-comunicacion-de-equipo updated: 2026-09-25 --- # Cómo instalar Mattermost en Ubuntu 24.04 con PostgreSQL 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): ```bash sudo apt update sudo apt install postgresql ``` Abre la consola de PostgreSQL como el superusuario `postgres`: ```bash 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: ```sql 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: ```bash psql -h 127.0.0.1 -U mmuser -d mattermost -c "SELECT current_user;" ``` ```output 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: ```bash 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: ```bash 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: ```bash 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: ```bash sudo -u mattermost /opt/mattermost/bin/mattermost version ``` ```output 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: ```bash 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: ```json "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: ```json "DriverName": "postgres", "DataSource": "postgres://mmuser:your_strong_password@127.0.0.1:5432/mattermost?sslmode=disable&connect_timeout=10", ``` > Nota: si la contraseña contiene caracteres especiales como `@`, `:` o `/`, codifícalos en formato URL (por ejemplo `@` pasa a ser `%40`), o la cadena de conexión no será válida. Protege el archivo, ya que contiene la contraseña de la base de datos: ```bash 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: ```bash sudo nano /etc/systemd/system/mattermost.service ``` ```ini [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: ```bash sudo systemctl daemon-reload sudo systemctl enable --now mattermost ``` Comprueba el estado y el endpoint de salud de la API: ```bash systemctl status mattermost --no-pager curl -s http://127.0.0.1:8065/api/v4/system/ping ``` ```output ● 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: ```bash sudo apt install nginx sudo ufw allow OpenSSH sudo ufw allow "Nginx Full" sudo ufw enable ``` Crea el sitio de Mattermost: ```bash 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: ```nginx 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: ```bash 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 ``` ```output 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: ```bash sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d chat.your_domain ``` Comprueba que la renovación automática funcionará: ```bash sudo certbot renew --dry-run ``` ```output Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/chat.your_domain/fullchain.pem (success) ``` Y que el sitio responde por HTTPS: ```bash curl -s https://chat.your_domain/api/v4/system/ping ``` ```output {"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: ```bash sudo nano /usr/local/bin/mattermost-backup ``` ```bash #!/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: ```bash sudo chmod 750 /usr/local/bin/mattermost-backup sudo /usr/local/bin/mattermost-backup sudo ls -lh /var/backups/mattermost ``` ```output -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: ```bash sudo crontab -e ``` ```text 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`: ```bash 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: ```bash 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.