Como alojar tu propio SLACK en Ubuntu 20.04

En este tutorial te voy a enseñar como alojar tu propio Slack en Ubuntu usando la herramienta de código abierto Mattermost.

Como alojar tu propio SLACK en Ubuntu

Si bien esta herramienta se compara con Slack o con Teams, tiene algunas funcionalidades adicionales que permiten trabajar colaborativamente y lo mejor de todo, al poder auto alojarla en tu VPS, dispones de la seguridad de privacidad de tus servidores.

Requisitos previos:

Como alojar tu propio SLACK en Ubuntu

Paso 1: Preparando el servidor

Una vez te hayas conectado al servidor por ssh, actualiza los paquetes con los siguientes comandos:

sudo apt update
sudo apt upgrade

Paso 2: Instalar el servidor de bases de datos MariaDB

MariaDB es un sustituto directo de MySQL. Ha sido desarrollado por antiguos miembros del equipo de MySQL a quienes les preocupa que Oracle pueda convertir MySQL en un producto de código cerrado. Introduce el siguiente comando para instalar MariaDB en Ubuntu 20.04.

sudo apt install mariadb-server mariadb-client

Una vez instalado, el servidor MariaDB debería iniciarse automáticamente. Utiliza systemctl para comprobar su estado.

systemctl status mariadb

Respuesta:

● mariadb.service - MariaDB 10.3.22 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-04-10 14:19:16 UTC; 18s ago
       Docs: man:mysqld(8)
             https://mariadb.com/kb/en/library/systemd/
   Main PID: 9161 (mysqld)
     Status: "Taking your SQL requests now..."
      Tasks: 31 (limit: 9451)
     Memory: 64.7M
     CGroup: /system.slice/mariadb.service
             └─9161 /usr/sbin/mysqld

Si no se está ejecutando, inícialo con este comando:

sudo systemctl start mariadb

Para que MariaDB se inicie automáticamente en el arranque, ejecuta

sudo systemctl enable mariadb

Ahora ejecuta el script de seguridad posterior a la instalación.

sudo mysql_secure_installation

Cuando te pida que introduzcas la contraseña de root de MariaDB, pulsa la tecla Enter ya que la contraseña de root aún no está establecida. A continuación, introduce y para establecer la contraseña de root para el servidor MariaDB.

A continuación, puedes pulsar Enter para responder a todas las preguntas restantes, lo que eliminará el usuario anónimo, deshabilitará el inicio de sesión de root remoto y eliminará la base de datos de prueba. Este paso es un requisito básico para la seguridad de la base de datos MariaDB. (Observe que Y está en mayúsculas, lo que significa que es la respuesta por defecto).

Por defecto, el paquete de MariaDB en Ubuntu utiliza unix_socket para autenticar el inicio de sesión del usuario, lo que básicamente significa que puede utilizar el nombre de usuario y la contraseña del sistema operativo para iniciar sesión en la consola de MariaDB. Así que puedes ejecutar el siguiente comando para iniciar sesión sin proporcionar la contraseña de root de MariaDB.

sudo mariadb -u root -p

Para salir, ejecuta

exit;

Comprueba la información de la versión del servidor MariaDB.

mariadb --version

Como puedes ver, hemos instalado MariaDB 10.3.22.

mariadb  Ver 15.1 Distrib 10.3.22-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Paso 3: Crear una base de datos

A continuación, tendrás que crear una base de datos y un usuario para Mahara. Primero, conectate a MariaDB con el siguiente comando:

sudo mysql

Una vez conectado, crea una base de datos y un usuario con el siguiente comando: (cambia las palabras en azul por tus propios datos)

create database mattermost character set utf8mb4;
grant all on mattermost .* to 'mmuser'@'localhost' identified by 'contraseña';

A continuación, vacía los privilegios y sal de MariaDB con el siguiente comando:

flush privileges;
exit;

Una vez creada la base de datos, puedes proceder a la configuración de Mattermost

Paso 4: Instalación de Mattermost Server

Para instalar Mattermost Server en Ubuntu

Descarga la última versión del servidor Mattermost. En el siguiente comando, sustituy2 X.X.X por la versión que desee descargar:

en el momento de este tutorial la ultima version es:

sudo wget https://releases.mattermost.com/6.6.1/mattermost-6.6.1-linux-amd64.tar.gz

