mirror of
https://github.com/buchtioof/notes.git
synced 2026-05-02 17:43:28 +02:00
update grabber doc + nouvelles note: stage
This commit is contained in:
parent
1d7a4eeebf
commit
b3eb114b4b
@ -26,13 +26,13 @@ Le projet en général se basera sur du Bash et du Python pour gérer l'API et l
|
|||||||
|
|
||||||
Les scripts Bash se contenteront de "fetch" les données système *(via des commandes comme lscpu ou la librairie inxi)*. Ils auront aussi le rôle d'empaqueter ces données en format JSON *(via jq)* à un serveur qui les enregistrera dans une BDD. Et enfin, ils seront un peu l'agent qui contrôle la machine via des contrôles du systeme (vérif. admin, réglages du serveur, lanceur du serveur...)
|
Les scripts Bash se contenteront de "fetch" les données système *(via des commandes comme lscpu ou la librairie inxi)*. Ils auront aussi le rôle d'empaqueter ces données en format JSON *(via jq)* à un serveur qui les enregistrera dans une BDD. Et enfin, ils seront un peu l'agent qui contrôle la machine via des contrôles du systeme (vérif. admin, réglages du serveur, lanceur du serveur...)
|
||||||
|
|
||||||
### -> *Python (Django)*
|
### -> *Python (Django + Gunicorn + Whitenoise)*
|
||||||
|
|
||||||
Son rôle (serveur) sera de recevoir d'abord ces données brutes en format JSON et les enregistrer dans une BDD SQLite. De plus, Django sera un bon choix pour gérer le panel Admin puisqu'il ne requiert pas plus de réglages/sécurités supplémentaires, ces outils viennent tout prêts et ne nécessitent qu'une simple installation via pip.
|
Django s'occupera de traiter les données brutes du script Bash et les enregistrer dans une BDD. De plus, il s'occupera de la logique du panel Admin via ses outil préfabriqués. Pour servir notre app Django en production, on utilise la dépendance Gunicorn qui pourra gérer le multi-tâches via des "Workers" et tenir les standards d'une webapp classique. Gunicorn sera accompagné de Whitenoise, un outil en plus qui gèrera les fichiers statiques (CSS/JS) que ne gère pas nativement Gunicorn.
|
||||||
|
|
||||||
### -> *SQLite*
|
### -> *SQLite*
|
||||||
|
|
||||||
Choisir cette BDD est pour sa simplicité, elle est stockée en local, ne nécessite elle non plus d'aucun déploiment/préparations spécifiques et est déjà prête a l'emploi avec Django.
|
Pour le moment, SQLite est le meilleur choix pour sa simplicité et sa taille minimale, elle est stockée en local, ne nécessite pas plus de préparations spécifiques car déjà prête à l'emploi avec Django.
|
||||||
|
|
||||||
## Architecture technique
|
## Architecture technique
|
||||||
|
|
||||||
@ -46,9 +46,11 @@ Ce script aura un rôle majeur dans le projet, il sera le chef d'orchestre du se
|
|||||||
|
|
||||||
-> Gérer les dépendances requises (fonction requirements qui vérifie si l'hôte a bien les requis tels que jq, sqlite3 et python)
|
-> Gérer les dépendances requises (fonction requirements qui vérifie si l'hôte a bien les requis tels que jq, sqlite3 et python)
|
||||||
|
|
||||||
|
-> Génère si besoin les clés SSH nécessaires pour sécuriser la connexion de l'API
|
||||||
|
|
||||||
-> Vérifier la présence d'un compte super-user dans Django (important pour se logger au panel Admin, via le lancement d'un script Python "lib/check_admin.py")
|
-> Vérifier la présence d'un compte super-user dans Django (important pour se logger au panel Admin, via le lancement d'un script Python "lib/check_admin.py")
|
||||||
|
|
||||||
-> Adapter le serveur au besoins (via un fichier de configuration sommaire : settings.json)
|
-> Collecte les fichiers statiques depuis un dossier "static" afin de préparer le CSS pour Whitenoise
|
||||||
|
|
||||||
-> Automatiser le processus de "migrations" (python manage.py migrate)
|
-> Automatiser le processus de "migrations" (python manage.py migrate)
|
||||||
|
|
||||||
@ -82,13 +84,21 @@ Pour déployer Alfred sur une machine, on utilisera SSH pour envoyer le script d
|
|||||||
|
|
||||||
Pour se faire, on délègue celle-ci à Python avec Django qui l'effectuera avec un formulaire qui contient l'IP sur laquelle aller, le username et le mot de passe du SSH cible.
|
Pour se faire, on délègue celle-ci à Python avec Django qui l'effectuera avec un formulaire qui contient l'IP sur laquelle aller, le username et le mot de passe du SSH cible.
|
||||||
|
|
||||||
|
!!!warning
|
||||||
|
|
||||||
|
Puisque l'IP envoyée à la machine cible est récupérée via **request.get_host()**, l'administrateur doit impérativement accéder au panel Admin de Grabber via l'adresse IP réseau de la machine (ex: 192.168.x.x:8000) et non via localhost:8000. Sinon, le PC cible tentera d'envoyer ses données à son propre localhost et la base de données restera vide.
|
||||||
|
|
||||||
##### Requête avec Paramiko
|
##### Requête avec Paramiko
|
||||||
|
|
||||||
C'est la solution trouvée pour gérer cette demande, Paramiko est une librairie Python installable avec pip qui peut établir la session SSH et le fera depuis le backend Django (dans views.py -> fonction deploy_ssh)
|
C'est la solution trouvée pour gérer cette demande, Paramiko est une librairie Python installable avec pip qui peut établir la session SSH et le fera depuis le backend Django (dans actions.py -> fonction deploy_ssh)
|
||||||
|
|
||||||
Le cycle de la requête est le suivant :
|
Le cycle de la requête est le suivant :
|
||||||
|
|
||||||
-> Connexion SSH à la cible.
|
-> Connexion SSH à la cible.
|
||||||
|
(Via la clé SSH d'abord, puis si refus, via les identifiants donnés par l'utilisateur)
|
||||||
|
|
||||||
|
-> Si l'authentification via la clé n'a pas fonctionné,
|
||||||
|
on envoie notre clé SSH hôte sur la machine distante
|
||||||
|
|
||||||
-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.
|
-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.
|
||||||
|
|
||||||
@ -97,17 +107,33 @@ Le cycle de la requête est le suivant :
|
|||||||
|
|
||||||
-> Nettoyage des traces (rm /tmp/alfred.run).
|
-> Nettoyage des traces (rm /tmp/alfred.run).
|
||||||
|
|
||||||
#### Protection de l'API avec un "Secret Partagé"
|
#### Protection de l'API avec un Token d'Authentification (SESSION_TOKEN)
|
||||||
|
|
||||||
Comme dit plus tôt, grabber.sh génère un token de session (SESSION_TOKEN avec la commande "openssl rand") à chaque lancement de grabber.sh, puis ce token est stockée dans settings.json pendant la session et se reset à la fermeture de la session (commande trap qui lance la fonction cleanup).
|
!!!info
|
||||||
|
|
||||||
Ce token lui est stocké dans une variable Python depuis les settings.py qui se charge de lire les settings.json, fetch la clé et la stocke.
|
Ne faut pas confondre ce token destiné aux communications inter-machines avec les sessions administrateurs du panel web, qui sont elles gérées directement par la base de données SQLite.
|
||||||
|
|
||||||
Enfin, lorsqu'une requête par Alfred est émise, Django vérifie cette clé d'abord dans api.py. Il fetch la clé dans la requête curl et la range dans une variable *key* puis teste si le token est correspondant à celui dans les settings.json. Si c'est bon, tout va bien, sinon il indique l'erreur avec la clé.
|
Comme dit plus tôt, `grabber.sh` génère un token unique (faisant office de clé d'API) avec la commande `openssl rand` à chaque lancement du serveur. Ce token est temporairement stocké dans `settings.json` et est automatiquement réinitialisé à la fermeture du script (via la commande `trap` qui lance la fonction `cleanup`).
|
||||||
|
|
||||||
##### Panel Admin (Django)
|
Du côté serveur, lors du démarrage de l'application par Gunicorn, le fichier `config/settings.py` se charge de lire `settings.json` et de charger cette clé en mémoire dans la variable globale `SESSION_TOKEN`.
|
||||||
|
|
||||||
Enfin, le Panel Admin. Fonctionne avec Django, il part du modèle de données (models.py) et présente dans une interface HTML/CSS/JS la table SystemInfo avec l'adresse MAC comme clé principale pour chaque PC. Le tout est sécurisé avec le login admin de Django.
|
Enfin, lorsqu'une requête est émise par **Alfred**, Django intercepte et vérifie cette clé via la vue dédiée dans `web/api.py`. Il extrait la clé envoyée de manière sécurisée dans les en-têtes HTTP de la requête `curl` (précisément le header `HTTP_X_API_KEY`) et la compare avec celle en mémoire. Si les clés correspondent, les données matérielles sont traitées, sinon, la connexion est immédiatement rejetée avec une erreur 401 (Accès refusé).
|
||||||
|
|
||||||
|
#### Panel Admin
|
||||||
|
|
||||||
|
Il est une partie de l'app Django et présente dans une interface HTML/CSS/JS, une liste des ordinateurs enregistrés, la table SystemInfo avec l'adresse MAC comme clé principale pour chaque PC. Le tout est sécurisé avec le login admin de Django.
|
||||||
|
|
||||||
|
##### Gestion des "employés"
|
||||||
|
|
||||||
|
Via un petit modal, il est possible d'administrer en plus des ordinateurs, une BDD d'employés (stockée dans la même BDD SQLite) et d'y effectuer des tâches basiques comme créer un employé, le supprimer, l'éditer et l'assigner à un ordinateur depuis la page d'un PC.
|
||||||
|
|
||||||
|
##### Gestion des sessions
|
||||||
|
|
||||||
|
Pour gérer les sessions sur le Panel et éviter que les administrateurs soient déconnectés en naviguant (problème lié à la séparation des mémoires des différents workers de Gunicorn), le système de session de Django a été configuré pour être stocké directement dans la base de données SQLite (SESSION_ENGINE = "django.contrib.sessions.backends.db").
|
||||||
|
|
||||||
|
##### Design
|
||||||
|
|
||||||
|
Le CSS et le design utilisent la librairie Tailwind en mode CLI. Concrètement, on télécharge la librairie en local pour travailler avec, on la lance via une commande qui surveille "watch" les modifications, puis lorsque l'on a fini, on empaquete notre CSS avec le strict necessaire "minify". [En savoir plus](https://tailwindcss.com/docs/installation/tailwind-cli)
|
||||||
|
|
||||||
## Vue d'ensemble du projet et Conclusions (Projet à finir avant)
|
## Vue d'ensemble du projet et Conclusions (Projet à finir avant)
|
||||||
|
|
||||||
|
|||||||
73
docs/projects/stage/2026-03-03.md
Normal file
73
docs/projects/stage/2026-03-03.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
Tout d'abord, nous définissons les premiers jours ce que nous allons concrètement faire comme projet, l'entreprise à un besoin spécifique :
|
||||||
|
|
||||||
|
## Définition du projet
|
||||||
|
|
||||||
|
**Objectif :** Concevoir et déployer une solution d'infrastructure réseau et de stockage "clé en main" pour une TPE. Le système offre les capacités d'un NAS professionnel sécurisé, entièrement administrable via une interface web intuitive, sans nécessiter de compétences en ligne de commande pour l'utilisateur final.
|
||||||
|
|
||||||
|
## 1. Infrastructure et Réseau (Virtualisation)
|
||||||
|
* **Hyperviseur :** Serveur physique sous **Proxmox VE** pour la gestion des ressources.
|
||||||
|
* **Sécurité Périmétrique :** Machine virtuelle **pfSense** gérant le routage, le pare-feu, le DHCP et le DNS local.
|
||||||
|
* **Serveur Applicatif :** Machine virtuelle **Debian** isolée derrière pfSense, avec accès direct aux ports USB physiques (passthrough) pour les sauvegardes.
|
||||||
|
|
||||||
|
## 2. Architecture Logicielle (Stack Technique)
|
||||||
|
* **Système & Monitoring (C) :** Développement d'un daemon interagissant avec le noyau pour remonter les métriques de santé (CPU, RAM, SMART) et détecter le branchement de périphériques de stockage (événements `udev`).
|
||||||
|
* **Backend & API (Python) :** Création d'une API REST (FastAPI/Flask) qui traduit les requêtes web en commandes d'administration système (création d'utilisateurs, modification de `/etc/samba/smb.conf`, gestion des quotas).
|
||||||
|
* **Interface Web (JavaScript) :** Développement d'un tableau de bord (React ou Vue.js) permettant de piloter le serveur et de visualiser son état en temps réel.
|
||||||
|
* **Automatisation (Bash / Ansible) :** Scripts de déploiement "Zero Touch" pour l'installation complète de l'environnement, et scripts `rsync` pour les sauvegardes automatisées.
|
||||||
|
|
||||||
|
## 3. Enjeux DevOps et SecOps
|
||||||
|
* **Déploiement Reproductible :** Industrialisation de l'installation de la VM Debian et de l'ensemble de la pile logicielle.
|
||||||
|
* **Durcissement (Hardening) :** Cloisonnement strict du réseau via pfSense, sécurisation locale avec `nftables`, et principe de moindre privilège appliqué à l'API Python (via une configuration `sudoers` restreinte).
|
||||||
|
|
||||||
|
## Planification du projet
|
||||||
|
|
||||||
|
### Phase 1 : Cadrage, Socle Technique & Infrastructure
|
||||||
|
*Mise en place de l'environnement matériel, réseau et validation des concepts de base.*
|
||||||
|
|
||||||
|
* **Infrastructure et Virtualisation :**
|
||||||
|
* Installation et configuration d'un hyperviseur **Proxmox VE** sur la machine physique hôte.
|
||||||
|
* Déploiement d'une machine virtuelle **pfSense** pour gérer le routage, le service DHCP, le DNS local et le pare-feu en amont de l'infrastructure.
|
||||||
|
* Création de la VM "OfficeBox" (Debian Server) isolée derrière le pfSense, avec configuration des adresses IP statiques.
|
||||||
|
* **Architecture logicielle :** * Définition des standards de code, choix des versions (Python, C, Node/JS) et élaboration des contrats d'API (Endpoints REST).
|
||||||
|
* **Preuve de concept (POC) :** * Test manuel de configuration Samba et Rsync sur la VM Debian.
|
||||||
|
* Test du "passthrough" USB sous Proxmox pour s'assurer que la VM Debian détecte bien les périphériques physiques branchés au serveur.
|
||||||
|
|
||||||
|
### Phase 2 : Développement "Bottom-Up" (Briques indépendantes)
|
||||||
|
*Création des composants logiciels isolés.*
|
||||||
|
|
||||||
|
* **Brique Système & Backend (Dev A) :**
|
||||||
|
* Développement de l'API REST en Python (FastAPI ou Flask).
|
||||||
|
* Création des fonctions d'interaction système : ajout d'utilisateurs (`useradd`), modification dynamique de `/etc/samba/smb.conf`, gestion des quotas de stockage et redémarrage des services.
|
||||||
|
* **Brique Bas Niveau & Hardware (Dev B) :**
|
||||||
|
* Développement du Daemon en langage C (service systemd).
|
||||||
|
* Extraction des métriques de santé de la VM (CPU, RAM, I/O disques via `/proc` et `sysfs`).
|
||||||
|
* Implémentation de l'écoute des événements `udev` pour déclencher automatiquement les scripts Bash de sauvegarde (Rsync) lors de la détection d'un montage USB.
|
||||||
|
|
||||||
|
### Phase 3 : Interface Utilisateur et Intégration
|
||||||
|
*Création du frontend et connexion de tous les modules.*
|
||||||
|
|
||||||
|
* **Brique Frontend (Dev B ou A) :**
|
||||||
|
* Maquettage et développement de l'interface d'administration (React ou Vue.js).
|
||||||
|
* Implémentation du Dashboard de santé, du panneau de gestion des utilisateurs et du panneau de gestion des partages réseau.
|
||||||
|
* **Intégration API / Daemon / Front (Dev A et B) :**
|
||||||
|
* Communication inter-processus : le Daemon C remonte les métriques et alertes (ex: fin de sauvegarde) à l'API Python.
|
||||||
|
* Consommation de l'API Python par l'interface web pour un affichage en temps réel.
|
||||||
|
|
||||||
|
### Phase 4 : Industrialisation DevOps & Sécurité
|
||||||
|
*Automatisation du déploiement et durcissement du système.*
|
||||||
|
|
||||||
|
* **Scripting de déploiement (Zero Touch) :** * Création d'un playbook Ansible ou d'un script Bash d'amorçage pour automatiser l'installation complète de l'application sur une VM Debian vierge (dépendances, compilation du C, services, serveurs web).
|
||||||
|
* **Sécurité & Hardening (SecOps) :**
|
||||||
|
* Configuration stricte du pare-feu pfSense (règles NAT/Rules) et du pare-feu local de la VM (`nftables` / `ufw`).
|
||||||
|
* Isolation des privilèges : exécution de l'API via un utilisateur non-root avec des permissions `sudoers` granulaires (limitation stricte aux commandes nécessaires).
|
||||||
|
|
||||||
|
### Phase 5 : Tests Grandeur Nature, Recette et Documentation
|
||||||
|
*Validation finale et préparation des livrables.*
|
||||||
|
|
||||||
|
* **Tests End-to-End :** * Re-déploiement complet automatisé sur une VM vierge.
|
||||||
|
* Scénarios de tests réels : simulation d'attaques basiques (pour tester pfSense), montage/démontage de disques USB physiques, tests de charge réseau via les partages Samba.
|
||||||
|
* **Livrables et Documentation :** * Rédaction du README technique et de la documentation de l'API.
|
||||||
|
* Création des schémas d'architecture réseau (Proxmox/pfSense/VM).
|
||||||
|
* Rédaction du manuel utilisateur simplifié destiné aux employés de la TPE.
|
||||||
35
docs/projects/stage/2026-03-09.md
Normal file
35
docs/projects/stage/2026-03-09.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
## 1. Installation du Routeur pfSense (Machine Virtuelle)
|
||||||
|
* **Préparation :** Décompression de l'image `.iso.gz` en `.iso`.
|
||||||
|
* **Création VM :** Installation avec format de disque Auto (ZFS).
|
||||||
|
* **Attribution des interfaces (Proxmox) :** * `vmbr1` (Lié à la carte physique branchée au mur) ➔ **WAN** de pfSense.
|
||||||
|
* `vmbr0` (Réseau local interne) ➔ **LAN** de pfSense.
|
||||||
|
|
||||||
|
## 2. Configuration du Réseau Local (LAN) & Résolution de conflit
|
||||||
|
*L'objectif était de séparer le réseau de la résidence (10.x.x.x) de notre réseau privé.*
|
||||||
|
* **Adressage LAN :** Changement de l'IP du LAN pfSense (via sa console) en **192.168.10.1/24**.
|
||||||
|
* **Serveur DHCP :** Activation sur pfSense (plage `192.168.10.50` à `192.168.10.200`) pour attribuer automatiquement des IP aux futures VMs et aux PC physiques branchés au serveur.
|
||||||
|
|
||||||
|
## 3. Configuration Réseau de Proxmox (L'Hyperviseur)
|
||||||
|
*Modification physique du fichier `/etc/network/interfaces` pour l'aligner sur le nouveau LAN.*
|
||||||
|
* **Interface LAN (`vmbr0`) :** Attribution de l'IP statique **192.168.10.2/24** avec **192.168.10.1** comme passerelle (gateway).
|
||||||
|
* **Interface WAN (`vmbr1`) :** Passage en mode manuel **sans aucune IP ni passerelle** pour empêcher Proxmox d'être exposé directement au réseau du bâtiment.
|
||||||
|
|
||||||
|
## 4. Déblocage de l'accès Internet (WAN & Portail Captif)
|
||||||
|
* **Pare-feu pfSense :** Désactivation des sécurités **Block private networks** et **Block bogon networks** sur l'interface WAN pour autoriser l'IP `10.x.x.x` fournie par la résidence.
|
||||||
|
* **Authentification :** Depuis un PC connecté au LAN, navigation vers `http://neverssl.com` pour déclencher et valider la page de connexion (Portail Captif) de la résidence.
|
||||||
|
|
||||||
|
## 5. Accès Distant Sécurisé (Tailscale & Subnet Routing)
|
||||||
|
*Contournement de la sécurité "Client Isolation" du réseau Wi-Fi de la résidence.*
|
||||||
|
* **Installation :** Ajout du paquet Tailscale sur pfSense et connexion via une clé d'authentification (Auth Key).
|
||||||
|
* **Règle Pare-feu :** Création d'une règle *Pass All* (tout autoriser) sur la nouvelle interface Tailscale dans pfSense.
|
||||||
|
* **Subnet Routing :** * Déclaration du réseau **192.168.10.0/24** dans les *Advertised Routes* des paramètres Tailscale de pfSense.
|
||||||
|
* Approbation manuelle de cette route sur le panel d'administration web de Tailscale.
|
||||||
|
* **Bénéfice :** Accès global à `https://192.168.10.1` (pfSense) et `https://192.168.10.2:8006` (Proxmox) depuis n'importe où, sans câble.
|
||||||
|
|
||||||
|
## 6. Création et Configuration de la VM Debian (Serveur)
|
||||||
|
* **Optimisation Proxmox :** Création de la VM avec type CPU `Host`, contrôleur `VirtIO SCSI single`, disque avec option `Discard` (TRIM), et carte réseau `VirtIO (paravirtualized)` sur le bridge `vmbr0`.
|
||||||
|
* **Installation OS :** Installation minimale (sans interface graphique) avec uniquement l'option **SSH server** cochée.
|
||||||
|
* **IP Fixe (Static Mapping) :** Sur pfSense (*Services > DHCP Server > LAN*), réservation d'une adresse IP fixe hors plage dynamique (ex: **192.168.10.100**) liée à l'adresse MAC virtuelle de la VM Debian.
|
||||||
|
* **Accès Final :** Connexion SSH réussie depuis l'extérieur en utilisant l'IP locale `192.168.10.100` grâce au routage Tailscale.
|
||||||
62
docs/projects/stage/projet.md
Normal file
62
docs/projects/stage/projet.md
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# Spécification de Projet : "GrabberBoxTea"
|
||||||
|
**Solution d'Infrastructure "Clé en Main" pour TPE**
|
||||||
|
|
||||||
|
## Contexte et Objectif
|
||||||
|
Pour une TPE qui a des besoins sysops spécifiques mais voulant garder un controle total de leurs données sans avoir à dépendre d'outils externes (ex. Google, AWS)
|
||||||
|
|
||||||
|
L'entreprise a des besoins spécifiques tels que :
|
||||||
|
- Accéder aux données de l'entreprise partout à l'intérieur comme à l'extérieur de l'entreprise
|
||||||
|
- Donner des accès spécifiques à des monteurs freelances, dans le cadre d'une amélioration de la communication
|
||||||
|
- Pouvoir manager le serveur via une interface simple et accessible (Pas de DSI, gestion par les employés, niveau confirmé)
|
||||||
|
- BONUS: Avoir des outils de travaux collaboratifs intégrés au cloud pour éditer des données partout (ex. Comptabilité,...)
|
||||||
|
|
||||||
|
## Architecture Technique
|
||||||
|
Le système repose sur une architecture en couches distinctes, exploitant des langages spécifiques pour chaque niveau de responsabilité :
|
||||||
|
|
||||||
|
* **Linux (Base Système) :** Système d'exploitation hôte (ex: Debian ou Alpine). Gestion avancée du partitionnement (LVM), durcissement de la sécurité (Hardening) et gestion des droits utilisateurs.
|
||||||
|
* **Bash (Provisioning & Automatisation) :** Scripts d'installation "Zero Touch". Responsable du déploiement initial, de la configuration réseau et de l'installation des dépendances.
|
||||||
|
* **C (Daemon de Monitoring) :** Développement d'un service systemd léger. Il interagit directement avec le noyau pour surveiller l'intégrité matérielle (SMART, température) et système (intégrité des fichiers critiques) avec une empreinte ressource minimale.
|
||||||
|
* **Python (Backend & Orchestration) :** API REST (Flask/FastAPI). Elle agit comme passerelle entre l'interface utilisateur et les commandes système, gérant la logique métier et l'exécution sécurisée des tâches administratives.
|
||||||
|
* **JavaScript (Frontend) :** Interface d'administration web (Dashboard). Permet à l'utilisateur final de piloter le serveur graphiquement.
|
||||||
|
|
||||||
|
## Fonctionnalités Clés
|
||||||
|
|
||||||
|
### A. Gestion du Stockage (Module Python/Bash)
|
||||||
|
* Configuration dynamique du serveur de fichiers (Samba/NFS) via l'interface web.
|
||||||
|
* Gestion des utilisateurs et attribution de quotas de stockage.
|
||||||
|
* Modification automatisée des fichiers de configuration (`/etc/samba/smb.conf`) et rechargement des services à la volée.
|
||||||
|
|
||||||
|
### B. Sauvegarde Automatisée sur Événement (Module C/Bash)
|
||||||
|
* Système de détection matériel : le daemon en **C** écoute les événements `udev` pour détecter la connexion de périphériques USB spécifiques.
|
||||||
|
* Déclenchement automatique d'un script de synchronisation (**Bash/Rsync**) lors du montage du disque.
|
||||||
|
* Remontée du statut de la sauvegarde vers l'API.
|
||||||
|
|
||||||
|
### C. Tableau de Bord de Santé (Module C/JS)
|
||||||
|
* Visualisation en temps réel des métriques vitales (CPU, RAM, I/O Disque).
|
||||||
|
* Lecture optimisée des pseudo-systèmes de fichiers `/proc` et `/sys` par le module C pour une latence minimale.
|
||||||
|
|
||||||
|
## 4. Dimension DevOps et Administration Système
|
||||||
|
Le projet intègre les meilleures pratiques d'ingénierie système :
|
||||||
|
|
||||||
|
1. **Packaging et Déploiement :** Livraison sous forme de script d'installation global ou d'image système pré-configurée (ISO). Utilisation possible d'Ansible pour la configuration initiale.
|
||||||
|
2. **Sécurité (SecOps) :** Configuration de pare-feu (`nftables`), isolation des processus, et mise en place de HTTPS automatisé.
|
||||||
|
3. **Conteneurisation :** Isolation possible des briques applicatives (Web/API) via Docker, tout en maintenant les accès privilégiés nécessaires à l'administration de l'hôte.
|
||||||
|
|
||||||
|
## 5. Flux Opérationnel (Workflow)
|
||||||
|
|
||||||
|
1. **Installation :** L'administrateur exécute le script Bash d'initialisation sur un serveur vierge. Le système est opérationnel en quelques minutes.
|
||||||
|
2. **Configuration :** L'utilisateur se connecte au Dashboard Web local.
|
||||||
|
3. **Action :** Une demande (ex: "Créer un partage 'Compta'") est envoyée par le Frontend (JS).
|
||||||
|
4. **Exécution :** L'API (Python) valide la requête et orchestre les commandes système nécessaires.
|
||||||
|
5. **Utilisation :** Les postes clients (Windows/Mac) détectent immédiatement le nouveau volume réseau sécurisé.
|
||||||
|
|
||||||
|
## 6. Récapitulatif de la Stack Technologique
|
||||||
|
|
||||||
|
| Composant | Technologie | Rôle Principal |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| **OS** | Debian 12 / Alpine | Base stable et sécurisée. |
|
||||||
|
| **Infrastructure** | Bash + Ansible | Provisioning et maintenance. |
|
||||||
|
| **Backend API** | Python (FastAPI) | Logique métier et interface système. |
|
||||||
|
| **Système** | **Langage C** | Monitoring bas niveau et gestion I/O. |
|
||||||
|
| **Frontend** | Vue.js / React | Interface Homme-Machine (IHM). |
|
||||||
|
| **Protocoles** | Samba (SMB) / NFS | Partage de fichiers hétérogène. |
|
||||||
@ -76,6 +76,9 @@ nav:
|
|||||||
- 🎨 Frontend :
|
- 🎨 Frontend :
|
||||||
- learn/frontend/2026-02-21.md
|
- learn/frontend/2026-02-21.md
|
||||||
- Projets:
|
- Projets:
|
||||||
|
- Stage:
|
||||||
|
- projects/stage/2026-03-03.md
|
||||||
|
- projects/stage/2026-03-09.md
|
||||||
- projects/2025-12-05.md
|
- projects/2025-12-05.md
|
||||||
- projects/2026-01-23.md
|
- projects/2026-01-23.md
|
||||||
- projects/2026-02-13.md
|
- projects/2026-02-13.md
|
||||||
|
|||||||
111
site/404.html
111
site/404.html
@ -1290,6 +1290,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="/projects/2025-12-05/" class="md-nav__link">
|
<a href="/projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
111
site/index.html
111
site/index.html
@ -1356,6 +1356,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="projects/2025-12-05/" class="md-nav__link">
|
<a href="projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1313,6 +1313,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1462,6 +1462,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1434,6 +1434,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1313,6 +1313,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
<link rel="prev" href="../../python/2026-02-16/">
|
<link rel="prev" href="../../python/2026-02-16/">
|
||||||
|
|
||||||
|
|
||||||
<link rel="next" href="../../../projects/2025-12-05/">
|
<link rel="next" href="../../../projects/stage/2026-03-03/">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1428,6 +1428,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1313,6 +1313,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1440,6 +1440,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1412,6 +1412,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1373,6 +1373,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1434,6 +1434,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1406,6 +1406,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1384,6 +1384,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1315,6 +1315,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1375,6 +1375,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1397,6 +1397,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1315,6 +1315,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../../../../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
<a href="../../../../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1297,6 +1297,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../projects/stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../projects/stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../projects/2025-12-05/" class="md-nav__link">
|
<a href="../projects/2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="prev" href="../../learn/frontend/2026-02-21/">
|
<link rel="prev" href="../stage/2026-03-09/">
|
||||||
|
|
||||||
|
|
||||||
<link rel="next" href="../2026-01-23/">
|
<link rel="next" href="../2026-01-23/">
|
||||||
@ -1303,6 +1303,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item md-nav__item--active">
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
||||||
@ -1425,10 +1536,10 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#-python-django" class="md-nav__link">
|
<a href="#-python-django-gunicorn-whitenoise" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
-> Python (Django)
|
-> Python (Django + Gunicorn + Whitenoise)
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@ -1526,22 +1637,55 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#protection-de-lapi-avec-un-secret-partage" class="md-nav__link">
|
<a href="#protection-de-lapi-avec-un-token-dauthentification-session_token" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
Protection de l'API avec un "Secret Partagé"
|
Protection de l'API avec un Token d'Authentification (SESSION_TOKEN)
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<nav class="md-nav" aria-label="Protection de l'API avec un "Secret Partagé"">
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#panel-admin" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Panel Admin
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<nav class="md-nav" aria-label="Panel Admin">
|
||||||
<ul class="md-nav__list">
|
<ul class="md-nav__list">
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#panel-admin-django" class="md-nav__link">
|
<a href="#gestion-des-employes" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
Panel Admin (Django)
|
Gestion des "employés"
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#gestion-des-sessions" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Gestion des sessions
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#design" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Design
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@ -1830,10 +1974,10 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#-python-django" class="md-nav__link">
|
<a href="#-python-django-gunicorn-whitenoise" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
-> Python (Django)
|
-> Python (Django + Gunicorn + Whitenoise)
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@ -1931,22 +2075,55 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#protection-de-lapi-avec-un-secret-partage" class="md-nav__link">
|
<a href="#protection-de-lapi-avec-un-token-dauthentification-session_token" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
Protection de l'API avec un "Secret Partagé"
|
Protection de l'API avec un Token d'Authentification (SESSION_TOKEN)
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<nav class="md-nav" aria-label="Protection de l'API avec un "Secret Partagé"">
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#panel-admin" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Panel Admin
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<nav class="md-nav" aria-label="Panel Admin">
|
||||||
<ul class="md-nav__list">
|
<ul class="md-nav__list">
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="#panel-admin-django" class="md-nav__link">
|
<a href="#gestion-des-employes" class="md-nav__link">
|
||||||
<span class="md-ellipsis">
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
Panel Admin (Django)
|
Gestion des "employés"
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#gestion-des-sessions" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Gestion des sessions
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#design" class="md-nav__link">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
Design
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@ -2047,18 +2224,19 @@
|
|||||||
<p>Le projet en général se basera sur du Bash et du Python pour gérer l'API et le panel Admin.</p>
|
<p>Le projet en général se basera sur du Bash et du Python pour gérer l'API et le panel Admin.</p>
|
||||||
<h3 id="-bash">-> <em>Bash</em></h3>
|
<h3 id="-bash">-> <em>Bash</em></h3>
|
||||||
<p>Les scripts Bash se contenteront de "fetch" les données système <em>(via des commandes comme lscpu ou la librairie inxi)</em>. Ils auront aussi le rôle d'empaqueter ces données en format JSON <em>(via jq)</em> à un serveur qui les enregistrera dans une BDD. Et enfin, ils seront un peu l'agent qui contrôle la machine via des contrôles du systeme (vérif. admin, réglages du serveur, lanceur du serveur...)</p>
|
<p>Les scripts Bash se contenteront de "fetch" les données système <em>(via des commandes comme lscpu ou la librairie inxi)</em>. Ils auront aussi le rôle d'empaqueter ces données en format JSON <em>(via jq)</em> à un serveur qui les enregistrera dans une BDD. Et enfin, ils seront un peu l'agent qui contrôle la machine via des contrôles du systeme (vérif. admin, réglages du serveur, lanceur du serveur...)</p>
|
||||||
<h3 id="-python-django">-> <em>Python (Django)</em></h3>
|
<h3 id="-python-django-gunicorn-whitenoise">-> <em>Python (Django + Gunicorn + Whitenoise)</em></h3>
|
||||||
<p>Son rôle (serveur) sera de recevoir d'abord ces données brutes en format JSON et les enregistrer dans une BDD SQLite. De plus, Django sera un bon choix pour gérer le panel Admin puisqu'il ne requiert pas plus de réglages/sécurités supplémentaires, ces outils viennent tout prêts et ne nécessitent qu'une simple installation via pip.</p>
|
<p>Django s'occupera de traiter les données brutes du script Bash et les enregistrer dans une BDD. De plus, il s'occupera de la logique du panel Admin via ses outil préfabriqués. Pour servir notre app Django en production, on utilise la dépendance Gunicorn qui pourra gérer le multi-tâches via des "Workers" et tenir les standards d'une webapp classique. Gunicorn sera accompagné de Whitenoise, un outil en plus qui gèrera les fichiers statiques (CSS/JS) que ne gère pas nativement Gunicorn.</p>
|
||||||
<h3 id="-sqlite">-> <em>SQLite</em></h3>
|
<h3 id="-sqlite">-> <em>SQLite</em></h3>
|
||||||
<p>Choisir cette BDD est pour sa simplicité, elle est stockée en local, ne nécessite elle non plus d'aucun déploiment/préparations spécifiques et est déjà prête a l'emploi avec Django.</p>
|
<p>Pour le moment, SQLite est le meilleur choix pour sa simplicité et sa taille minimale, elle est stockée en local, ne nécessite pas plus de préparations spécifiques car déjà prête à l'emploi avec Django.</p>
|
||||||
<h2 id="architecture-technique">Architecture technique</h2>
|
<h2 id="architecture-technique">Architecture technique</h2>
|
||||||
<h3 id="chef-du-service-grabbersh">Chef du service : <em>grabber.sh</em></h3>
|
<h3 id="chef-du-service-grabbersh">Chef du service : <em>grabber.sh</em></h3>
|
||||||
<p>Ce script aura un rôle majeur dans le projet, il sera le chef d'orchestre du service et se chargera de gérer le panel admin et le serveur Django ainsi que l'environnement Python et d'être le centre des commandes en sécurisant le service avec un token dynamique</p>
|
<p>Ce script aura un rôle majeur dans le projet, il sera le chef d'orchestre du service et se chargera de gérer le panel admin et le serveur Django ainsi que l'environnement Python et d'être le centre des commandes en sécurisant le service avec un token dynamique</p>
|
||||||
<p><strong>Entre autre, il devra :</strong></p>
|
<p><strong>Entre autre, il devra :</strong></p>
|
||||||
<p>-> Initialiser l'environnement virtuel Python (nommé gbvenv)</p>
|
<p>-> Initialiser l'environnement virtuel Python (nommé gbvenv)</p>
|
||||||
<p>-> Gérer les dépendances requises (fonction requirements qui vérifie si l'hôte a bien les requis tels que jq, sqlite3 et python) </p>
|
<p>-> Gérer les dépendances requises (fonction requirements qui vérifie si l'hôte a bien les requis tels que jq, sqlite3 et python) </p>
|
||||||
|
<p>-> Génère si besoin les clés SSH nécessaires pour sécuriser la connexion de l'API</p>
|
||||||
<p>-> Vérifier la présence d'un compte super-user dans Django (important pour se logger au panel Admin, via le lancement d'un script Python "lib/check_admin.py")</p>
|
<p>-> Vérifier la présence d'un compte super-user dans Django (important pour se logger au panel Admin, via le lancement d'un script Python "lib/check_admin.py")</p>
|
||||||
<p>-> Adapter le serveur au besoins (via un fichier de configuration sommaire : settings.json)</p>
|
<p>-> Collecte les fichiers statiques depuis un dossier "static" afin de préparer le CSS pour Whitenoise</p>
|
||||||
<p>-> Automatiser le processus de "migrations" (python manage.py migrate)</p>
|
<p>-> Automatiser le processus de "migrations" (python manage.py migrate)</p>
|
||||||
<p>-> Créer un token de session qui sécurisera les communications entre Django <-> Grabber <-> Alfred</p>
|
<p>-> Créer un token de session qui sécurisera les communications entre Django <-> Grabber <-> Alfred</p>
|
||||||
<h3 id="lagent-de-collecte-alfredrun">L'agent de collecte : <em>alfred.run</em></h3>
|
<h3 id="lagent-de-collecte-alfredrun">L'agent de collecte : <em>alfred.run</em></h3>
|
||||||
@ -2077,10 +2255,18 @@
|
|||||||
<h4 id="deploiement-dalfred">Déploiement d'Alfred</h4>
|
<h4 id="deploiement-dalfred">Déploiement d'Alfred</h4>
|
||||||
<p>Pour déployer Alfred sur une machine, on utilisera SSH pour envoyer le script dans un PC cible. On veut que cette tâche soit lancée directement depuis le panel Admin.</p>
|
<p>Pour déployer Alfred sur une machine, on utilisera SSH pour envoyer le script dans un PC cible. On veut que cette tâche soit lancée directement depuis le panel Admin.</p>
|
||||||
<p>Pour se faire, on délègue celle-ci à Python avec Django qui l'effectuera avec un formulaire qui contient l'IP sur laquelle aller, le username et le mot de passe du SSH cible.</p>
|
<p>Pour se faire, on délègue celle-ci à Python avec Django qui l'effectuera avec un formulaire qui contient l'IP sur laquelle aller, le username et le mot de passe du SSH cible.</p>
|
||||||
|
<div class="admonition warning">
|
||||||
|
<p class="admonition-title">Warning</p>
|
||||||
|
<p>Puisque l'IP envoyée à la machine cible est récupérée via <strong>request.get_host()</strong>, l'administrateur doit impérativement accéder au panel Admin de Grabber via l'adresse IP réseau de la machine (ex: 192.168.x.x:8000) et non via localhost:8000. Sinon, le PC cible tentera d'envoyer ses données à son propre localhost et la base de données restera vide. </p>
|
||||||
|
</div>
|
||||||
<h5 id="requete-avec-paramiko">Requête avec Paramiko</h5>
|
<h5 id="requete-avec-paramiko">Requête avec Paramiko</h5>
|
||||||
<p>C'est la solution trouvée pour gérer cette demande, Paramiko est une librairie Python installable avec pip qui peut établir la session SSH et le fera depuis le backend Django (dans views.py -> fonction deploy_ssh)</p>
|
<p>C'est la solution trouvée pour gérer cette demande, Paramiko est une librairie Python installable avec pip qui peut établir la session SSH et le fera depuis le backend Django (dans actions.py -> fonction deploy_ssh)</p>
|
||||||
<p>Le cycle de la requête est le suivant :</p>
|
<p>Le cycle de la requête est le suivant :</p>
|
||||||
<pre><code>-> Connexion SSH à la cible.
|
<pre><code>-> Connexion SSH à la cible.
|
||||||
|
(Via la clé SSH d'abord, puis si refus, via les identifiants donnés par l'utilisateur)
|
||||||
|
|
||||||
|
-> Si l'authentification via la clé n'a pas fonctionné,
|
||||||
|
on envoie notre clé SSH hôte sur la machine distante
|
||||||
|
|
||||||
-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.
|
-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.
|
||||||
|
|
||||||
@ -2089,12 +2275,22 @@
|
|||||||
|
|
||||||
-> Nettoyage des traces (rm /tmp/alfred.run).
|
-> Nettoyage des traces (rm /tmp/alfred.run).
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h4 id="protection-de-lapi-avec-un-secret-partage">Protection de l'API avec un "Secret Partagé"</h4>
|
<h4 id="protection-de-lapi-avec-un-token-dauthentification-session_token">Protection de l'API avec un Token d'Authentification (SESSION_TOKEN)</h4>
|
||||||
<p>Comme dit plus tôt, grabber.sh génère un token de session (SESSION_TOKEN avec la commande "openssl rand") à chaque lancement de grabber.sh, puis ce token est stockée dans settings.json pendant la session et se reset à la fermeture de la session (commande trap qui lance la fonction cleanup).</p>
|
<div class="admonition info">
|
||||||
<p>Ce token lui est stocké dans une variable Python depuis les settings.py qui se charge de lire les settings.json, fetch la clé et la stocke.</p>
|
<p class="admonition-title">Info</p>
|
||||||
<p>Enfin, lorsqu'une requête par Alfred est émise, Django vérifie cette clé d'abord dans api.py. Il fetch la clé dans la requête curl et la range dans une variable <em>key</em> puis teste si le token est correspondant à celui dans les settings.json. Si c'est bon, tout va bien, sinon il indique l'erreur avec la clé.</p>
|
<p>Ne faut pas confondre ce token destiné aux communications inter-machines avec les sessions administrateurs du panel web, qui sont elles gérées directement par la base de données SQLite.</p>
|
||||||
<h5 id="panel-admin-django">Panel Admin (Django)</h5>
|
</div>
|
||||||
<p>Enfin, le Panel Admin. Fonctionne avec Django, il part du modèle de données (models.py) et présente dans une interface HTML/CSS/JS la table SystemInfo avec l'adresse MAC comme clé principale pour chaque PC. Le tout est sécurisé avec le login admin de Django.</p>
|
<p>Comme dit plus tôt, <code>grabber.sh</code> génère un token unique (faisant office de clé d'API) avec la commande <code>openssl rand</code> à chaque lancement du serveur. Ce token est temporairement stocké dans <code>settings.json</code> et est automatiquement réinitialisé à la fermeture du script (via la commande <code>trap</code> qui lance la fonction <code>cleanup</code>).</p>
|
||||||
|
<p>Du côté serveur, lors du démarrage de l'application par Gunicorn, le fichier <code>config/settings.py</code> se charge de lire <code>settings.json</code> et de charger cette clé en mémoire dans la variable globale <code>SESSION_TOKEN</code>.</p>
|
||||||
|
<p>Enfin, lorsqu'une requête est émise par <strong>Alfred</strong>, Django intercepte et vérifie cette clé via la vue dédiée dans <code>web/api.py</code>. Il extrait la clé envoyée de manière sécurisée dans les en-têtes HTTP de la requête <code>curl</code> (précisément le header <code>HTTP_X_API_KEY</code>) et la compare avec celle en mémoire. Si les clés correspondent, les données matérielles sont traitées, sinon, la connexion est immédiatement rejetée avec une erreur 401 (Accès refusé).</p>
|
||||||
|
<h4 id="panel-admin">Panel Admin</h4>
|
||||||
|
<p>Il est une partie de l'app Django et présente dans une interface HTML/CSS/JS, une liste des ordinateurs enregistrés, la table SystemInfo avec l'adresse MAC comme clé principale pour chaque PC. Le tout est sécurisé avec le login admin de Django.</p>
|
||||||
|
<h5 id="gestion-des-employes">Gestion des "employés"</h5>
|
||||||
|
<p>Via un petit modal, il est possible d'administrer en plus des ordinateurs, une BDD d'employés (stockée dans la même BDD SQLite) et d'y effectuer des tâches basiques comme créer un employé, le supprimer, l'éditer et l'assigner à un ordinateur depuis la page d'un PC.</p>
|
||||||
|
<h5 id="gestion-des-sessions">Gestion des sessions</h5>
|
||||||
|
<p>Pour gérer les sessions sur le Panel et éviter que les administrateurs soient déconnectés en naviguant (problème lié à la séparation des mémoires des différents workers de Gunicorn), le système de session de Django a été configuré pour être stocké directement dans la base de données SQLite (SESSION_ENGINE = "django.contrib.sessions.backends.db").</p>
|
||||||
|
<h5 id="design">Design</h5>
|
||||||
|
<p>Le CSS et le design utilisent la librairie Tailwind en mode CLI. Concrètement, on télécharge la librairie en local pour travailler avec, on la lance via une commande qui surveille "watch" les modifications, puis lorsque l'on a fini, on empaquete notre CSS avec le strict necessaire "minify". <a href="https://tailwindcss.com/docs/installation/tailwind-cli">En savoir plus</a></p>
|
||||||
<h2 id="vue-densemble-du-projet-et-conclusions-projet-a-finir-avant">Vue d'ensemble du projet et Conclusions (Projet à finir avant)</h2>
|
<h2 id="vue-densemble-du-projet-et-conclusions-projet-a-finir-avant">Vue d'ensemble du projet et Conclusions (Projet à finir avant)</h2>
|
||||||
<h3 id="difficultes-rencontrees-et-apprentissages">Difficultés rencontrées et apprentissages</h3>
|
<h3 id="difficultes-rencontrees-et-apprentissages">Difficultés rencontrées et apprentissages</h3>
|
||||||
<h3 id="bilan">Bilan</h3>
|
<h3 id="bilan">Bilan</h3>
|
||||||
|
|||||||
@ -1301,6 +1301,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../2025-12-05/" class="md-nav__link">
|
<a href="../2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1301,6 +1301,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../2025-12-05/" class="md-nav__link">
|
<a href="../2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
@ -1301,6 +1301,117 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_3_1">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
|
||||||
|
|
||||||
|
Stage
|
||||||
|
|
||||||
|
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-03/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 1 - Planification et installation Hardware
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../stage/2026-03-09/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
Étape 2 : Configuration de l'Infrastructure Serveur
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="md-nav__item">
|
<li class="md-nav__item">
|
||||||
<a href="../2025-12-05/" class="md-nav__link">
|
<a href="../2025-12-05/" class="md-nav__link">
|
||||||
|
|
||||||
|
|||||||
2013
site/projects/stage/2026-03-03/index.html
Normal file
2013
site/projects/stage/2026-03-03/index.html
Normal file
File diff suppressed because one or more lines are too long
1878
site/projects/stage/2026-03-09/index.html
Normal file
1878
site/projects/stage/2026-03-09/index.html
Normal file
File diff suppressed because one or more lines are too long
1851
site/projects/stage/projet/index.html
Normal file
1851
site/projects/stage/projet/index.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user