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 entryUnable 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
| Comando | Descripción |
|---|---|
\l | Lista todas las bases de datos |
\c nombre_bd | Conectarse a una base |
\dt | Lista las tablas |
\d nombre_tabla | Muestra la estructura de una tabla |
\du | Lista los usuarios |
\dn | Lista los esquemas |
\df | Lista las funciones |
\x | Activa el modo de visualización extendido |
\q | Salir 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.servicenodeapp.serviceapp3100.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
- Verificar si
pm2está instalado:
which pm2 && pm2 list
- Detener todos los procesos gestionados por
pm2:
pm2 stop all
- Eliminar los procesos registrados:
pm2 delete all
- Desactivar el reinicio automático al inicio:
pm2 unstartup
- Opcional: Desinstalar
pm2si ya no es necesario:
npm uninstall -g pm2
Resumen de Comandos Importantes
| Comando | Descripción |
|---|---|
sudo ss -tuln | Ver todos los puertos en escucha |
sudo lsof -i -P -n | Ver los procesos que usan puertos |
sudo systemctl status wikijs | Verificar el estado de un servicio |
sudo systemctl stop wikijs | Detener un servicio |
sudo systemctl disable wikijs | Deshabilitar un servicio al inicio |
sudo journalctl -u wikijs.service -f | Seguir los logs en tiempo real |
ps aux | grep node | Ver todos los procesos Node.js |
pm2 list | Ver 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.ymlpara 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
-
¿Cuál es la diferencia entre PostgreSQL y MariaDB?
- ¿En qué casos usaría uno u otro?
-
¿Por qué es importante comentar las secciones no utilizadas en
config.yml?- Explique los errores YAML y cómo evitarlos
-
¿Cuál es la diferencia entre
systemctl stopysystemctl disable?- ¿Cuándo usaría cada uno de estos comandos?
-
¿Qué es
pm2y por qué puede causar problemas al detener un servicio?- ¿Cómo verificar si se está usando
pm2?
- ¿Cómo verificar si se está usando
-
Explique la diferencia entre
bindIP: 127.0.0.1ybindIP: 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
- Documentación de Wiki.js
- Documentación de PostgreSQL
- Documentación de Node.js
- Documentación de systemd
- Documentación de PM2
Lab creado el: Diciembre 2024