Cómo instalar Wiki.js en Ubuntu 22.04 LTS

Wiki.js es un software wiki ligero de código abierto. Está basado en el framework JavaScript Node.js. Puede utilizarse para escribir documentación, wiki y contenido web utilizando un editor Markdown para desarrolladores y un editor WYSIWYG para personas sin conocimientos técnicos. Admite múltiples tipos de contenido, incluidos diagramas UML, expresiones matemáticas utilizando sintaxis Tex o MathML, y código. Incluye múltiples módulos para diversas funciones, como análisis, autenticación, registro, motores de búsqueda de terceros y múltiples servicios de almacenamiento con los que sincronizar tu contenido.

En este tutorial, aprenderás a instalar Wiki.js en un servidor Ubuntu 22.04 utilizando la base de datos PostgreSQL y el servidor Nginx para el proxy.

Requisitos previos

  • Un servidor con Ubuntu 22.04.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) que apunte a tu servidor. Para nuestros propósitos, utilizaremos wiki.example.com como nombre de dominio.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
    $ sudo apt install wget curl ca-certificates gnupg gnupg2 nano unzip lsb-release ubuntu-keyring -y
    

Paso 1 – Configurar el cortafuegos

Antes de instalar ningún paquete, el primer paso es configurar el cortafuegos para que permita conexiones HTTP y HTTPS.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Permitir puertos HTTP y HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala PostgreSQL y las utilidades

Ubuntu 22.04 viene con una versión antigua de PostgreSQL. Instalaremos Postgres 14 para nuestro tutorial.

Instala el repositorio de PostgreSQL.

$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Importa la clave GPG de PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala el servidor PostgreSQL 14.

$ sudo apt install -y postgresql-14

Comprueba el estado del servicio.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-10-25 06:24:24 UTC; 10min ago
   Main PID: 4032 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Oct 25 06:24:24 wiki systemd[1]: Starting PostgreSQL RDBMS...
Oct 25 06:24:24 wiki systemd[1]: Finished PostgreSQL RDBMS.

Paso 3 – Configurar PostgreSQL

Accede al shell de PostgreSQL.

$ sudo -i -u postgres psql

Crea una nueva base de datos para Wiki.js.

postgres=# CREATE DATABASE wikidb;

Crea un nuevo usuario de base de datos con una contraseña segura.

postgres=# CREATE USER wikiuser WITH ENCRYPTED PASSWORD 'wikipassword';

Concede los derechos al usuario para utilizar la base de datos.

postgres=# GRANT ALL PRIVILEGES ON DATABASE wikidb TO wikiuser;

Sal del shell Postgres.

postgres=# \q

Paso 4 – Instalar Node.js

Wiki.js soporta Node v16 en el momento de escribir este tutorial.

Instala el repositorio de Node utilizando el siguiente comando.

$ curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -

Instala Node.

$ sudo apt install nodejs -y

Verifica la instalación de Node.

$ node --version
v16.18.0

Paso 5 – Descarga Wiki.js

Crea una carpeta para instalar Wiki.js.

$ sudo mkdir -p /var/www/wikijs

Establece al usuario actualmente conectado como propietario de la carpeta.

$ sudo chown $USER:$USER /var/www/wikijs

Cambia al directorio y descarga el archivo de código Wiki.js.

$ cd /var/www/wikijs && wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz

Extrae el archivo descargado.

$ tar xzf wiki-js.tar.gz

Elimina el archivo.

$ rm wiki-js.tar.gz

Paso 6 – Configura y ejecuta Wiki.js

Crea el archivo de configuración del ejemplo.

$ cp config.sample.yml config.yml

Abre el archivo de configuración para editarlo.

$ nano config.yml

Busca los siguientes ajustes de la base de datos y actualiza sus valores con los configurados en el paso 3.

# PostgreSQL / MySQL / MariaDB / MS SQL Server only:
host: localhost
port: 5432
user: wikiuser
pass: wikipassword
db: wikidb
ssl: false

Busca la línea bindIP: 0.0.0.0 y actualízala como sigue.

bindIP: 127.0.0.1

Esto hará que WIki.js escuche en la dirección loopback porque utilizaremos el proxy Nginx para acceder a él desde el exterior.

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

Ejecuta Wiki.js utilizando el siguiente comando.

$ node server

Recibirás una salida similar confirmando que la instalación se ha realizado correctamente.

