Aller au contenu principal

Lab 5.8 - Installer Wiki.js sur Ubuntu 24.04 LTS avec PostgreSQL

Objectifs​

À la fin de ce lab, vous serez capable de:

  • Installer Git et Node.js sur Ubuntu 24.04
  • Installer et configurer PostgreSQL
  • Télécharger et configurer Wiki.js avec PostgreSQL
  • Créer un service systemd pour Wiki.js
  • Gérer les services Node.js et systemd
  • Explorer PostgreSQL via le terminal
  • Résoudre les problèmes courants

Prérequis​

  • Ubuntu 24.04 LTS installé
  • Accès sudo
  • Connexion Internet
  • Au moins 2 GB de RAM disponible
  • Au moins 5 GB d'espace disque libre

Partie 1: Installation de Git​

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

Partie 2: Installation 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

Partie 3: Installation et Configuration de PostgreSQL​

Installation de PostgreSQL​

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

Création de la base de données et de l'utilisateur​

sudo -u postgres psql

Dans l'invite PostgreSQL :

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

Note : Remplacez StrongPassword123! par un mot de passe sécurisé de votre choix.


Partie 4: Création d'un Utilisateur Système pour Wiki.js​

# Créer un utilisateur système
sudo adduser --system --group wikijs

# Créer le répertoire d'installation
sudo mkdir -p /var/www/wikijs

# Vérifier la création
ls -l /var/www

# Définir le propriétaire
sudo chown -R wikijs:wikijs /var/www/wikijs

# Vérifier les permissions
ls -l /var/www

# Permettre la connexion avec bash
sudo usermod -s /bin/bash wikijs

Partie 5: Installation de Wiki.js​

Ajouter wikijs aux sudoers et définir un mot de passe​

# Définir un mot de passe pour wikijs
sudo passwd wikijs
# Entrez le mot de passe (par exemple: wikijs)

# Ajouter wikijs au groupe sudo
sudo usermod -aG sudo wikijs

# Vérifier
groups wikijs
# Devrait afficher: wikijs : wikijs sudo

Télécharger et installer Wiki.js​

# Se connecter en tant que wikijs
sudo su - wikijs

# Aller dans le répertoire d'installation
cd /var/www/wikijs

# Télécharger Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz

# Extraire l'archive
tar xzf wiki-js.tar.gz

# Supprimer l'archive
rm wiki-js.tar.gz

# Copier le fichier de configuration exemple
cp config.sample.yml config.yml

# Quitter la session wikijs
exit

Partie 6: Configuration de Wiki.js pour PostgreSQL​

Éditer le fichier de configuration​

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

Remplacez la section db: par :​

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

Important : Remplacez StrongPassword123! par le mot de passe que vous avez défini pour wikidb_user.

Commenter les sections non utilisées​

Assurez-vous que les sections suivantes soient commentées ou supprimées si inutilisées :

#  schema: public      # COMMENTEZ si non utilisé
# storage: path/to/database.sqlite # COMMENTEZ si non utilisé
# sslOptions: # COMMENTEZ si inutilisé
# auto: true
# rejectUnauthorized: false

Configuration pour accès externe​

Pour que Wiki.js soit accessible depuis l'extérieur :

bindIP: 0.0.0.0
port: 3000

Sauvegardez et quittez avec Ctrl + X, puis Y, puis Entrée.


Partie 7: Création du Service systemd​

Ajouter aux sudoers et définir un mot de passe pour wikijs​

# Si pas déjà fait
sudo passwd wikijs
sudo usermod -aG sudo wikijs

Créer le service​

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

Contenu du fichier :

[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

Sauvegardez et quittez.


Partie 8: Démarrage et Vérification​

# Recharger la configuration systemd
sudo systemctl daemon-reload

# Démarrer le service
sudo systemctl start wikijs

# Activer le service au démarrage
sudo systemctl enable wikijs

# Vérifier le statut
sudo systemctl status wikijs

Partie 9: Dépannage Courant​

Si vous voyez des erreurs de type :

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

Revérifiez que vous avez bien commenté ou supprimé les blocs suivants dans config.yml :

#  sslOptions:
# auto: true

# schema: public

# storage: path/to/database.sqlite

Puis redémarrez :

sudo systemctl restart wikijs

Vérifier les logs​

# Voir les logs du service
sudo journalctl -u wikijs.service --no-pager --lines=50

# Suivre les logs en temps réel
sudo journalctl -u wikijs.service -f

Partie 10: Accès à l'Interface Wiki.js​

Dans votre navigateur : http://<IP_de_votre_serveur>:3000

Suivez les instructions pour créer un compte administrateur et terminer l'installation.


Partie 11: Passage en HTTPS (Optionnel)​

# Installer Certbot et le plugin Nginx
sudo apt update
sudo apt install certbot python3-certbot-nginx -y

# Autoriser Nginx (HTTP et HTTPS)
sudo ufw allow 'Nginx Full'

# Obtenir un certificat SSL
sudo certbot --nginx

# Tester le renouvellement automatique
sudo certbot renew --dry-run

Annexe 1: Explorer PostgreSQL​

1. Connexion à PostgreSQL​

# Se connecter en tant que superutilisateur
sudo -u postgres psql

# Ou se connecter directement à une base spécifique avec un utilisateur
psql -U wikidb_user -d wikidb -h localhost

2. Commandes de Navigation dans psql​

CommandeDescription
\lListe toutes les bases de données
\c nom_baseSe connecter à une base
\dtListe les tables
\d nom_tableAffiche la structure d'une table
\duListe les utilisateurs
\dnListe les schémas
\dfListe les fonctions
\xActive le mode d'affichage étendu
\qQuitter psql

3. Exemples de Requêtes Utiles​

Tables, colonnes et index :​

-- Lister toutes les tables d'un schéma
SELECT tablename FROM pg_tables WHERE schemaname = 'public';

-- Voir les colonnes d'une table
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users';

-- Voir les index
SELECT * FROM pg_indexes WHERE tablename = 'users';

Espaces et tailles :​

-- Taille d'une base
SELECT pg_size_pretty(pg_database_size('wikidb'));

-- Taille d'une table
SELECT pg_size_pretty(pg_total_relation_size('users'));

Activité et sessions :​

-- Voir les connexions actives
SELECT * FROM pg_stat_activity;

-- Voir les verrous en cours
SELECT * FROM pg_locks;

Schéma courant :​

-- Voir le schéma par défaut de l'utilisateur connecté
SHOW search_path;

4. Export et Dump​

# Dump complet de la base (format binaire)
pg_dump -U wikidb_user -d wikidb -F c -f wikidb.dump

# Export en SQL lisible
pg_dump -U wikidb_user -d wikidb -F p -f wikidb.sql

5. Nettoyage et Vérification​

-- Trouver les tables vides
SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname = 'public'
AND NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = tablename);

-- Vérifier les contraintes
SELECT * FROM information_schema.table_constraints WHERE table_schema = 'public';

Annexe 2: Exercice - Maîtriser les Bases de PostgreSQL​

Objectif​

Créer une base de données complète nommée coursdb, avec un utilisateur dédié, deux tables (etudiants, programmes), relations, insertions, requêtes SQL, et gestion de droits.

Étape 1 – Créer la Base et l'Utilisateur​

En tant que superutilisateur PostgreSQL :

sudo -u postgres psql

Dans psql :

-- Créer une base de données
CREATE DATABASE coursdb;

-- Créer un utilisateur
CREATE USER cours_user WITH PASSWORD 'cours123';

-- Donner tous les droits sur la base
GRANT ALL PRIVILEGES ON DATABASE coursdb TO cours_user;

-- Quitter
\q

Étape 2 – Se Connecter à la Base​

psql -U cours_user -d coursdb -h localhost

Étape 3 – Créer les Tables​

-- Créer la table programmes
CREATE TABLE programmes (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
niveau TEXT NOT NULL
);

-- Créer la table etudiants avec relation vers 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
);

Étape 4 – Insérer des Données​

-- Insérer des programmes
INSERT INTO programmes (nom, niveau) VALUES
('Informatique', 'DEC'),
('Administration', 'AEC');

-- Insérer des étudiants
INSERT INTO etudiants (nom, age, programme_id) VALUES
('Alice', 21, 1),
('Bob', 24, 1),
('Caroline', 20, 2);

Étape 5 – Faire des Requêtes​

-- Tous les étudiants
SELECT * FROM etudiants;

-- Nom des étudiants avec leur programme
SELECT e.nom AS etudiant, p.nom AS programme
FROM etudiants e
JOIN programmes p ON e.programme_id = p.id;

-- Compter les étudiants par programme
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;

Étape 6 – Modifier ou Supprimer​

-- Modifier un étudiant
UPDATE etudiants SET age = 22 WHERE nom = 'Alice';

-- Supprimer un étudiant
DELETE FROM etudiants WHERE nom = 'Bob';

-- Supprimer un programme (provoque suppression en cascade)
DELETE FROM programmes WHERE nom = 'Administration';

Étape 7 – Gestion des Utilisateurs​

-- Connecté en tant que postgres
sudo -u postgres psql

-- Créer un lecteur seul
CREATE USER lecteur WITH PASSWORD 'readonly123';

-- Connexion à la base
\c coursdb

-- Donner accès en lecture seulement
GRANT CONNECT ON DATABASE coursdb TO lecteur;
GRANT USAGE ON SCHEMA public TO lecteur;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO lecteur;