Extrae los archivos del Servidor Mattermost.

sudo tar -xvzf mattermost*.gz

Mueve el archivo extraído al directorio /opt.

sudo mv mattermost /opt

Crea el directorio de almacenamiento de archivos.

sudo mkdir /opt/mattermost/data

Nota: El directorio de almacenamiento contendrá todos los archivos e imágenes que tus usuarios publiquen en Mattermost, por lo que debes asegurarte de que la unidad es lo suficientemente grande como para albergar el número previsto de archivos e imágenes subidos.

Configura un usuario del sistema y un grupo llamado mattermost que ejecutará este servicio, y establece la propiedad y los permisos.

Cree el usuario y el grupo Mattermost:

sudo useradd --system --user-group mattermost

Establezca el usuario y el grupo mattermost como propietario de los archivos Mattermost:

sudo chown -R mattermost:mattermost /opt/mattermost

Dar permisos de escritura al grupo mattermost:

sudo chmod -R g+w /opt/mattermost

Configura el controlador de la base de datos en el archivo /opt/mattermost/config/config.json. Abra el archivo en un editor de texto y realiza los siguientes cambios:

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

Cambia el valor de la variable  "DriverName" a "mysql"

Cambia el valor de la variable  "DataSource" al siguiente valor, sustituyendo mmuser:contraseña con los valores adecuados, los que usaste para crear la base de datos y el usuario de base de datos con su contraseña.Asegúrate también de que el nombre de la base de datos es mattermost (el que tu usases como nombre de base de datos).

mmuser:contraseña@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s

Cambia el valor de la variable "SiteURL" a la URL base completa del sitio (e.g. "https://mattermost.tu_dominio.com").

Pruebe el servidor Mattermost para asegurarte de que todo funciona.

Cambia al directorio mattermost:

cd /opt/mattermost

Start the Mattermost server as the user mattermost:

sudo -u mattermost ./bin/mattermost

Cuando el servidor se inicia, muestra alguna información de registro y el texto Server is listening on :8065. Puedes detener el servidor pulsando CTRL+C en la ventana del terminal.

Una vez comprobado que el servidor no da ningún problema y que puede conectar a la base de datos (si no es asi vulve a comprobar que el nombre de la base de datos es correcto y que el usuario tiene acceso a ella y privilegios para usarla):

Configura Mattermost para que utilice systemd para el arranque y la parada.

Crea un archivo de unidad systemd:

sudo nano /lib/systemd/system/mattermost.service

Abre el archivo de la unidad como root en un editor de texto, y copia las siguientes líneas en el archivo:

[Unit]
Description=Mattermost
After=network.target
After=mysql.service
BindsTo=mysql.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=mysql.service

Haz que systemd cargue el nuevo servicio:

sudo systemctl daemon-reload

Comprueba que la unidad se ha cargado.

sudo systemctl status mattermost.service

Deberías ver una salida similar a la siguiente:

● mattermost.service - Mattermost
Loaded: loaded (/lib/systemd/system/mattermost.service; disabled; vendor preset: enabled)
Active: inactive (dead)

Inicia el servicio.

sudo systemctl start mattermost.service

Comprueba que Mattermost se está ejecutando.

http://tu_dominio:8065

Deberías ver el HTML que devuelve el servidor de Mattermost.

Configurar Mattermost para que se inicie al arrancar la máquina.

sudo systemctl enable mattermost.service

Ahora que el servidor de Mattermost está en funcionamiento, puede realizar algunas configuraciones y ajustes iniciales.

Paso 5: Configurar el servidor Mattermost

Crea el usuario System Admin y configura Mattermost para su uso general.

  1. Abre un navegador y navega hasta su instancia de Mattermost. Por ejemplo, si la dirección IP del servidor Mattermost es 10.10.10.2, seria http://10.10.10.2:8065.
  2. Crea el primer equipo y usuario. El primer usuario del sistema tiene el rol system_admin, que le da acceso a la consola del sistema.
  3. Para abrir la Consola del Sistema, selecciona el menú Producto en la esquina superior izquierda del panel de navegación, y luego selecciona Consola del Sistema.
  4. Establecer la URL del sitio:
  • Abre la Consola del Sistema > Entorno > Servidor Web.
  • En el campo URL del sitio, establezca la URL a la que los usuarios apuntan sus navegadores. Por ejemplo, https://mattermost.tu_dominio.com. Yo lo he instalado en una maquina virtual y por tanto tengo una IP local del Ubuntu que hay en mi VirtualBox.
  1. Configurar las notificaciones por correo electrónico.
  • En Configuración del sitio > Notificaciones haga los siguientes cambios:
    • Establezca Habilitar notificaciones por correo electrónico como verdadero
    • Establezca el nombre de visualización de la notificación como Sin respuesta
    • Establezca la dirección de origen de la notificación como {su nombre de dominio} Por ejemplo, tu_dominio.com
  • En la Consola del Sistema > Entorno > SMTP realice los siguientes cambios:
    • Establece el nombre de usuario del servidor SMTP en {SMTP-username} Por ejemplo, admin@tu_dominio.com
    • Establece la contraseña del servidor SMTP en {SMTP-password}
    • Establece el servidor SMTP en {SMTP-server} Por ejemplo, mail.example.com
    • Establece el puerto del servidor SMTP como 465
    • Establece la seguridad de la conexión en TLS o STARTTLS, dependiendo de lo que acepte el servidor SMTP
  • Selecciona Guardar
  • Selecciona la conexión de prueba.
  1. Abra la Consola del sistema > Entorno > Almacenamiento de archivos para configurar la ubicación de almacenamiento de archivos e imágenes.
  • Si almacenas los archivos localmente, establece Sistema de almacenamiento de archivos como Sistema de archivos local y, a continuación, acepta el valor predeterminado para el Directorio de almacenamiento local o introduce una ubicación. La ubicación debe ser un directorio que exista y tenga permisos de escritura para el servidor Mattermost. Puede ser una ruta absoluta o una ruta relativa. Las rutas relativas son relativas al directorio de Mattermost.
  • Si almacenas los archivos en Amazon S3, establece Sistema de almacenamiento de archivos en Amazon S3 e introduce los valores adecuados para tu cuenta de Amazon.

Nota

  • Los archivos e imágenes que los usuarios adjuntan a sus mensajes no se almacenan en la base de datos. En su lugar, se almacenan en una ubicación que se especifica, como el sistema de archivos local o en Amazon S3.
  • Asegúrate de que la ubicación tiene suficiente espacio libre. La cantidad de almacenamiento necesaria depende del número de usuarios y del número y tamaño de los archivos que los usuarios adjuntan a los mensajes.
  1. Selecciona Guardar para aplicar la configuración.
  2. Revisa y configura cualquier otro ajuste que pueda ser aplicable.
  3. Reiniciar Mattermost.
sudo systemctl restart mattermost

Paso 6: Configuración de TLS en el servidor Mattermost

Tienes dos opciones si quieres que los usuarios se conecten con HTTPS:

  1. Configure TLS en el servidor Mattermost.
  2. Instale un proxy como NGINX y configure TLS en el proxy.

La opción más fácil es configurar TLS en el servidor Mattermost, pero si esperas tener más de 200 usuarios, utiliza un proxy para mejorar el rendimiento. Un servidor proxy también proporciona registros de solicitudes HTTP estándar.

Nota: Tu servidor Mattermost debe ser accesible desde la CA de Let’s Encrypt para poder verificar tu nombre de dominio y emitir el certificado. Asegúrate de abrir tu cortafuegos y configurar cualquier proxy inverso para que reenvíe el tráfico a los puertos 80 y 443. Puedes encontrar más información en Let’s Encrypt.

Configurar TLS en el servidor Mattermost

  1. En Consola del Sistema > Entorno > Servidor Web (o Consola del Sistema > General > Configuración en versiones anteriores a la 5.12).
  1. Cambia la configuración de la dirección de escucha a :443.
  2. Cambia la configuración de la seguridad de la conexión a TLS.
  3. Cambia la configuración de Reenviar puerto 80 a 443 a true.
  1. Activar la capacidad CAP_NET_BIND_SERVICE para permitir que Mattermost se vincule a puertos bajos.
sudo setcap cap_net_bind_service=+ep /opt/mattermost/bin/mattermost
  1. Instala el certificado de seguridad. Puedes utilizar Let’s Encrypt para instalar y configurar automáticamente el certificado, o puedes especificar tu propio certificado.

Para utilizar un certificado Let’s Encrypt

El certificado se recupera la primera vez que un cliente intenta conectarse al servidor Mattermost. Los certificados se recuperan para cualquier nombre de host que un cliente intente alcanzar el servidor en.

  1. Cambia la configuración de Use Let’s Encrypt a true.
  2. Reinicia el servidor Mattermost para que estos cambios surtan efecto.

Para utilizar tu propio certificado

  1. Cambia la configuración de Use Let’s Encrypt a false.
  2. Cambia la configuración del Archivo de Certificado TLS a la ubicación del archivo de certificado.
  3. Cambia la configuración del archivo de claves TLS a la ubicación del archivo de claves privadas.
  4. Reinicia el servidor Mattermost para que estos cambios surtan efecto.

Uso de TLS en NGINX (como proxy)

Nota: No configures TLS en Mattermost antes de hacerlo para NGINX. Rompe la conexión ya que el TLS impide que se comunique con éxito con el servidor de Mattermost.

  • NGINX actuará como un proxy de reenvío para cifrar el tráfico entre el cliente y el servidor Mattermost. Después de instalar el certificado SSL, el tráfico entrante se gestionará a través de NGINX en el puerto 443 expuesto a Internet, como proxy hacia el servidor Mattermost que se ejecuta en el puerto 80.
  • (Opcional) Se permite el cifrado ascendente entre NGINX y el servidor Mattermost.

Paso 7: Instalación del servidor NGINX

En un entorno de producción, utiliza un servidor proxy para mayor seguridad y rendimiento de Mattermost.

Las principales ventajas de utilizar un proxy son las siguientes:

  • Terminación de SSL
  • Redirección de HTTP a HTTPS
  • Asignación de puertos :80 a :8065
  • Registros de solicitudes estándar

Introducción

NGINX es un servidor web muy popular y es responsable de alojar algunos de los sitios más grandes y de mayor tráfico de Internet. Es más respetuoso con los recursos que Apache en la mayoría de los casos, y puede utilizarse como servidor web o proxy inverso.

Para instalar NGINX en Ubuntu Server:

  • Inicia sesión en el servidor que alojará el proxy y abre una ventana de terminal.
  • Instale NGINX.

Dado que NGINX está disponible en los repositorios por defecto de Ubuntu, es posible instalarlo desde estos repositorios utilizando el sistema de paquetes apt. Primero, actualiza tu índice de paquetes apt local para acceder a los listados de paquetes más recientes. Luego, instala nginx:

sudo apt update
sudo apt install nginx

Después de aceptar el procedimiento, apt instalará NGINX y las dependencias necesarias en su servidor.

Después de instalarlo, ya tienes todo lo que necesitas. Puedes apuntar tu navegador a la dirección IP de tu servidor. Deberías ver la página de inicio de NGINX por defecto:

Si ves esta página, has instalado correctamente NGINX en tu servidor web. Esta página se incluye con NGINX para mostrarle que el servidor está funcionando correctamente.

Gestión del proceso NGINX

Ahora que tienes tu servidor web en funcionamiento, vamos a revisar algunos comandos básicos de gestión. Todos ellos se ejecutan en la interfaz de línea de comandos.

Para detener tu servidor web, utiliza:

sudo systemctl stop nginx

Para iniciar el servidor web cuando está parado, utiliza:

sudo systemctl start nginx

Para detener y volver a iniciar el servicio, utiliza:

sudo systemctl restart nginx

Si simplemente estás haciendo cambios de configuración, NGINX puede a menudo recargarse sin dejar caer las conexiones. Para ello, utiliza:

sudo systemctl reload nginx

Por defecto, NGINX está configurado para iniciarse automáticamente cuando el servidor arranca. Si esto no es lo que quieres, puedes desactivar este comportamiento usando:

sudo systemctl disable nginx

Para volver a habilitar el servicio para que se inicie en el arranque, utiliza:

sudo systemctl enable nginx

Qué hacer a continuación

  1. Asigna un nombre de dominio completo (FQDN) como mattermost.tu_dominio.com para que apunte al servidor NGINX.
  2. Configurar NGINX para que haga de proxy las conexiones de Internet al servidor Mattermost.

Paso 8: Configurar NGINX como proxy para el servidor Mattermost

NGINX se configura mediante un archivo en el directorio /etc/nginx/sites-available. Es necesario crear el archivo y luego habilitarlo. Al crear el archivo, necesita la dirección IP de su servidor Mattermost y el nombre de dominio completo (FQDN) de su sitio web Mattermost.

Para configurar NGINX como proxy

  1. Inicia sesión en el servidor que aloja NGINX y abre una ventana de terminal.
  2. Crea un archivo de configuración para Mattermost.
sudo nano /etc/nginx/sites-available/mattermost

Abre el archivo /etc/nginx/sites-available/mattermost como usuario root en un editor de texto y sustituye su contenido, si lo hay, por las siguientes líneas. Asegúrate de utilizar tus propios valores para la dirección IP del servidor Mattermost y el FQDN para server_name.

SSL y HTTP/2 con push de servidor están activados en el ejemplo de configuración proporcionado.

Nota:

  • Si vas a utilizar Let’s Encrypt para gestionar tu certificado SSL, detente aquí en el paso 3 y consulta la documentación del producto NGINX HTTP/2 & SSL para más detalles.
  • Necesitarás certificados SSL válidos para que NGINX pueda fijar los certificados correctamente. Además, tu navegador debe tener permisos para aceptar el certificado como un certificado válido firmado por la CA.
  • Ten en cuenta que la dirección IP incluida en los ejemplos de esta documentación puede no coincidir con tu configuración de red.
  • Si estás ejecutando NGINX en la misma máquina que Mattermost, y NGINX resuelve localhost a más de una dirección IP (IPv4 o IPv6), recomendamos utilizar 127.0.0.1 en lugar de localhost.