Loading configuration from /var/www/wikijs/config.yml... OK
2022-10-25T06:40:46.294Z [MASTER] info: =======================================
2022-10-25T06:40:46.296Z [MASTER] info: = Wiki.js 2.5.289 =====================
2022-10-25T06:40:46.296Z [MASTER] info: =======================================
2022-10-25T06:40:46.296Z [MASTER] info: Initializing...
2022-10-25T06:40:46.962Z [MASTER] info: Using database driver pg for postgres [ OK ]
2022-10-25T06:40:46.974Z [MASTER] info: Connecting to database...
2022-10-25T06:40:47.067Z [MASTER] info: Database Connection Successful [ OK ]
2022-10-25T06:40:47.345Z [MASTER] warn: DB Configuration is empty or incomplete. Switching to Setup mode...
2022-10-25T06:40:47.345Z [MASTER] info: Starting setup wizard...
2022-10-25T06:40:47.510Z [MASTER] info: Starting HTTP server on port 3000...
2022-10-25T06:40:47.511Z [MASTER] info: HTTP Server on port: [ 3000 ]
2022-10-25T06:40:47.515Z [MASTER] info: HTTP Server: [ RUNNING ]
2022-10-25T06:40:47.515Z [MASTER] info: .......................................................................
2022-10-25T06:40:47.515Z [MASTER] info: 
2022-10-25T06:40:47.516Z [MASTER] info: Browse to http://YOUR-SERVER-IP:3000/ to complete setup!
2022-10-25T06:40:47.516Z [MASTER] info: 
2022-10-25T06:40:47.516Z [MASTER] info: ........................................................................

Pulsa Ctrl + C para detener el proceso.

Paso 7 – Configurar un Servicio Systemd

El proceso anterior para mantener Wiki.js en funcionamiento es temporal. Para que el proceso sea permanente, necesitaremos crear un servicio systemd para que Wiki.js se ejecute como un servicio en segundo plano. Esto permitirá que Wiki.js se ejecute aunque se reinicie el sistema.

Crea un archivo de servicio systemd para Wiki.js y ábrelo para editarlo.

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

Pega en él el siguiente código. Sustituye el valor de la variable User por el nombre de tu usuario del sistema.

[Unit]
Description=Wiki.js
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always

User=navjot
Environment=NODE_ENV=production
WorkingDirectory=/var/www/wikijs

[Install]
WantedBy=multi-user.target

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Recarga el demonio del sistema.

$ sudo systemctl daemon-reload

Habilita el servicio Wiki.js.

$ sudo systemctl enable wikijs

Paso 8 – Instalar Nginx

Ubuntu 22.04 incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Importa la clave oficial de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Configura el repositorio oficial de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
  http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Fija el repositorio para dar preferencia al repositorio oficial sobre el de Ubuntu.

$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
     | sudo tee /etc/apt/preferences.d/99nginx

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala el servidor Nginx.

$ sudo apt install nginx -y

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.22.1

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-10-25 06:50:05 UTC; 2s ago
       Docs: https://nginx.org/en/docs/
    Process: 5522 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 5523 (nginx)
      Tasks: 2 (limit: 1030)
     Memory: 1.8M
        CPU: 4ms
     CGroup: /system.slice/nginx.service
             ??5523 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??5524 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Oct 25 06:50:05 wiki systemd[1]: Starting nginx - high performance web server...

Paso 9 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Ubuntu o descargar la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Ubuntu 22.04 viene con Snapd instalado por defecto. Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

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

Ejecuta el siguiente comando para emitir el certificado.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d wiki.example.com

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

Genera un certificado de grupo Diffie-Hellman.

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

Comprueba el servicio del programador de renovaciones de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT          LAST                        PASSED    UNIT                           ACTIVATES             

.................................................................................................................................
Tue 2022-10-25 00:00:00 UTC 17h left      Tue 2022-10-25 04:49:20 UTC 2h ago    logrotate.timer                logrotate.service
Tue 2022-10-25 02:39:09 UTC 20h left      Tue 2022-10-25 06:47:33 UTC 12min ago apt-daily.timer                apt-daily.service
Tue 2022-10-25 06:02:00 UTC 8h left       n/a                         n/a       snap.certbot.renew.timer       snap.certbot.renew.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 10 – Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/wikijs.conf para editarlo.

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

Pega el siguiente código en él.

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

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

    root /var/www/wikijs;

    access_log  /var/log/nginx/wiki.access.log;
    error_log   /var/log/nginx/wiki.error.log;

    http2_push_preload on; # Enable HTTP/2 Server Push

    ssl_certificate /etc/letsencrypt/live/wiki.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/wiki.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/wiki.example.com/chain.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;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    add_header X-Early-Data $tls1_3_early_data;

    location / {
        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-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:3000;
    }
}

# 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 "";
}

Sustituye la ubicación raíz del archivo anterior por el directorio de tu servidor.

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

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 solicite.

Comprueba la configuración de Nginx.

$ sudo nginx -t

Si no ves ningún error, significa que puedes continuar.

Inicia el servicio Wiki.js.

$ sudo systemctl start wikijs

Recarga el servidor Nginx.

$ sudo systemctl reload nginx

Paso 11 – Finaliza la instalación

Visita la URL https://wiki.example.com para finalizar la instalación.

Página de configuración de Wiki.js

Introduce los datos de tu cuenta de administrador y la URL. Desactiva la Telemetría desmarcando la opción Permitir Telemetría. También puedes desactivarla desde el panel de Administración. Pulsa el botón Instalar para continuar.

Accederás a la página de inicio de sesión.

Página de inicio de sesión Wiki.js

Introduce los datos de tu cuenta y haz clic en el botón Iniciar sesión para acceder a la página de administración.

Página de administración de Wiki.js

Ya puedes empezar a utilizar Wiki.js.

Conclusión

Con esto concluye nuestro tutorial, en el que has aprendido a instalar Wiki.js en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...