Instalando RocketChat en Ubuntu 20.04 ¡sin snap! Nginx + SSL Autofirmado

Hola colegas, hoy vamos a ver como instalar el sistema de Chat RocketChat en nuestra red sobre Ubuntu 20.04, usaremos además Nginx como proxy inverso y certificado SSL autofirmado para encriptar el tráfico. Todo el proceso será en modo manual paso a paso, es decir, vamos a prescindir de snap, el motivo principal de privarnos de snap es que se ha bloqueado su uso para Cuba, lo que quiere decir que desde nuestra ubicación no podemos hacer uso del mismo, entonces no tenemos otra opción que instalar RocketChat de forma complicada. Pero como siempre en Networld lo tratamos de hacer fácil.

Como detalle a lo anterior decirles, que usaremos MongoDB, el cual también está bloqueado para Cuba, pero afortunadamente contamos con más de un mirror en Cuba el cual vamos a usar. Aún así para los colegas de otros países les dejo el repositorio original.

//Información necesaria:

  • Necesitas un servidor DNS funcionando que apunte la url rocket.networld.cu hacia la ip del servidor donde estará corriendo Nginx, en nuestro caso 10.10.20.4. Por supuesto tanto la url como la ip se modifica a su necesidad como ya saben.
  • Necesitas un servidor Ubuntu 20.04 funcionando, el procedimiento de instalación no se muestra.
  • Dirección IP del servidor: 10.10.20.4 (en el mismo vamos a correr tanto Nginx como RocketChat) en la práctica pueden estar perfectamente separados.
  • Dominio: rocket.networld.cu

//Nuestro primer paso, actualizar nuestro servidor Ubuntu:

# sudo apt update
# sudo apt upgrade

//Desactivamos el firewall para evitar problemas de conexión, si eres usuario avanzado configuralo para habilitar los puertos usados por Nginx, MongoDB y RocketChat.

# sudo systemctl stop ufw
# sudo ufw disable

//Lo siguiente es añadir la llave GPG de MongoDB:

# wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

//Vamos a añadir los repositorios de MongoDB, como les comentaba al principio, dichos repos están bloqueados para Cuba, así que usaremos un mirror nacional. La primera línea es para los Cubanos y la segunda para el resto de colegas.

//Si estas en Cuba:
# echo \"deb [ arch=amd64,arm64 ] http://descargas.jovenclub.cu/repos/mongodb/apt/ubuntu focal/mongodb-org/4.4 multiverse\" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

//Si estas en cualquier otro país:
# echo \"deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse\" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

//Los siguiente es actualizar la lista de repos, configurar Node y instalar curl:

# sudo apt update && sudo apt-get install -y curl && curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -

//Vamos a instalar MongoDB y el resto de requerimientos:

# sudo apt install -y build-essential mongodb-org nodejs graphicsmagick

//Comprobamos la versión de Node instalada:

# node --version

//Vamos a instalar inherits y n:

# sudo npm install -g inherits n

//Creamos link simbólico para Node:

# sudo ln -s /usr/bin/node /usr/local/bin/node

//Lo siguiente es descargar el RocketChat, pesa alrededor de 160 Mb:

# curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz

//Descomprimimos el RocketChat en el directorio tmp:

# tar -xzf /tmp/rocket.chat.tgz -C /tmp

//Es momento de instalar el RocketChat:

# cd /tmp/bundle/programs/server && npm install

//Movemos el directorio:

# cd
# sudo mv /tmp/bundle /opt/Rocket.Chat

//Agregamos el usuario de RocketChat al sistema y asignamos permisos:

# sudo useradd -M rocketchat && sudo usermod -L rocketchat
# sudo chown -R rocketchat:rocketchat /opt/Rocket.Chat

//Vamos a crear el archivo de arranque o servicio de RocketChat, pegar el siguiente código completo o por línea en la terminal:

cat << EOF |sudo tee -a /etc/systemd/system/rocketchat.service
[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.service mongod.service
[Service]
ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=http://localhost:3000/ PORT=3000
[Install]
WantedBy=multi-user.target
EOF

//Configurar MongoDB y lo iniciamos:

# sudo sed -i \"s/^#replication:/replication:\\n  replSetName: rs01/\" /etc/mongod.conf

# sudo systemctl daemon-reload
# sudo systemctl enable mongod && sudo systemctl restart mongod

//Comprobar el estado de MongoDB:

# systemctl status mongod

//Comprovamos:

# mongo --eval \"printjson(rs.initiate())\"

//Habilitar RocketChat e iniciarlo:

# sudo systemctl enable rocketchat && sudo systemctl start rocketchat

//Comprobando el estado de RocketChat:

# systemctl status rocketchat

Hasta aquí hemos podido instalar RocketChat, y si no vas a usar Nginx como proxy inverso, pues ya puedes acceder mediante la ip y el puerto, http://10.10.20.4:3000.

Pero vamos a mostrar como instalar y configurar Nginx para poder acceder de una forma más amigable entre otras opciones.

//Comenzamos por instalar Nginx:

# sudo apt install nginx

//Una vez instalado Nginx, procedemos a configurar el virtualhost para el RocketChat:

# sudo nano /etc/nginx/conf.d/rocketchat.conf

//Dentro vamos a colocar las siguientes líneas:

upstream rocket_backend {
  server 127.0.0.1:3000;
}

server {
    listen 80;
    server_name rocket.networld.cu;
    access_log /var/log/nginx/rocketchat-access.log;
    error_log /var/log/nginx/rocketchat-error.log;

    location / {
        proxy_pass http://rocket_backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection \"upgrade\";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}

//Comprobamos la configuración del virtualhost, reiniciamos y activamos Nginx:

# sudo nginx  -t
# sudo systemctl restart nginx
# sudo systemctl enable nginx

Ya tenemos nuestro proxy inverso listo para poder acceder a RocketChat mediante http://rocket.networld.cu

Pero iremos un paso más lejos y ahora configuraremos Nginx para acceder a RocketChat mediante https y para eso vamos a implementar un certificado SSL autofirmado en el caso de hoy. El motivo por el cual uso un certificado autofirmado, es porque la mayoría de ustedes no cuentan con un dominio real en internet así que es imposible obtener un certificado válido.

//Lo primero es generar nuestra llave y certificado:

# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-rocket.key -out /etc/ssl/certs/nginx-rocket.crt

//Llenar los datos que les pide.

Country Name (2 letter code) [AU]:CU
State or Province Name (full name) [Some-State]:Mayabeque
Locality Name (eg, city) []:Santa Cruz del Norte
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NETWORLD
Organizational Unit Name (eg, section) []:Redes y Internet
Common Name (e.g. server FQDN or YOUR name) []:rocket.networld.cu
Email Address []:admin@networld.cu

//Prestar atención a los datos y modificarlos a su conveniencia.

//Generamos el archivo pem para el ejemplo con un tamaño de 2048 más que suficiente:

# sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

//Vamos a crear un archivo dedicado a RocketChat para guardar las ubicaciones de los archivos de llave:

# sudo nano /etc/nginx/snippets/rocket.conf

//El contenido será:

ssl_certificate /etc/ssl/certs/nginx-rocket.crt;
ssl_certificate_key /etc/ssl/private/nginx-rocket.key;

//Vamos a configurar los parámetros SSL para Nginx:

# sudo nano /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection \"1; mode=block\";

//Nos queda editar una vez más el archivo de virtualhost del RocketChat esta vez para que use SSL y escuche en el puerto 443:

# sudo nano /etc/nginx/conf.d/rocketchat.conf
upstream rocket_backend {
  server 127.0.0.1:3000;
}
server {
    listen 80;
    server_name rocket.networld.cu;
    return 301 https://$server_name$request_uri;
    access_log /var/log/nginx/rocketchat-access.log;
    error_log /var/log/nginx/rocketchat-error.log;

    location / {
        proxy_pass https://rocket_backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection \"upgrade\";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
    listen 443 ssl;
    include snippets/rocket.conf;
    include snippets/ssl-params.conf;

}

//Las líneas en negrita son las que debemos agregar.

//Comprobamos que todo este correcto en Nginx y reiniciamos el servicio:

# sudo nginx -t
# sudo systemctl restart nginx

//Estamos listos para acceder al asistente de configuración de RocketChat mediante: https://rocket.networld.cu, al tratarse de un certificado autofirmado por supuesto nos saldrá la advertencia de seguridad, añadimos la exepción y continuamos.

Eso es todo, ya tenemos nuestro sistema de Chat funcionando en nuestra red, pueden usar el navegador o la aplicación oficial para escritorio.

Para dudas y consultas utilice nuestro grupo en Telegram o la Comunidad.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio