Lab 8.5 - Exercice Annexe : Créer 3 Nouveaux Services Wiki.js et Tester Différentes Façons de les Arrêter
Objectifs
À la fin de ce lab, vous serez capable de:
- Maîtriser la création d'instances supplémentaires à partir d'un template systemd (
wikijs@.service) - Comparer plusieurs commandes de "mise à l'arrêt" et repérer celles qui fonctionnent correctement (et pourquoi)
- Utiliser les templates systemd pour gérer plusieurs instances d'une même application
- Identifier et arrêter des processus Node.js de différentes manières
- Comprendre les différences entre
stop,disable,kill, et autres méthodes d'arrêt
Prérequis
- Ubuntu 24.04 installé
- Accès sudo/root
- Wiki.js déjà installé (au moins une instance)
- Connaissance de base de systemd et MariaDB
- Terminal ouvert
Vue d'Ensemble
Dans ce lab, vous allez créer 3 nouvelles instances de Wiki.js (stage, qa, demo) en utilisant un template systemd. Ensuite, vous testerez différentes méthodes pour arrêter ces services et comprendrez pourquoi certaines fonctionnent et d'autres non.
Architecture des instances :
| Environnement | Compte Linux | Dossier | Port | Base MariaDB |
|---|---|---|---|---|
| stage | wikijs_stage | /var/www/stage.site1 | 3003 | wikidb_stage |
| qa | wikijs_qa | /var/www/qa.site1 | 3004 | wikidb_qa |
| demo | wikijs_demo | /var/www/demo.site1 | 3005 | wikidb_demo |
Partie 1: Préparation du Template systemd
Étape 1: Créer le Template systemd
Si vous n'avez pas déjà un template, créez-le :
sudo nano /etc/systemd/system/wikijs@.service
Contenu du template :
[Unit]
Description=Wiki.js Instance %i
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=wikijs_%i
Environment=NODE_ENV=production
WorkingDirectory=/var/www/%i.site1
[Install]
WantedBy=multi-user.target
Explication :
%iest remplacé par l'instance (stage, qa, demo)wikijs_%idevientwikijs_stage,wikijs_qa,wikijs_demo/var/www/%i.site1devient/var/www/stage.site1, etc.
Étape 2: Recharger systemd
sudo systemctl daemon-reload
Partie 2: Création des Trois Nouvelles Instances
Étape 1: Créer les Utilisateurs Système
# Créer les utilisateurs pour chaque instance
sudo adduser --system --group wikijs_stage
sudo adduser --system --group wikijs_qa
sudo adduser --system --group wikijs_demo
# Permettre la connexion avec bash
sudo usermod -s /bin/bash wikijs_stage
sudo usermod -s /bin/bash wikijs_qa
sudo usermod -s /bin/bash wikijs_demo
Étape 2: Créer les Répertoires
# Créer les répertoires pour chaque instance
sudo mkdir -p /var/www/stage.site1
sudo mkdir -p /var/www/qa.site1
sudo mkdir -p /var/www/demo.site1
# Définir les propriétaires
sudo chown -R wikijs_stage:wikijs_stage /var/www/stage.site1
sudo chown -R wikijs_qa:wikijs_qa /var/www/qa.site1
sudo chown -R wikijs_demo:wikijs_demo /var/www/demo.site1
Étape 3: Créer les Bases de Données MariaDB
# Se connecter à MariaDB
sudo mysql -u root -p
Dans le shell MariaDB :
-- Créer les bases de données
CREATE DATABASE wikidb_stage;
CREATE DATABASE wikidb_qa;
CREATE DATABASE wikidb_demo;
-- Créer les utilisateurs
CREATE USER 'wikidb_stage_user'@'localhost' IDENTIFIED BY 'password_stage';
CREATE USER 'wikidb_qa_user'@'localhost' IDENTIFIED BY 'password_qa';
CREATE USER 'wikidb_demo_user'@'localhost' IDENTIFIED BY 'password_demo';
-- Accorder les privilèges
GRANT ALL PRIVILEGES ON wikidb_stage.* TO 'wikidb_stage_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_qa.* TO 'wikidb_qa_user'@'localhost';
GRANT ALL PRIVILEGES ON wikidb_demo.* TO 'wikidb_demo_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Étape 4: Télécharger et Installer Wiki.js pour Chaque Instance
Pour Stage (port 3003)
# Se connecter en tant que wikijs_stage
sudo su - wikijs_stage
# Aller dans le répertoire
cd /var/www/stage.site1
# Télécharger Wiki.js
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
# Extraire
tar xzf wiki-js.tar.gz
# Supprimer l'archive
rm wiki-js.tar.gz
# Copier le fichier de configuration
cp config.sample.yml config.yml
# Éditer la configuration
nano config.yml
Configuration pour stage :
port: 3003
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_stage_user
pass: password_stage
db: wikidb_stage
ssl: false
Sauvegardez et quittez. Puis :
exit
Pour QA (port 3004)
sudo su - wikijs_qa
cd /var/www/qa.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml
Configuration pour qa :
port: 3004
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_qa_user
pass: password_qa
db: wikidb_qa
ssl: false
Sauvegardez et quittez. Puis :
exit
Pour Demo (port 3005)
sudo su - wikijs_demo
cd /var/www/demo.site1
wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
tar xzf wiki-js.tar.gz
rm wiki-js.tar.gz
cp config.sample.yml config.yml
nano config.yml
Configuration pour demo :
port: 3005
bindIP: 0.0.0.0
db:
type: mariadb
host: localhost
port: 3306
user: wikidb_demo_user
pass: password_demo
db: wikidb_demo
ssl: false
Sauvegardez et quittez. Puis :
exit
Étape 5: Activer et Démarrer les Services
# Activer et démarrer les trois instances
sudo systemctl enable --now wikijs@stage
sudo systemctl enable --now wikijs@qa
sudo systemctl enable --now wikijs@demo
Étape 6: Contrôle
# Vérifier le statut de chaque instance
sudo systemctl status wikijs@stage --no-pager
sudo systemctl status wikijs@qa --no-pager
sudo systemctl status wikijs@demo --no-pager
# Vérifier que les ports sont bien en écoute
sudo ss -tlnp | grep -E '3003|3004|3005'
Partie 3: Identifier les Processus et Ports
Annexe 1: Commandes pour Identifier les Processus Node.js
1. Afficher Tous les Processus Node avec l'Unité systemd
ps -eo pid,user,unit,cmd | grep -w node
2. Version Compacte : PID + Ligne de Commande
pgrep -a node
3. Boucle : Pour Chaque PID Node, Montrer les Ports qu'il Écoute
for pid in $(pgrep node); do lsof -Pan -p "$pid" -i; done
4. Afficher Directement Tous les Sockets Node Ouverts
ss -tlnp | grep node
5. Pour un PID Précis
# Remplacez 1234 par le vrai PID
systemctl status --pid=1234
cat /proc/1234/cgroup | grep system.slice
Partie 4: Tester Différentes Méthodes d'Arrêt
Méthodes d'Arrêt à Tester
Commande A – Arrêt Correct par systemd
# Arrêt propre de l'instance stage
sudo systemctl stop wikijs@stage
Analyse : Cette commande arrête proprement le service via systemd. C'est la méthode recommandée.
Commande B – Erreur Logique : Désactive pour Plus Tard, Ne Stoppe Pas
# Désactive le service mais ne l'arrête pas immédiatement
sudo systemctl disable wikijs@qa
Analyse : Cette commande désactive le service au démarrage mais ne l'arrête pas s'il est déjà en cours d'exécution. Le service continue de tourner jusqu'au prochain redémarrage.
Commande C – ⚠️ Très Risquée : Tue Tous les Processus "wikijs"
# Tue tous les processus nommés "wikijs"
sudo killall wikijs
Analyse : Cette commande est risquée car elle tue tous les processus correspondant au nom, sans distinction. Elle peut affecter d'autres processus non liés.
Commande D – Arrêt Indirect via le Port de l'Instance Demo (3005)
# Tue le processus qui écoute sur le port 3005
sudo fuser -k 3005/tcp
Analyse : Cette commande identifie et tue le processus qui utilise le port 3005. Fonctionne mais moins propre que systemctl.
Commande E – Arrêt Forcé de QA (port 3004) via lsof + kill -9
# Trouve le PID qui écoute sur 3004 et le tue
sudo lsof -ti:3004 | xargs sudo kill -9
Analyse : Cette commande trouve le PID du processus qui écoute sur le port 3004 et le tue de force. Fonctionne mais utilise SIGKILL (force brute).
Commande F – Reload ≠ Stop : Ne Coupe Pas le Service
# Recharge la configuration mais ne coupe pas le service
sudo systemctl reload wikijs@demo
Analyse : Cette commande recharge la configuration du service mais ne l'arrête pas. Le service continue de fonctionner.
Réponses Correctes Uniquement
Les commandes qui arrêtent réellement les services sont :
# Commande A - Arrêt propre
sudo systemctl stop wikijs@stage
# Commande D - Arrêt via port
sudo fuser -k 3005/tcp
# Commande E - Arrêt forcé via port
sudo lsof -ti:3004 | xargs sudo kill -9
Vérification de l'Arrêt
# Vérifier qu'aucun service n'est encore actif
sudo systemctl status wikijs@stage
sudo systemctl status wikijs@qa
sudo systemctl status wikijs@demo
# Voir si des ports sont toujours écoutés
sudo ss -tlnp | grep node
# Vérifier les processus Node.js
ps aux | grep node
Partie 5: Prolongement (Facultatif)
Redémarrer Proprement Toutes les Instances
# Redémarrer toutes les instances en une commande
sudo systemctl restart wikijs@{stage,qa,demo}
Revoir Tous les Ports Node.js Actuellement Actifs
# Voir tous les ports Node.js en écoute
sudo lsof -iTCP -sTCP:LISTEN | grep node
Vérifier que Tous les Ports sont Bien Libérés Après un Arrêt
# Arrêter toutes les instances
sudo systemctl stop wikijs@{stage,qa,demo}
# Vérifier que les ports sont libres
sudo ss -tlnp | egrep '3003|3004|3005'
Annexe 2: Commandes Utiles pour la Gestion des Services
1. Voir Tous les Ports Actifs et les Processus Liés
| Commande | Commentaire / But |
|---|---|
sudo ss -tuln | Affiche les ports ouverts TCP/UDP (écoute), sans résolution DNS (rapide). |
sudo lsof -i -P -n | Affiche tous les ports et les programmes qui les utilisent. |
sudo lsof -i -P -n | grep node | Filtre pour ne voir que les processus Node.js. |
sudo netstat -tulnp | Ancienne commande équivalente à ss, affiche aussi les PID. |
sudo apt install net-tools | Installe netstat (nécessaire sur Ubuntu moderne). |
ps aux | grep node | Liste tous les processus contenant "node". |
sudo lsof -i :3000 | Affiche le processus qui écoute spécifiquement sur le port 3000. |
sudo apt install nmap | Installe nmap, un scanner de ports. |
sudo nmap -sT -O localhost | Scanne les ports ouverts en TCP sur la machine locale. |
2. Gestion des Services Node.js avec systemd
| Commande | Commentaire / But |
|---|---|
systemctl | grep node | Cherche les services contenant "node". |
systemctl list-units --type=service | Liste tous les services en cours. |
ls /etc/systemd/system/ | Liste les fichiers .service installés manuellement. |
sudo systemctl stop nom-du-service | Arrête proprement un service (ex: wikijs.service). |
sudo systemctl disable nom-du-service | Empêche le service de démarrer au prochain boot. |
sudo rm /etc/systemd/system/nom-du-service.service | Supprime le fichier de service. |
sudo systemctl daemon-reexec | Recharge complètement systemd. |
sudo systemctl daemon-reload | Recharge les fichiers .service. |
systemctl list-units --type=service | grep -i node | Liste les services Node.js (insensible à la casse). |
systemctl list-units --type=service | grep 3100 | Cherche les services associés au port 3100. |
sudo systemctl reset-failed | Réinitialise l'état des services en échec. |
3. Arrêt Manuel d'un Processus (si pas un service)
| Commande | Commentaire / But |
|---|---|
sudo kill 1064738 | Tente de tuer le processus (PID 1064738) proprement. |
sudo kill -9 1064738 | Tuer le processus de force (SIGKILL). |
ps -fp 1072723 | Affiche le détail du processus 1072723 (format étendu). |
sudo ls -l /proc/1072723/exe | Montre le binaire réel exécuté par le processus. |
sudo cat /proc/1072723/cmdline | tr '\0' ' ' | Affiche la commande exacte qui a lancé le processus. |
4. Détection et Arrêt des Processus Gérés par PM2
| Commande | Commentaire / But |
|---|---|
which pm2 | Vérifie si pm2 est installé. |
pm2 list | Liste les applications gérées par PM2. |
pm2 stop all | Arrête toutes les applications PM2. |
pm2 delete all | Supprime toutes les références aux applications. |
pm2 unstartup | Désactive le démarrage auto de PM2 au boot. |
5. Suppression Complète d'un Service systemd
| Commande | Commentaire / But |
|---|---|
ls /etc/systemd/system/ | grep -i wiki | Filtre les fichiers .service liés à "wiki". |
sudo systemctl stop wikijs.service | Stoppe le service avant suppression. |
sudo systemctl disable wikijs.service | Désactive le service. |
sudo rm /etc/systemd/system/wikijs.service | Supprime le fichier du service. |
sudo systemctl daemon-reload | Recharge la config systemd. |
sudo systemctl reset-failed | Réinitialise les erreurs systemd. |
systemctl list-units --type=service | grep wiki | Vérifie si le service a bien disparu. |
systemctl status wikijs.service | Vérifie si le service existe encore. |
ls -l /etc/systemd/system/ | Liste complète pour vérifier manuellement. |
grep -r ExecStart /etc/systemd/system/ | Cherche les lignes de démarrage dans tous les services. |
Annexe 3: Liste Exhaustive des Commandes
Commandes pour Voir les Ports
sudo ss -tuln
sudo lsof -i -P -n
sudo lsof -i -P -n | grep node
sudo netstat -tulnp
sudo apt install net-tools
ps aux | grep node
sudo lsof -i :3000
sudo apt install nmap
sudo nmap -sT -O localhost
Commandes systemd
systemctl | grep node
systemctl list-units --type=service
ls /etc/systemd/system/
sudo systemctl stop nom-du-service
sudo systemctl stop wikijs.service
sudo systemctl disable nom-du-service
sudo rm /etc/systemd/system/nom-du-service.service
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
systemctl | grep 3100
systemctl | grep node
sudo systemctl stop wikijs.service
Commandes kill
sudo kill 1064738
sudo kill -9 1064738
sudo ss -tuln | grep 3100
sudo lsof -i :3100
Commandes PM2
which pm2 && pm2 list
pm2 stop all
pm2 delete all
pm2 unstartup
Commandes de Diagnostic
sudo systemctl list-units --type=service | grep -i node
ps aux | grep node
ps -fp 1072723
sudo ls -l /proc/1072723/exe
sudo cat /proc/1072723/cmdline | tr '\0' ' '
ls /etc/systemd/system/ | grep -i wiki
ls /lib/systemd/system/ | grep -i wiki
grep -r 3100 /etc/systemd/system/
Commandes de Suppression
sudo systemctl stop nom.service
sudo systemctl disable nom.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
ls /etc/systemd/system/
ls /etc/systemd/system/ | grep -i wiki
sudo systemctl stop wikijs.service
sudo systemctl disable wikijs.service
sudo rm /etc/systemd/system/wikijs.service
sudo systemctl daemon-reload
sudo systemctl reset-failed
systemctl list-units --type=service | grep wiki
systemctl status wikijs.service
ls -l /etc/systemd/system/
grep -r ExecStart /etc/systemd/system/
Exercices Pratiques
Exercice 1: Créer et Démarrer les 3 Instances
- Créez les 3 instances (stage, qa, demo) en suivant les étapes ci-dessus
- Vérifiez que toutes les instances sont actives
- Vérifiez que les ports 3003, 3004, 3005 sont bien en écoute
Exercice 2: Tester les Méthodes d'Arrêt
Pour chaque méthode d'arrêt (A, B, C, D, E, F) :
- Redémarrez d'abord l'instance concernée
- Exécutez la commande d'arrêt
- Vérifiez si le service est vraiment arrêté
- Documentez le résultat dans un tableau
Exercice 3: Comparaison des Méthodes
Créez un tableau comparatif :
| Méthode | Commande | Fonctionne ? | Pourquoi ? | Recommandé ? |
|---|---|---|---|---|
| A | systemctl stop | ? | ? | ? |
| B | systemctl disable | ? | ? | ? |
| C | killall wikijs | ? | ? | ? |
| D | fuser -k port/tcp | ? | ? | ? |
| E | lsof -ti:port | xargs kill -9 | ? | ? | ? |
| F | systemctl reload | ? | ? | ? |
Questions de Réflexion
-
Pourquoi
systemctl disablene stoppe pas un service qui est déjà en cours d'exécution ?- Expliquez la différence entre
stopetdisable
- Expliquez la différence entre
-
Quels sont les risques d'utiliser
killallpour arrêter des services ?- Donnez un exemple de scénario où cela pourrait causer des problèmes
-
Pourquoi
systemctl reloadne coupe pas le service ?- Expliquez la différence entre
reloadetrestart
- Expliquez la différence entre
-
Quelle est la différence entre
killetkill -9?- Dans quels cas utiliseriez-vous chacune de ces commandes ?
-
Pourquoi utiliser un template systemd (
wikijs@.service) plutôt que créer 3 fichiers de service séparés ?- Quels sont les avantages et inconvénients de chaque approche ?
Résumé des Méthodes d'Arrêt
Méthodes Recommandées ✅
systemctl stop wikijs@instance- Arrêt propre via systemdfuser -k port/tcp- Arrêt via port (fonctionne mais moins propre)lsof -ti:port \| xargs kill -9- Arrêt forcé (dernier recours)
Méthodes à Éviter ❌
systemctl disable- Ne stoppe pas, désactive seulement au démarragesystemctl reload- Recharge la config mais ne coupe paskillall wikijs- Trop risqué, peut affecter d'autres processus
Vérification Finale
Vérifiez que vous avez réussi à :
- Créer le template systemd
wikijs@.service - Créer les 3 utilisateurs système (wikijs_stage, wikijs_qa, wikijs_demo)
- Créer les 3 répertoires et installer Wiki.js dans chacun
- Créer les 3 bases de données MariaDB
- Configurer les fichiers
config.ymlavec les bons ports - Activer et démarrer les 3 instances
- Vérifier que les ports 3003, 3004, 3005 sont en écoute
- Tester toutes les méthodes d'arrêt
- Comprendre pourquoi certaines méthodes fonctionnent et d'autres non
- Répondre aux questions de réflexion
Prochaines Étapes
- Lab 8.1: Gestion des Services systemd (révision)
- Lab 8.2: Services Personnalisés (approfondissement)
- TP 2: Reverse Proxy NGINX (pour exposer les instances via un reverse proxy)
Lab créé le: Décembre 2024