-- Appliquer automatiquement aux futures tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO lecteur;

\q

Bonus – Vérification​

-- Voir les utilisateurs
\du

-- Lister les tables et voir leurs droits
\dt+

Annexe 3: Gestion des Services et Ports​

Partie 1: Voir Tous les Ports Actifs​

Pour voir tous les ports actifs (ouverts, écoutés ou en écoute par des services, y compris Node.js) sur Ubuntu 24.04, utilisez plusieurs commandes.

1. Avec ss (remplaçant moderne de netstat)​

sudo ss -tuln

Explication :

  • -t : TCP
  • -u : UDP
  • -l : ports en écoute (listening)
  • -n : sans résolution DNS (plus rapide)

2. Avec lsof pour voir quel processus utilise quel port​

sudo lsof -i -P -n

Filtrer par Node.js uniquement :

sudo lsof -i -P -n | grep node

3. Avec netstat (si installé)​

sudo netstat -tulnp

Sinon installez-le :

sudo apt install net-tools

4. Voir Tous les Processus Node.js en Cours​

ps aux | grep node

5. Voir les Services Écoutant sur un Port Particulier​

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

6. Afficher les Ports avec nmap (scan local)​

sudo apt install nmap
sudo nmap -sT -O localhost

Partie 2: Arrêter un Service Node.js Installé avec systemd​

Étape 1 – Trouver le Nom du Service​

Si vous n'êtes pas sûr du nom exact du service, listez les services actifs liés à Node.js :

systemctl | grep node

Ou listez tous les services actifs :

systemctl list-units --type=service

Vous pouvez aussi chercher dans le dossier systemd :

ls /etc/systemd/system/

Étape 2 – Arrêter le Service​

Une fois le nom trouvé (ex. wikijs.service ou my-node-app.service) :

sudo systemctl stop nom-du-service

Exemple :

sudo systemctl stop wikijs.service

Étape 3 – (Optionnel) Désactiver le Service au Démarrage​

sudo systemctl disable nom-du-service

Étape 4 – (Optionnel) Supprimer Complètement le Service​

sudo rm /etc/systemd/system/nom-du-service.service
sudo systemctl daemon-reload

Partie 3: Arrêter un Processus Node.js sur un Port Spécifique​

Exemple : Votre application Node.js tourne sur le port 3100, et elle est lancée par l'utilisateur www-data via un processus node.

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

Étape 1 — Trouver et Arrêter le Service systemd​

Si elle est lancée comme service, alors son nom de service pourrait ressembler à wikijs, nodeapp, app3100, etc.

Essayez :

systemctl | grep 3100

ou encore plus général :

systemctl | grep node

Étape 2 — Stopper le Service (si connu)​

Une fois que vous avez trouvé le nom du service (ex. wikijs.service), faites :

sudo systemctl stop wikijs.service

Étape 3 — Optionnel : Tuer le Processus Manuellement​

Si le service ne s'arrête pas ou si ce n'est pas un vrai service systemd (par exemple lancé manuellement par un script), vous pouvez tuer le processus directement :

sudo kill 1064738

ou plus sûr :

sudo kill -9 1064738

Vérification​

Après l'arrêt :

sudo ss -tuln | grep 3100

ou

sudo lsof -i :3100

Il ne devrait plus rien apparaître.


Partie 4: Service qui Redémarre Automatiquement​

Si votre application Node.js écoute toujours sur le port 3100, et elle est relancée même après que vous l'ayez tuée manuellement, cela indique qu'elle est gérée par un service ou un superviseur qui la relance automatiquement.

Étapes pour l'Identifier et l'Arrêter Définitivement​

1. Trouver le Vrai Nom du Service​

Essayez cette commande pour trouver tous les services contenant "node" ou 3100 :

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

Ou plus largement :

ps aux | grep node

Puis :

ps -fp <PID>

Cela va nous dire quel script ou fichier est exécuté et par quoi il a été lancé.

2. Vérifier si pm2 est Utilisé​
which pm2 && pm2 list

Si pm2 est installé, il relance automatiquement votre app. Pour l'arrêter définitivement :

pm2 stop all
pm2 delete all
pm2 unstartup
3. Voir l'Origine Exacte du Processus​
sudo ls -l /proc/<PID>/exe
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

Cela va afficher le chemin réel du script Node.js, par exemple :

/usr/bin/node /var/www/wiki/server.js
4. Trouver les Fichiers .service Responsables​

Liste les fichiers dans /etc/systemd/system/ et /lib/systemd/system/ :

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

Ou plus large :

grep -r 3100 /etc/systemd/system/

Étape Finale : Désactivation et Arrêt Complet​

Une fois que vous avez le vrai nom du service, faites :

sudo systemctl stop nom.service
sudo systemctl disable nom.service