upstream backend {
   server 10.10.10.2:8065;
   keepalive 32;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

server {
  listen 80 default_server;
  server_name   mattermost.tu_dominio.com;
  return 301 https://$server_name$request_uri;
}

server {
   listen 443 ssl http2;
   server_name    mattermost.tu_dominio.com;

   http2_push_preload on; # Enable HTTP/2 Server Push

   ssl on;
   ssl_certificate /etc/letsencrypt/live/{tu_dominio}/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/{tu_dominio}/privkey.pem;
   ssl_session_timeout 1d;

   # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
   ssl_protocols TLSv1.2 TLSv1.3;

   # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
   # prevent replay attacks.
   #
   # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
   ssl_early_data on;

   ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
   ssl_prefer_server_ciphers on;
   ssl_session_cache shared:SSL:50m;
   # HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
   add_header Strict-Transport-Security max-age=15768000;
   # OCSP Stapling ---
   # fetch OCSP records from URL in ssl_certificate and cache them
   ssl_stapling on;
   ssl_stapling_verify on;

   add_header X-Early-Data $tls1_3_early_data;

   location ~ /api/v[0-9]+/(users/)?websocket$ {
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       client_max_body_size 50M;
       proxy_set_header Host $http_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;
       proxy_buffer_size 16k;
       client_body_timeout 60;
       send_timeout 300;
       lingering_timeout 5;
       proxy_connect_timeout 90;
       proxy_send_timeout 300;
       proxy_read_timeout 90s;
       proxy_http_version 1.1;
       proxy_pass http://backend;
   }

   location / {
       client_max_body_size 50M;
       proxy_set_header Connection "";
       proxy_set_header Host $http_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;
       proxy_buffer_size 16k;
       proxy_read_timeout 600s;
       proxy_cache mattermost_cache;
       proxy_cache_revalidate on;
       proxy_cache_min_uses 2;
       proxy_cache_use_stale timeout;
       proxy_cache_lock on;
       proxy_http_version 1.1;
       proxy_pass http://backend;
   }
}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

Eliminar el archivo existente de sitios habilitados por defecto.

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

Habilitar la configuración del mattermost.

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

Reinicia NGINX.

sudo systemctl restart nginx

Comprueba que puedes ver Mattermost a través del proxy.

curl https://localhost

Si todo funciona, verás el HTML de la página de registro de Mattermost.

Restringir el acceso al puerto 8065.

Por defecto, el servidor Mattermost acepta conexiones en el puerto 8065 desde cualquier máquina de la red. Utiliza tu cortafuegos para denegar las conexiones en el puerto 8065 a todas las máquinas, excepto la máquina que aloja NGINX y la máquina que utilizas para administrar el servidor Mattermost. Si está instalando en Amazon Web Services, puede utilizar grupos de seguridad para restringir el acceso.

Ahora que NGINX está instalado y en funcionamiento, puedes configurarlo para que utilice SSL, lo que te permite utilizar conexiones HTTPS y el protocolo HTTP/2.

Preguntas frecuentes sobre la configuración de NGINX

¿Por qué las conexiones Websocket devuelven un error 403?

Esto se debe probablemente a un fallo en la comprobación de origen cruzado. Se aplica una comprobación para el código WebSocket para ver si la cabecera Origen es la misma que la cabecera Host. Si no lo es, se devuelve un error 403. Abra el archivo /etc/nginx/sites-available/mattermost como root en un editor de texto y asegúrese de que la cabecera de host que se establece en el proxy es dinámica:

location ~ /api/v[0-9]+/(users/)?websocket$ {
  proxy_pass            http://backend;
  (...)
  proxy_set_header      Host $host;
  proxy_set_header      X-Forwarded-For $remote_addr;
}

A continuación, en config.json establece el ajuste AllowCorsFrom para que coincida con el dominio que utilizan los clientes. Es posible que tengas que añadir variaciones del nombre del host que los clientes pueden enviar. Su registro de NGINX será útil para diagnosticar el problema.

"EnableUserAccessTokens": false,
"AllowCorsFrom": "domain.com domain.com:443 im.domain.com",
"SessionLengthWebInDays": 30,

Configuración de NGINX con SSL y HTTP/2

NGINX se configura mediante un archivo en el directorio /etc/nginx/sites-available. Es necesario crear el archivo y luego habilitarlo. Al crear el archivo, necesita la dirección IP de tu servidor Mattermost y el nombre de dominio completo (FQDN) de tu sitio web Mattermost.

El uso de SSL proporciona una mayor seguridad al garantizar que las comunicaciones entre los clientes de Mattermost y el servidor de Mattermost están encriptadas. También permite configurar NGINX para que utilice el protocolo HTTP/2.

Aunque se puede configurar HTTP/2 sin SSL, los navegadores Firefox y Chrome sólo admiten HTTP/2 en conexiones seguras.

Puedes utilizar cualquier certificado que desees, pero estas instrucciones te muestran cómo descargar e instalar certificados de Let’s Encrypt, una autoridad certificadora gratuita.

Nota: Si Let’s Encrypt está habilitado, reenvía el puerto 80 a través de un firewall, con el ajuste Forward80To443 config.json establecido en true para completar la certificación Let’s Encrypt.

Para configurar NGINX como proxy con SSL y HTTP/2

  • Inicia sesión en el servidor que aloja NGINX y abre una ventana de terminal.
  • Abre el archivo nginx.conf de Mattermost como root en un editor de texto, luego actualiza la dirección {ip} en el backend upstream para que apunte hacia Mattermost (como 127.0.0.1:8065), y actualiza el server_name para que sea tu dominio para Mattermost.

Nota:

  • En Ubuntu este archivo se encuentra en /etc/nginx/sites-available/. Si no tienes este archivo, ejecuta sudo touch /etc/nginx/sites-available/mattermost.
  • Ten en cuenta que la dirección IP incluida en los ejemplos de esta documentación puede no coincidir con tu configuración de red.
  • Si estás ejecutando NGINX en la misma máquina que Mattermost, y NGINX resuelve localhost a más de una dirección IP (IPv4 o IPv6), recomendamos utilizar 127.0.0.1 en lugar de localhost.
upstream backend {
    server {ip}:8065;
    keepalive 32;
    }

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

server {
    listen 80 default_server;
    server_name mattermost.tu_dominio.com;

    location ~ /api/v[0-9]+/(users/)?websocket$ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        client_max_body_size 50M;
        proxy_set_header Host $http_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;
        proxy_buffer_size 16k;
        client_body_timeout 60;
        send_timeout 300;
        lingering_timeout 5;
        proxy_connect_timeout 90;
        proxy_send_timeout 300;
        proxy_read_timeout 90s;
        proxy_pass http://backend;
    }

    location / {
        client_max_body_size 50M;
        proxy_set_header Connection "";
        proxy_set_header Host $http_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;
        proxy_buffer_size 16k;
        proxy_read_timeout 600s;
        proxy_cache mattermost_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 2;
        proxy_cache_use_stale timeout;
        proxy_cache_lock on;
        proxy_http_version 1.1;
        proxy_pass http://backend;
    }
}

Elimina el archivo existente de sitios habilitados por defecto.

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

Activa la configuración de Mattermost.

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

Ejecuta

