Saltar al contenido principal

Lab 5.8 - Instalar Wiki.js en Ubuntu 24.04 LTS con PostgreSQL

Objetivos​

Al final de este laboratorio, usted será capaz de:

  • Instalar Git y Node.js en Ubuntu 24.04
  • Instalar y configurar PostgreSQL
  • Descargar y configurar Wiki.js con PostgreSQL
  • Crear un servicio systemd para Wiki.js
  • Gestionar los servicios Node.js y systemd
  • Explorar PostgreSQL vía terminal
  • Resolver problemas comunes

Prerrequisitos​

  • Ubuntu 24.04 LTS instalado
  • Acceso sudo
  • Conexión a Internet
  • Al menos 2 GB de RAM disponible
  • Al menos 5 GB de espacio libre en disco

Parte 1: Instalación de Git​

sudo apt update
sudo apt install git -y
git --version

Parte 2: Instalación de Node.js (LTS)​

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
node -v && npm -v

Parte 3: Instalación y Configuración de PostgreSQL​

Instalación de PostgreSQL​

sudo apt install postgresql postgresql-contrib -y
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo systemctl status postgresql

Creación de la base de datos y del usuario​

sudo -u postgres psql

En el prompt de PostgreSQL:

CREATE DATABASE wikidb;
CREATE USER wikidb_user WITH PASSWORD 'StrongPassword123!';
GRANT ALL PRIVILEGES ON DATABASE wikidb TO wikidb_user;
\q

Nota: Reemplace StrongPassword123! por una contraseña segura de su elección.


Parte 4: Creación de un Usuario de Sistema para Wiki.js​

# Crear un usuario de sistema
sudo adduser --system --group wikijs

# Crear el directorio de instalación
sudo mkdir -p /var/www/wikijs

# Verificar la creación
ls -l /var/www

# Definir el propietario
sudo chown -R wikijs:wikijs /var/www/wikijs

# Verificar los permisos
ls -l /var/www

# Permitir la conexión con bash
sudo usermod -s /bin/bash wikijs

Parte 5: Instalación de Wiki.js​

Agregar wikijs a sudoers y definir una contraseña​

# Definir una contraseña para wikijs
sudo passwd wikijs
# Ingrese la contraseña (por ejemplo: wikijs)

# Agregar wikijs al grupo sudo
sudo usermod -aG sudo wikijs

# Verificar
groups wikijs
# Debería mostrar: wikijs : wikijs sudo

Descargar e instalar Wiki.js​

# Conectarse como wikijs
sudo su - wikijs

# Ir al directorio de instalación
cd /var/www/wikijs

# Descargar Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz

# Extraer el archivo
tar xzf wiki-js.tar.gz

# Eliminar el archivo
rm wiki-js.tar.gz

# Copiar el archivo de configuración de ejemplo
cp config.sample.yml config.yml

# Salir de la sesión wikijs
exit

Parte 6: Configuración de Wiki.js para PostgreSQL​

Editar el archivo de configuración​

sudo nano /var/www/wikijs/config.yml

Reemplace la sección db: por:​

port: 3000
bindIP: 0.0.0.0
db:
type: postgres
host: localhost
port: 5432
user: wikidb_user
pass: StrongPassword123!
db: wikidb
ssl: false

Importante: Reemplace StrongPassword123! por la contraseña que definió para wikidb_user.

Comentar las secciones no utilizadas​

Asegúrese de que las siguientes secciones estén comentadas o eliminadas si no se utilizan:

#  schema: public      # COMENTE si no se utiliza
# storage: path/to/database.sqlite # COMENTE si no se utiliza
# sslOptions: # COMENTE si no se utiliza
# auto: true
# rejectUnauthorized: false

Configuración para acceso externo​

Para que Wiki.js sea accesible desde el exterior:

bindIP: 0.0.0.0
port: 3000

Guarde y salga con Ctrl + X, luego Y, luego Enter.


Parte 7: Creación del Servicio systemd​

Agregar a sudoers y definir una contraseña para wikijs​

# Si no se ha hecho ya
sudo passwd wikijs
sudo usermod -aG sudo wikijs

Crear el servicio​

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

Contenido del archivo:

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

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs
Environment=NODE_ENV=production
WorkingDirectory=/var/www/wikijs

[Install]
WantedBy=multi-user.target

Guarde y salga.


Parte 8: Inicio y Verificación​

# Recargar la configuración de systemd
sudo systemctl daemon-reload

# Iniciar el servicio
sudo systemctl start wikijs

# Habilitar el servicio al inicio
sudo systemctl enable wikijs

# Verificar el estado
sudo systemctl status wikijs

Parte 9: Solución de Problemas Comunes​

Si ve errores como:

  • bad indentation of a mapping entry
  • Unable to read configuration file!

Verifique que haya comentado o eliminado los siguientes bloques en config.yml:

#  sslOptions:
# auto: true

# schema: public

# storage: path/to/database.sqlite

Luego reinicie:

sudo systemctl restart wikijs

Verificar los logs​

# Ver los logs del servicio
sudo journalctl -u wikijs.service --no-pager --lines=50

# Seguir los logs en tiempo real
sudo journalctl -u wikijs.service -f

Parte 10: Acceso a la Interfaz de Wiki.js​

En su navegador: http://<IP_de_su_servidor>:3000

Siga las instrucciones para crear una cuenta de administrador y finalizar la instalación.


Parte 11: Paso a HTTPS (Opcional)​

# Instalar Certbot y el plugin Nginx
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

# Permitir Nginx (HTTP y HTTPS)
sudo ufw allow 'Nginx Full'

# Obtener un certificado SSL
sudo certbot --nginx

# Probar la renovación automática
sudo certbot renew --dry-run

Anexo 1: Explorar PostgreSQL​

1. Conexión a PostgreSQL​

# Conectarse como superusuario
sudo -u postgres psql

# O conectarse directamente a una base específica con un usuario
psql -U wikidb_user -d wikidb -h localhost

2. Comandos de Navegación en psql​

ComandoDescripción
\lLista todas las bases de datos
\c nombre_bdConectarse a una base
\dtLista las tablas
\d nombre_tablaMuestra la estructura de una tabla
\duLista los usuarios
\dnLista los esquemas
\dfLista las funciones
\xActiva el modo de visualización extendido
\qSalir de psql

3. Ejemplos de Consultas Útiles​

Tablas, columnas e índices:​

-- Listar todas las tablas de un esquema
SELECT tablename FROM pg_tables WHERE schemaname = 'public';

-- Ver las columnas de una tabla
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users';

-- Ver los índices
SELECT * FROM pg_indexes WHERE tablename = 'users';

Espacios y tamaños:​

-- Tamaño de una base
SELECT pg_size_pretty(pg_database_size('wikidb'));

-- Tamaño de una tabla
SELECT pg_size_pretty(pg_total_relation_size('users'));

Actividad y sesiones:​

-- Ver las conexiones activas
SELECT * FROM pg_stat_activity;

-- Ver los bloqueos actuales
SELECT * FROM pg_locks;

Esquema actual:​

-- Ver el esquema por defecto del usuario conectado
SHOW search_path;

4. Exportación y Dump​

# Dump completo de la base (formato binario)
pg_dump -U wikidb_user -d wikidb -F c -f wikidb.dump

# Exportar en SQL legible
pg_dump -U wikidb_user -d wikidb -F p -f wikidb.sql

5. Limpieza y Verificación​

-- Encontrar las tablas vacías
SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname = 'public'
AND NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = tablename);

-- Verificar las restricciones
SELECT * FROM information_schema.table_constraints WHERE table_schema = 'public';

Anexo 2: Ejercicio - Dominar lo Básico de PostgreSQL​

Objetivo​

Crear una base de datos completa llamada coursdb, con un usuario dedicado, dos tablas (etudiants, programmes), relaciones, inserciones, consultas SQL y gestión de permisos.

Paso 1 – Crear la Base y el Usuario​

Como superusuario de PostgreSQL:

sudo -u postgres psql

En psql:

-- Crear una base de datos
CREATE DATABASE coursdb;

-- Crear un usuario
CREATE USER cours_user WITH PASSWORD 'cours123';

-- Otorgar todos los privilegios sobre la base
GRANT ALL PRIVILEGES ON DATABASE coursdb TO cours_user;

-- Salir
\q

Paso 2 – Conectarse a la Base​

psql -U cours_user -d coursdb -h localhost

Paso 3 – Crear las Tablas​

-- Crear la tabla programmes
CREATE TABLE programmes (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
niveau TEXT NOT NULL
);

-- Crear la tabla etudiants con relación a programmes
CREATE TABLE etudiants (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
age INTEGER CHECK (age > 0),
programme_id INTEGER REFERENCES programmes(id) ON DELETE CASCADE
);

Paso 4 – Insertar Datos​

-- Insertar programas
INSERT INTO programmes (nom, niveau) VALUES
('Informatique', 'DEC'),
('Administration', 'AEC');

-- Insertar estudiantes
INSERT INTO etudiants (nom, age, programme_id) VALUES
('Alice', 21, 1),
('Bob', 24, 1),
('Caroline', 20, 2);

Paso 5 – Realizar Consultas​

-- Todos los estudiantes
SELECT * FROM etudiants;

-- Nombre de los estudiantes con su programa
SELECT e.nom AS etudiant, p.nom AS programme
FROM etudiants e
JOIN programmes p ON e.programme_id = p.id;

-- Contar los estudiantes por programa
SELECT p.nom, COUNT(e.id) AS total
FROM programmes p
LEFT JOIN etudiants e ON p.id = e.programme_id
GROUP BY p.nom;

Paso 6 – Modificar o Eliminar​

-- Modificar un estudiante
UPDATE etudiants SET age = 22 WHERE nom = 'Alice';

-- Eliminar un estudiante
DELETE FROM etudiants WHERE nom = 'Bob';

-- Eliminar un programa (provoca eliminación en cascada)
DELETE FROM programmes WHERE nom = 'Administration';

Paso 7 – Gestión de Usuarios​

-- Conectado como postgres
sudo -u postgres psql

-- Crear un lector solo lectura
CREATE USER lecteur WITH PASSWORD 'readonly123';

-- Conexión a la base
\c coursdb

-- Otorgar acceso solo lectura
GRANT CONNECT ON DATABASE coursdb TO lecteur;
GRANT USAGE ON SCHEMA public TO lecteur;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO lecteur;

-- Aplicar automáticamente a futuras tablas
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO lecteur;

\q

Bonus – Verificación​

-- Ver los usuarios
\du

-- Listar las tablas y ver sus permisos
\dt+

Anexo 3: Gestión de Servicios y Puertos​

Parte 1: Ver Todos los Puertos Activos​

Para ver todos los puertos activos (abiertos, escuchando o en escucha por servicios, incluyendo Node.js) en Ubuntu 24.04, utilice varios comandos.

1. Con ss (reemplazo moderno de netstat)​

sudo ss -tuln

Explicación:

  • -t: TCP
  • -u: UDP
  • -l: puertos en escucha (listening)
  • -n: sin resolución DNS (más rápido)

2. Con lsof para ver qué proceso usa qué puerto​

sudo lsof -i -P -n

Filtrar solo por Node.js:

sudo lsof -i -P -n | grep node

3. Con netstat (si está instalado)​

sudo netstat -tulnp

Si no está instalado:

sudo apt install net-tools

4. Ver Todos los Procesos Node.js en Ejecución​

ps aux | grep node

5. Ver los Servicios Escuchando en un Puerto Específico​

sudo lsof -i :3000
sudo lsof -i :8080

6. Mostrar los Puertos con nmap (escaneo local)​

sudo apt install nmap
sudo nmap -sT -O localhost

Parte 2: Detener un Servicio Node.js Instalado con systemd​

Paso 1 – Encontrar el Nombre del Servicio​

Si no está seguro del nombre exacto del servicio, liste los servicios activos relacionados con Node.js:

systemctl | grep node

O liste todos los servicios activos:

systemctl list-units --type=service

También puede buscar en la carpeta de systemd:

ls /etc/systemd/system/

Paso 2 – Detener el Servicio​

Una vez encontrado el nombre (ej. wikijs.service o my-node-app.service):

sudo systemctl stop nombre-del-servicio

Ejemplo:

sudo systemctl stop wikijs.service

Paso 3 – (Opcional) Deshabilitar el Servicio al Inicio​

sudo systemctl disable nombre-del-servicio

Paso 4 – (Opcional) Eliminar Completamente el Servicio​

sudo rm /etc/systemd/system/nombre-del-servicio.service
sudo systemctl daemon-reload

Parte 3: Detener un Proceso Node.js en un Puerto Específico​

Ejemplo: Su aplicación Node.js corre en el puerto 3100, y es lanzada por el usuario www-data mediante un proceso node.

node      1064738   www-data   18u  TCP *:3100 (LISTEN)

Paso 1 — Encontrar y Detener el Servicio systemd​

Si se ejecuta como servicio, entonces su nombre podría ser wikijs, nodeapp, app3100, etc.

Pruebe:

systemctl | grep 3100

o más general:

systemctl | grep node

Paso 2 — Detener el Servicio (si se conoce)​

Una vez que haya encontrado el nombre del servicio (ej. wikijs.service), haga:

sudo systemctl stop wikijs.service

Paso 3 — Opcional: Matar el Proceso Manualmente​

Si el servicio no se detiene o no es un verdadero servicio systemd (por ejemplo, lanzado manualmente por un script), puede matar el proceso directamente:

sudo kill 1064738

o más seguro:

sudo kill -9 1064738

Verificación​

Después de detenerlo:

sudo ss -tuln | grep 3100

o

sudo lsof -i :3100

No debería aparecer nada.


Parte 4: Servicio que se Reinicia Automáticamente​

Si su aplicación Node.js sigue escuchando en el puerto 3100, y se relanza incluso después de matarla manualmente, esto indica que está gestionada por un servicio o supervisor que la reinicia automáticamente.

Pasos para Identificarlo y Detenerlo Definitivamente​

1. Encontrar el Nombre Real del Servicio​

Pruebe este comando para encontrar todos los servicios que contienen "node" o 3100:

sudo systemctl list-units --type=service | grep -i node

O más ampliamente:

ps aux | grep node

Luego:

ps -fp <PID>

Esto mostrará qué script o archivo se está ejecutando y por quién fue lanzado.

2. Verificar si se Usa pm2​
which pm2 && pm2 list

Si pm2 está instalado, relanza automáticamente su app. Para detenerla definitivamente:

pm2 stop all
pm2 delete all
pm2 unstartup
3. Ver el Origen Exacto del Proceso​
sudo ls -l /proc/<PID>/exe
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

Esto mostrará la ruta real del script Node.js, por ejemplo:

/usr/bin/node /var/www/wiki/server.js
4. Encontrar los Archivos .service Responsables​

Liste los archivos en /etc/systemd/system/ y /lib/systemd/system/:

ls /etc/systemd/system/ | grep -i wiki
ls /lib/systemd/system/ | grep -i wiki

O más ampliamente:

grep -r 3100 /etc/systemd/system/

Paso Final: Deshabilitación y Detención Completa​

Una vez que tenga el nombre real del servicio, haga:

sudo systemctl stop nombre.service
sudo systemctl disable nombre.service

Luego recargue:

sudo systemctl daemon-reload
sudo systemctl reset-failed

Parte 5: Eliminación Completa de un Servicio systemd​

Para eliminar definitivamente un servicio Node.js (o cualquier otro servicio systemd), proceda en tres pasos:

Paso 1 — Encontrar el Nombre Exacto del Servicio​

Primero, liste todos los servicios systemd personalizados:

ls /etc/systemd/system/

Busque un archivo que pueda parecerse a:

  • wikijs.service
  • nodeapp.service
  • app3100.service
  • etc.

También puede filtrar:

ls /etc/systemd/system/ | grep -i wiki

Paso 2 — Detener y Deshabilitar el Servicio​

Suponga que el nombre del archivo es wikijs.service, ejecute:

sudo systemctl stop wikijs.service
sudo systemctl disable wikijs.service

Paso 3 — Eliminar el Archivo de Definición del Servicio​

sudo rm /etc/systemd/system/wikijs.service

Luego, recargue systemd para aplicar los cambios:

sudo systemctl daemon-reload
sudo systemctl reset-failed

(Opcional) Verificar que ya no Existe​

systemctl list-units --type=service | grep wiki

o

systemctl status wikijs.service

Debe obtener un mensaje como:

Unit wikijs.service could not be found.

Comandos Útiles​

# Listar todos los servicios personalizados
ls -l /etc/systemd/system/

# Buscar un servicio específico
grep -r ExecStart /etc/systemd/system/

# Analizar el proceso exacto según el PID
ps -fp <PID>
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

Anexo 4: ¿Qué es pm2?​

En el contexto de Node.js, pm2 significa Process Manager 2, una herramienta muy utilizada para:

  • Lanzar aplicaciones Node.js en segundo plano
  • Mantenerlas vivas incluso después de un fallo
  • Reiniciarlas automáticamente al inicio del sistema
  • Gestionar múltiples procesos Node.js fácilmente

Por qué pm2 puede ser la Causa​

Incluso si usted detiene un servicio Node.js manualmente (kill, systemctl, etc.), pm2 puede automáticamente:

  • Reiniciar la aplicación
  • Restablecer los procesos al inicio de la máquina (si se ejecutó pm2 startup)

Por eso es importante verificar si pm2 está activo.

Comandos que Debe Conocer para Detener Completamente pm2​

  1. Verificar si pm2 está instalado:
which pm2 && pm2 list
  1. Detener todos los procesos gestionados por pm2:
pm2 stop all
  1. Eliminar los procesos registrados:
pm2 delete all
  1. Desactivar el reinicio automático al inicio:
pm2 unstartup
  1. Opcional: Desinstalar pm2 si ya no es necesario:
npm uninstall -g pm2

Resumen de Comandos Importantes​

ComandoDescripción
sudo ss -tulnVer todos los puertos en escucha
sudo lsof -i -P -nVer los procesos que usan puertos
sudo systemctl status wikijsVerificar el estado de un servicio
sudo systemctl stop wikijsDetener un servicio
sudo systemctl disable wikijsDeshabilitar un servicio al inicio
sudo journalctl -u wikijs.service -fSeguir los logs en tiempo real
ps aux | grep nodeVer todos los procesos Node.js
pm2 listVer los procesos gestionados por pm2

Verificación Final​

Verifique que ha logrado:

  • Instalar Git y Node.js
  • Instalar y configurar PostgreSQL
  • Crear la base de datos y el usuario para Wiki.js
  • Descargar y extraer Wiki.js
  • Configurar el archivo config.yml para PostgreSQL
  • Crear y activar el servicio systemd
  • Acceder a Wiki.js vía navegador
  • Explorar PostgreSQL con los comandos psql
  • Comprender la gestión de servicios systemd
  • Saber detener y eliminar un servicio

Preguntas de Reflexión​

  1. ¿Cuál es la diferencia entre PostgreSQL y MariaDB?

    • ¿En qué casos usaría uno u otro?
  2. ¿Por qué es importante comentar las secciones no utilizadas en config.yml?

    • Explique los errores YAML y cómo evitarlos
  3. ¿Cuál es la diferencia entre systemctl stop y systemctl disable?

    • ¿Cuándo usaría cada uno de estos comandos?
  4. ¿Qué es pm2 y por qué puede causar problemas al detener un servicio?

    • ¿Cómo verificar si se está usando pm2?
  5. Explique la diferencia entre bindIP: 127.0.0.1 y bindIP: 0.0.0.0

    • ¿En qué casos usaría cada una de estas configuraciones?

Próximos Pasos​

  • Lab 5.7: Instalación de Wiki.js con MariaDB
  • Módulo 8: Servicios y Demonio (para profundizar en systemd)
  • TP 2: Reverse Proxy NGINX (para exponer Wiki.js mediante un reverse proxy)

Recursos Complementarios​


Lab creado el: Diciembre 2024