Puis rechargez :

sudo systemctl daemon-reload
sudo systemctl reset-failed

Partie 5: Suppression Complète d'un Service systemd​

Pour supprimer définitivement un service Node.js (ou tout autre service systemd), procédez en trois étapes :

Étape 1 — Trouver le Nom du Service Exact​

D'abord, listez tous les services systemd personnalisés :

ls /etc/systemd/system/

Cherchez un fichier qui pourrait ressembler à :

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

Vous pouvez aussi filtrer :

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

Étape 2 — Stopper et Désactiver le Service​

Supposons que le nom du fichier est wikijs.service, exécutez :

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

Étape 3 — Supprimer le Fichier de Définition du Service​

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

Ensuite, rechargez systemd pour appliquer les changements :

sudo systemctl daemon-reload
sudo systemctl reset-failed

(Optionnel) Vérifier qu'il n'Existe Plus​

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

ou

systemctl status wikijs.service

Vous devez obtenir un message comme :

Unit wikijs.service could not be found.

Commandes Utiles​

# Lister tous les services personnalisés
ls -l /etc/systemd/system/

# Chercher un service spécifique
grep -r ExecStart /etc/systemd/system/

# Analyser le processus exact en fonction du PID
ps -fp <PID>
sudo cat /proc/<PID>/cmdline | tr '\0' ' '

Annexe 4: Qu'est-ce que pm2 ?​

Dans le contexte de Node.js, pm2 désigne Process Manager 2, un outil très utilisé pour :

  • Lancer des applications Node.js en arrière-plan
  • Les maintenir en vie même après un crash
  • Les redémarrer automatiquement au démarrage du système
  • Gérer plusieurs processus Node.js facilement

Pourquoi pm2 peut être en Cause​

Même si vous arrêtez un service Node.js manuellement (kill, systemctl, etc.), pm2 peut automatiquement :

  • Redémarrer l'application
  • Réinitialiser les processus au démarrage de la machine (si pm2 startup a été exécuté)

C'est pourquoi il est important de vérifier si pm2 est actif.

Commandes à Connaître pour Arrêter Complètement pm2​

  1. Vérifier si pm2 est installé :
which pm2 && pm2 list
  1. Arrêter tous les processus gérés par pm2 :
pm2 stop all
  1. Supprimer les processus enregistrés :
pm2 delete all
  1. Désactiver le redémarrage automatique au démarrage :
pm2 unstartup
  1. Facultatif : Désinstaller pm2 s'il n'est plus nécessaire :
npm uninstall -g pm2

Résumé des Commandes Importantes​

CommandeDescription
sudo ss -tulnVoir tous les ports en écoute
sudo lsof -i -P -nVoir les processus utilisant des ports
sudo systemctl status wikijsVérifier le statut d'un service
sudo systemctl stop wikijsArrêter un service
sudo systemctl disable wikijsDésactiver un service au démarrage
sudo journalctl -u wikijs.service -fSuivre les logs en temps réel
ps aux | grep nodeVoir tous les processus Node.js
pm2 listVoir les processus gérés par pm2

Vérification Finale​

Vérifiez que vous avez réussi à :

  • Installer Git et Node.js
  • Installer et configurer PostgreSQL
  • Créer la base de données et l'utilisateur pour Wiki.js
  • Télécharger et extraire Wiki.js
  • Configurer le fichier config.yml pour PostgreSQL
  • Créer et activer le service systemd
  • Accéder à Wiki.js via le navigateur
  • Explorer PostgreSQL avec les commandes psql
  • Comprendre la gestion des services systemd
  • Savoir arrêter et supprimer un service

Questions de Réflexion​

  1. Quelle est la différence entre PostgreSQL et MariaDB ?

    • Dans quels cas utiliseriez-vous l'un plutôt que l'autre ?
  2. Pourquoi est-il important de commenter les sections non utilisées dans config.yml ?

    • Expliquez les erreurs YAML et comment les éviter
  3. Quelle est la différence entre systemctl stop et systemctl disable ?

    • Quand utiliseriez-vous chacune de ces commandes ?
  4. Qu'est-ce que pm2 et pourquoi peut-il causer des problèmes lors de l'arrêt d'un service ?

    • Comment vérifier si pm2 est utilisé ?
  5. Expliquez la différence entre bindIP: 127.0.0.1 et bindIP: 0.0.0.0

    • Dans quels cas utiliseriez-vous chacune de ces configurations ?

Prochaines Étapes​

  • Lab 5.7: Installation Wiki.js avec MariaDB
  • Module 8: Services et Démon (pour approfondir systemd)
  • TP 2: Reverse Proxy NGINX (pour exposer Wiki.js via un reverse proxy)

Ressources Complémentaires​


Lab créé le: Décembre 2024