sudo nginx -t

para asegurarte de que tu configuración está hecha correctamente. Si obtienes un error, mira en la configuración de NGINX y haz los cambios necesarios en el archivo bajo /etc/nginx/sites-available/mattermost.

Reinicia NGINX.

sudo systemctl start nginx

Comprueba que puedes ver Mattermost a través del proxy.

curl http://localhost

Si todo funciona, verás el HTML de la página de registro de Mattermost. Verás un certificado inválido cuando accedas a través de la IP o localhost. Utilice el dominio FQDN completo para verificar si el certificado SSL se ha fijado correctamente y es válido.

Instalar y actualizar Snap.

sudo snap install core; sudo snap refresh core

Instala el paquete Certbot.

sudo snap install --classic certbot

Añade un enlace simbólico para asegurar que Certbot pueda ejecutarse.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Ejecuta el instalador de Let’s Encrypt para asegurarte de que tu DNS está configurado correctamente.

sudo certbot certonly --dry-run

Esto te pedirá que introduzcas tu correo electrónico, aceptes los TOS, compartas tu correo electrónico y selecciones el dominio para el que estás activando certbot. Esto validará que tus DNS apuntan a este servidor correctamente y podrás generar un certificado con éxito. Si esto finaliza con éxito, proceda al paso 12.

Ejecuta el instalador de Let’s Encrypt.

sudo certbot

Esto ejecutará certbot y editará automáticamente su archivo de configuración de NGINX para el(los) sitio(s) seleccionado(s).

Asegúrate de que tu SSL está configurado correctamente ejecutando:

curl https://tu_dominio.com

Por último, te sugerimos que vuelvas a editar tu archivo de configuración para aumentar la configuración de seguridad SSL por encima de la predeterminada de Let’s Encrypt. Este es el mismo archivo del paso 2 anterior. Edítalo para que se vea como el siguiente:

upstream backend {
    server {ip}:8065;
   keepalive 32;
    }

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

server {
    server_name mattermost.tu_dominio.com;

    location ~ /api/v[0-9]+/(users/)?websocket$ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        client_max_body_size 50M;
        proxy_set_header Host $http_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;
        proxy_buffer_size 16k;
        client_body_timeout 60;
        send_timeout 300;
        lingering_timeout 5;
        proxy_connect_timeout 90;
        proxy_send_timeout 300;
        proxy_read_timeout 90s;
        proxy_http_version 1.1;
        proxy_pass http://backend;
    }

    location / {
        client_max_body_size 50M;
        proxy_set_header Connection "";
        proxy_set_header Host $http_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;
        proxy_buffer_size 16k;
        proxy_read_timeout 600s;
        proxy_cache mattermost_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 2;
        proxy_cache_use_stale timeout;
        proxy_cache_lock on;
        proxy_http_version 1.1;
        proxy_pass http://backend;
    }

    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mattermost.tu_dominio.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mattermost.tu_dominio.com/privkey.pem; # managed by Certbot
    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    ssl_session_timeout 1d;

    # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
    ssl_protocols TLSv1.2 TLSv1.3;

    # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
    # prevent replay attacks.
    #
    # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
    ssl_early_data on;

    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;
    # HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
    add_header Strict-Transport-Security max-age=15768000;
    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;
}


server {
    if ($host = mattermost.tu_dominio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    server_name mattermost.tu_dominio.com;
    return 404; # managed by Certbot

}

Comprueba que tu certificado SSL está configurado correctamente.

Espero que disfrutes de esta plataforma de código abierto con la que puedes montar las comunicaciones y la organización del trabajo colaborativo de tu empresa o tu proyecto.

¡Que tengas un Ingenioso día!

¡que tengas un ingenioso día!

Contrata tu plan Ingenios@ de Sistemas por 5€ al mes y responderé a todas tus preguntas sobre tecnología en el menor tiempo posible. Pasa a formar parte de la comunidad Ingenios@s de Sistemas y disfruta de contenido exclusivo y aprende sobre sistemas Open Source, Blockchain, SmarContract, Web3, Inteligencia Artificial y Reaidad Virtual, súbete al tren de la Revolución 4.0

Si quieres estar al día y no perderte nada Suscribete al Podcast Ingenios@s de Sistemas, un episodio diario que te mantendrá informado y formado en esta vertiginosa carrera.

Deja un comentario

Share to...