Cómo instalar el editor web colaborativo Etherpad en Rocky Linux 8

Etherpad es un editor online de código abierto que proporciona edición colaborativa en tiempo real en el navegador. Está escrito en Node.js y puede autoalojarse para trabajar con varias plataformas como WordPress, Drupal, Odoo, Discourse, Joomla, etc.

En este tutorial, instalaremos Etherpad en un servidor Rocky Linux 8, utilizando la base de datos MariaDB para almacenar nuestros datos. También utilizaremos Nginx como proxy inverso para la aplicación e instalaremos un certificado SSL utilizando Let’s Encrypt para permitir las conexiones HTTPS a nuestra instancia de Etherpad.

Requisitos previos

  1. Un sistema que ejecute Rocky Linux 8.

  2. Un usuario no root con privilegios sudo.

  3. Un nombre de dominio que apunte al servidor.

  4. Nodejs instalado. Sigue nuestra guía para instalar N odejs en el servidor Rocky Linux 8. Utiliza cualquiera de los dos métodos indicados.

  5. Asegúrate de que todo está actualizado.

    $ sudo dnf update
    

Paso 1 – Configurar el Firewall

Rocky Linux utiliza el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

Esto indica que está funcionando correctamente.

El cortafuegos funciona con diferentes zonas y la zona pública es la que viene por defecto, que es la que utilizaremos. Enumera todos los servicios y puertos activos en el cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Debería mostrar la siguiente salida.

cockpit dhcpv6-client ssh

Permite los puertos HTTP y HTTPS.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Abre el puerto 9001 utilizado por la aplicación Etherpad.

$ sudo firewall-cmd --permanent --add-port=9001/tcp

Vuelve a comprobar el estado del cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Deberías ver una salida similar.

cockpit dhcpv6-client http https ssh

Vuelve a cargar el cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Paso 2 – Instalar Git

Antes de instalar Etherpad, necesitamos instalar Git. Ejecuta el siguiente comando para instalar Git.

$ sudo dnf install git

Verifica la instalación.

$ git --version
git version 2.27.0

Añade la configuración inicial.

$ git config --global user.name "YourName"
$ git config --global user.email "[email protected]"

Lista la configuración que acabas de establecer.

$ git config --list
user.name=YourName
[email protected]

Paso 3 – Instalar MariaDB

Como vamos a utilizar la base de datos MariaDB para almacenar los datos de Etherpad, primero tenemos que instalarla y configurarla.

El repositorio AppStream de Rocky Linux viene con MariaDB. Para listar todas las versiones disponibles de MariaDB instaladas, ejecuta el siguiente comando.

$ sudo dnf module list mariadb
Last metadata expiration check: 1:15:26 ago on Thu 21 Oct 2021 10:20:01 AM UTC.
Rocky Linux 8 - AppStream
Name                          Stream                         Profiles                                         Summary
mariadb                       10.3 [d]                       client, galera, server [d]                       MariaDB Module
mariadb                       10.5                           client, galera, server [d]                       MariaDB Module

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

La versión por defecto es la 10.3. Sin embargo, puedes instalar la última versión con el siguiente comando.

$ sudo dnf module enable mariadb:10.5

Instala MariaDB.

$ sudo dnf install mariadb-server

Habilita e inicia el servicio MariaDB.

$ sudo systemctl enable mariadb --now

Comprueba el estado del servicio.

$ sudo systemctl status mariadb

Asegura el servidor MariaDB.

$ sudo mysql_secure_installation

Te encontrarás con varias indicaciones. Responde a ellas como se indica a continuación.

Enter current password for root (enter for none): Press Enter
Switch to unix_socket authentication [Y/n] Type y
Change the root password? [Y/n] Type n
Remove anonymous users? [Y/n] Type y
Disallow root login remotely? [Y/n] Type y
Remove test database and access to it? [Y/n] Type y
Reload privilege tables now? [Y/n] Type y

Ahora puedes conectarte al servidor MariaDB con el siguiente comando.

$ sudo mysql 

Paso 4 – Configurar MariaDB

Accede al shell de MariaDB.

$ sudo mysql

Crea una nueva base de datos para Etherpad.

$ create database `etherpad_lite_db`;

Crea un nuevo usuario de base de datos.

$ CREATE USER 'etherpaduser'@'localhost' identified by 'password';

Utiliza una contraseña fuerte.

Concede permisos en la base de datos al usuario.

$ grant CREATE,ALTER,SELECT,INSERT,UPDATE,DELETE on `etherpad_lite_db`.* to '<etherpaduser>'@'localhost';

Sal del intérprete de comandos de MySQL.

$ exit

Paso 5 – Descargar e instalar Etherpad

Para instalar Etherpad, descargaremos su código fuente y lo construiremos.

El primer paso es crear un nuevo usuario etherpad utilizando el siguiente comando.

$ sudo adduser --system --home /opt/etherpad --create-home --user-group etherpad

Este comando crea un usuario --system, lo que significa que no puede iniciar sesión y no tiene contraseña. También le damos un directorio raíz /opt/etherpad que es donde descargaremos Etherpad. La bandera --create-home crea el directorio raíz con los permisos correctos. La bandera --user-group crea un grupo con el mismo nombre que el nombre de usuario.

Cambia al usuario etherpad para descargar e instalar la aplicación.

$ sudo -u etherpad bash

Cambia al directorio /opt/etherpad.

[etherpad@etherpad user] cd /opt/etherpad

Clona el repositorio de Etherpad en el directorio /opt/etherpad.

[etherpad@etherpad ~]$ git clone --branch master git://github.com/ether/etherpad-lite.git

Cambia al directorio recién descargado.

[etherpad@etherpad ~]$ cd etherpad-lite

Ejecuta el script run.sh de Etherpad para configurar e instalar las dependencias.

[etherpad@etherpad etherpad-lite]$ src/bin/run.sh

Puedes lanzar la URL http://YOURSERVERIP:9001 en el navegador para lanzar Etherpad. Obtendrás la siguiente pantalla.

Inicio de Etherpad

Hay un problema con la instalación anterior. Requiere que mantengas el shell actual abierto con Node ejecutándose en primer plano. Para que sea una instalación persistente, tenemos que ejecutar Etherpad como un servicio. Pulsa Ctrl + C en tu terminal para detener la ejecución de Etherpad.

Paso 6 – Configurar Etherpad

Antes de seguir adelante, tenemos que establecer algunos ajustes y configurar nuestra instalación según nuestras necesidades. Etherpad almacena sus ajustes en el archivo settings.json en el directorio de instalación.

Abre el archivo para editarlo.

[etherpad@etherpad etherpad-lite]$ nano settings.json

El archivo de configuración está formateado como JSON. Lo primero que debes configurar es la configuración de la base de datos.

Busca el siguiente código y coméntalo poniendo // delante.

//  "dbType": "dirty",
//  "dbSettings": {
//    "filename": "var/dirty.db"
//  },

A continuación, busca el siguiente código y cambia sus valores de la siguiente manera. Asegúrate de eliminar /* y */ al principio y al final.

  "dbType" : "mysql",
  "dbSettings" : {
    "user":     "etherpaduser",
    "host":     "localhost",
    "port":     3306,
    "password": "password",
    "database": "etherpad_lite_db",
    "charset":  "utf8mb4"
  },

Por último, desplázate un poco hacia abajo para encontrar el ajuste trustProxy y cambia su valor de false a true.

  "trustProxy": true,

Este ajuste es necesario para que Etherpad funcione junto con Nginx.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida una vez hayas terminado.

Sal del shell de usuario de Etherpad.

[etherpad@etherpad etherpad-lite]$ exit

Paso 7 – Crear el servicio Etherpad

Para iniciar Etherpad en el arranque y gestionar el proceso mediante systemctl, necesitamos crear un archivo de servicio.

Crea y abre el archivo de servicio.

$ sudo nano /etc/systemd/system/etherpad.service

Pega el siguiente código en él.

[Unit]
Description=Etherpad, a collaborative web editor.
After=syslog.target network.target

[Service]
Type=simple
User=etherpad
Group=etherpad
WorkingDirectory=/opt/etherpad
Environment=NODE_ENV=production
ExecStart=/usr/bin/node --experimental-worker /opt/etherpad/etherpad-lite/node_modules/ep_etherpad-lite/node/server.js
Restart=always

[Install]
WantedBy=multi-user.target

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida una vez terminado.

Vuelve a cargar el demonio de servicio para introducir la nueva configuración.

$ sudo systemctl daemon-reload

Activa el inicio del servicio Etherpad.

$ sudo systemctl enable etherpad --now

Comprueba el estado del servicio.

$ sudo systemctl status etherpad
? etherpad.service - Etherpad, a collaborative web editor.
   Loaded: loaded (/etc/systemd/system/etherpad.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-10-21 15:06:53 UTC; 6s ago
 Main PID: 47228 (node)
    Tasks: 13 (limit: 11411)
   Memory: 102.8M
   CGroup: /system.slice/etherpad.service
           ??47228 /usr/bin/node --experimental-worker /opt/etherpad/etherpad-lite/node_modules/ep_etherpad-lite/node/server.js
.......

Paso 8 – Instalar SSL con Let’s Encrypt

Para instalar un certificado SSL usando Let’s Encrypt, necesitamos instalar la herramienta Certbot.

En primer lugar, tienes que descargar e instalar el repositorio EPEL.

$ sudo dnf install epel-release

Ejecuta los siguientes comandos para instalar Certbot.

$ sudo dnf install certbot

Generar el certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --preferred-challenges http -m [email protected] -d example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/etherpad.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crea un directorio webroot de desafío para la renovación automática de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crea un Cron Job para renovar el SSL. Se ejecutará cada día para comprobar el certificado y renovarlo si es necesario. Para ello, primero crea el archivo /etc/cron.daily/certbot-renew y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/certbot-renew

Pega el siguiente código.

#!/bin/sh
certbot renew --cert-name etherpad.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Cambia los permisos del archivo de la tarea para que sea ejecutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Paso 9 – Instalar y configurar Nginx

Rocky Linux viene con una versión antigua de Nginx. Para instalar la última versión, tienes que añadir el repositorio de Nginx.

Crea y abre el archivo /etc/yum.repos.d/nginx.repo para editarlo.

$ sudo nano /etc/yum.repos.d/nginx.repo

Pega en él el siguiente código.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida una vez terminado.

Instala Nginx.

$ sudo dnf install nginx

Activa el servicio Nginx.

$ sudo systemctl enable nginx

A continuación, crea y abre el archivo /etc/nginx/conf.d/etherpad.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/etherpad.conf

Pega en él el siguiente código.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  etherpad.example.com;

    access_log  /var/log/nginx/etherpad.access.log;
    error_log   /var/log/nginx/etherpad.error.log;
    
    ssl_certificate      /etc/letsencrypt/live/etherpad.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/etherpad.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/etherpad.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        rewrite  ^/$ / break;
        rewrite  ^/locales/(.*) /locales/$1 break;
        rewrite  ^/locales.json /locales.json break;
        rewrite  ^/admin(.*) /admin/$1 break;
        rewrite  ^/p/(.*) /p/$1 break;
        rewrite  ^/static/(.*) /static/$1 break;
        rewrite  ^/pluginfw/(.*) /pluginfw/$1 break;
        rewrite  ^/javascripts/(.*) /javascripts/$1 break;
        rewrite  ^/socket.io/(.*) /socket.io/$1 break;
        rewrite  ^/ep/(.*) /ep/$1 break;
        rewrite  ^/minified/(.*) /minified/$1 break;
        rewrite  ^/api/(.*) /api/$1 break;
        rewrite  ^/ro/(.*) /ro/$1 break;
        rewrite  ^/error/(.*) /error/$1 break;
        rewrite  ^/jserror(.*) /jserror$1 break;
        rewrite  ^/redirect(.*) /redirect$1 break;
        rewrite  /favicon.ico /favicon.ico break;
        rewrite  /robots.txt /robots.txt break;
        rewrite  /(.*) /p/$1;
        
        proxy_pass         http://127.0.0.1:9001;
        proxy_buffering    off;
        proxy_set_header   Host $host;
        proxy_pass_header  Server;

        # proxy headers
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $remote_addr;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_http_version  1.1;

        # websocket proxying
        proxy_set_header  Upgrade $http_upgrade;
        proxy_set_header  Connection $connection_upgrade;
    }
}

# we're in the http context here
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  etherpad.example.com;
    return 301   https://$host$request_uri;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida una vez que hayas terminado.

Comprueba la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si obtienes el siguiente error, tendrás que editar el archivo /etc/nginx/nginx.conf para añadir/ajustar el tamaño de la variable server_names_hash_bucket_size.

nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Vuelve a validar Nginx.

Por último, inicia el servicio Nginx para habilitar la nueva configuración.

$ sudo systemctl start nginx

Inicia la URL https://etherpad.example.com en tu navegador y se abrirá la página de inicio de Etherpad. Ahora puedes utilizarla para editar documentos e invitar a colaboradores.

Actualizar Etherpad

Actualizar Etherpad es fácil. El primer paso es cambiar al shell de usuario de Etherpad.

$ sudo -u etherpad bash

Cambia al directorio /opt/etherpad/etherpad-lite.

[etherpad@etherpad user] cd /opt/etherpad/etherpad-lite

Saca el último repositorio de Etherpad en el directorio /opt/etherpad/etherpad-lite.

[etherpad@etherpad ~]$ git pull origin

Ejecuta el script run.sh de Etherpad para configurar la última versión de Etherpad.

[etherpad@etherpad etherpad-lite]$ src/bin/run.sh

Conclusión

En este tutorial, hemos configurado el Editor Colaborativo Etherpad con el servidor Nginx y lo hemos asegurado con los certificados SSL de Let's Encrypt. Tu instalación de Etherpad está lista para ser utilizada y puedes ampliarla con más funciones, como usuarios autentificados, plugins y personalizaciones de la interfaz de usuario.

Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...