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 entryUnable 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
| Commande | Description |
|---|---|
\l | Liste toutes les bases de données |
\c nom_base | Se connecter à une base |
\dt | Liste les tables |
\d nom_table | Affiche la structure d'une table |
\du | Liste les utilisateurs |
\dn | Liste les schémas |
\df | Liste les fonctions |
\x | Active le mode d'affichage étendu |
\q | Quitter 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.servicenodeapp.serviceapp3100.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 startupa é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
- Vérifier si
pm2est installé :
which pm2 && pm2 list
- Arrêter tous les processus gérés par
pm2:
pm2 stop all
- Supprimer les processus enregistrés :
pm2 delete all
- Désactiver le redémarrage automatique au démarrage :
pm2 unstartup
- Facultatif : Désinstaller
pm2s'il n'est plus nécessaire :
npm uninstall -g pm2
Résumé des Commandes Importantes
| Commande | Description |
|---|---|
sudo ss -tuln | Voir tous les ports en écoute |
sudo lsof -i -P -n | Voir les processus utilisant des ports |
sudo systemctl status wikijs | Vérifier le statut d'un service |
sudo systemctl stop wikijs | Arrêter un service |
sudo systemctl disable wikijs | Désactiver un service au démarrage |
sudo journalctl -u wikijs.service -f | Suivre les logs en temps réel |
ps aux | grep node | Voir tous les processus Node.js |
pm2 list | Voir 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.ymlpour 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
-
Quelle est la différence entre PostgreSQL et MariaDB ?
- Dans quels cas utiliseriez-vous l'un plutôt que l'autre ?
-
Pourquoi est-il important de commenter les sections non utilisées dans
config.yml?- Expliquez les erreurs YAML et comment les éviter
-
Quelle est la différence entre
systemctl stopetsystemctl disable?- Quand utiliseriez-vous chacune de ces commandes ?
-
Qu'est-ce que
pm2et pourquoi peut-il causer des problèmes lors de l'arrêt d'un service ?- Comment vérifier si
pm2est utilisé ?
- Comment vérifier si
-
Expliquez la différence entre
bindIP: 127.0.0.1etbindIP: 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
- Documentation Wiki.js
- PostgreSQL Documentation
- Node.js Documentation
- systemd Documentation
- PM2 Documentation
Lab créé le: Décembre 2024