Aller au contenu principal

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 :

EnvironnementCompte LinuxDossierPortBase MariaDB
stagewikijs_stage/var/www/stage.site13003wikidb_stage
qawikijs_qa/var/www/qa.site13004wikidb_qa
demowikijs_demo/var/www/demo.site13005wikidb_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 :

  • %i est remplacé par l'instance (stage, qa, demo)
  • wikijs_%i devient wikijs_stage, wikijs_qa, wikijs_demo
  • /var/www/%i.site1 devient /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​

CommandeCommentaire / But
sudo ss -tulnAffiche les ports ouverts TCP/UDP (écoute), sans résolution DNS (rapide).
sudo lsof -i -P -nAffiche tous les ports et les programmes qui les utilisent.
sudo lsof -i -P -n | grep nodeFiltre pour ne voir que les processus Node.js.
sudo netstat -tulnpAncienne commande équivalente à ss, affiche aussi les PID.
sudo apt install net-toolsInstalle netstat (nécessaire sur Ubuntu moderne).
ps aux | grep nodeListe tous les processus contenant "node".
sudo lsof -i :3000Affiche le processus qui écoute spécifiquement sur le port 3000.
sudo apt install nmapInstalle nmap, un scanner de ports.
sudo nmap -sT -O localhostScanne les ports ouverts en TCP sur la machine locale.

2. Gestion des Services Node.js avec systemd​

CommandeCommentaire / But
systemctl | grep nodeCherche les services contenant "node".
systemctl list-units --type=serviceListe tous les services en cours.
ls /etc/systemd/system/Liste les fichiers .service installés manuellement.
sudo systemctl stop nom-du-serviceArrête proprement un service (ex: wikijs.service).
sudo systemctl disable nom-du-serviceEmpêche le service de démarrer au prochain boot.
sudo rm /etc/systemd/system/nom-du-service.serviceSupprime le fichier de service.
sudo systemctl daemon-reexecRecharge complètement systemd.
sudo systemctl daemon-reloadRecharge les fichiers .service.
systemctl list-units --type=service | grep -i nodeListe les services Node.js (insensible à la casse).
systemctl list-units --type=service | grep 3100Cherche les services associés au port 3100.
sudo systemctl reset-failedRéinitialise l'état des services en échec.

3. Arrêt Manuel d'un Processus (si pas un service)​

CommandeCommentaire / But
sudo kill 1064738Tente de tuer le processus (PID 1064738) proprement.
sudo kill -9 1064738Tuer le processus de force (SIGKILL).
ps -fp 1072723Affiche le détail du processus 1072723 (format étendu).
sudo ls -l /proc/1072723/exeMontre 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​

CommandeCommentaire / But
which pm2Vérifie si pm2 est installé.
pm2 listListe les applications gérées par PM2.
pm2 stop allArrête toutes les applications PM2.
pm2 delete allSupprime toutes les références aux applications.
pm2 unstartupDésactive le démarrage auto de PM2 au boot.

5. Suppression Complète d'un Service systemd​

CommandeCommentaire / But
ls /etc/systemd/system/ | grep -i wikiFiltre les fichiers .service liés à "wiki".
sudo systemctl stop wikijs.serviceStoppe le service avant suppression.
sudo systemctl disable wikijs.serviceDésactive le service.
sudo rm /etc/systemd/system/wikijs.serviceSupprime le fichier du service.
sudo systemctl daemon-reloadRecharge la config systemd.
sudo systemctl reset-failedRéinitialise les erreurs systemd.
systemctl list-units --type=service | grep wikiVérifie si le service a bien disparu.
systemctl status wikijs.serviceVé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​

  1. Créez les 3 instances (stage, qa, demo) en suivant les étapes ci-dessus
  2. Vérifiez que toutes les instances sont actives
  3. 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) :

  1. Redémarrez d'abord l'instance concernée
  2. Exécutez la commande d'arrêt
  3. Vérifiez si le service est vraiment arrêté
  4. Documentez le résultat dans un tableau

Exercice 3: Comparaison des Méthodes​

Créez un tableau comparatif :

MéthodeCommandeFonctionne ?Pourquoi ?Recommandé ?
Asystemctl stop???
Bsystemctl disable???
Ckillall wikijs???
Dfuser -k port/tcp???
Elsof -ti:port | xargs kill -9???
Fsystemctl reload???

Questions de Réflexion​

  1. Pourquoi systemctl disable ne stoppe pas un service qui est déjà en cours d'exécution ?

    • Expliquez la différence entre stop et disable
  2. Quels sont les risques d'utiliser killall pour arrêter des services ?

    • Donnez un exemple de scénario où cela pourrait causer des problèmes
  3. Pourquoi systemctl reload ne coupe pas le service ?

    • Expliquez la différence entre reload et restart
  4. Quelle est la différence entre kill et kill -9 ?

    • Dans quels cas utiliseriez-vous chacune de ces commandes ?
  5. 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 ✅​

  1. systemctl stop wikijs@instance - Arrêt propre via systemd
  2. fuser -k port/tcp - Arrêt via port (fonctionne mais moins propre)
  3. lsof -ti:port \| xargs kill -9 - Arrêt forcé (dernier recours)

Méthodes à Éviter ❌​

  1. systemctl disable - Ne stoppe pas, désactive seulement au démarrage
  2. systemctl reload - Recharge la config mais ne coupe pas
  3. killall 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.yml avec 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