diff --git a/docs/index.md b/docs/index.md index aabcb4a..b934e4e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,4 @@ -tk completement sous frozen -*avant le 28/11 y'a rien a gratter, j'installais linux pour la 9387e fois* +image de couverture docs # Bienvenue dans mes notes de devops diff --git a/docs/learn/devops/2025-10-30.md b/docs/learn/devops/2025-10-30.md index 732aa83..8eb3663 100644 --- a/docs/learn/devops/2025-10-30.md +++ b/docs/learn/devops/2025-10-30.md @@ -6,6 +6,7 @@ tags: --- drake (moi) t'aidant avec mes notes remplies de bonne volontĂ©s +*avant cette note y'a rien a gratter, j'installais linux pour la 387e fois* # C'est quoi linux ? (30/10/25) diff --git a/docs/learn/python/2026-01-16.md b/docs/learn/python/2026-01-16.md index 6565025..a0dde93 100644 --- a/docs/learn/python/2026-01-16.md +++ b/docs/learn/python/2026-01-16.md @@ -8,7 +8,7 @@ tags: tk completement sous frozen *7alouf ouvre grabber apres 9h brainrot tsunami* -# pip et environnements virtuels pour les quoicoubenks (16/01/26) +# pip et environnements virtuels (16/01/26) ## Python et ses environnements virtuels diff --git a/docs/links.md b/docs/links.md index 2e2fd37..9f01127 100644 --- a/docs/links.md +++ b/docs/links.md @@ -1,7 +1,3 @@ -tuto ytb sql - - - # Liens cools de ma poche ## 🎹 Design diff --git a/docs/projects/2025-12-05.md b/docs/projects/2025-12-05.md index 750fc24..44dd9e9 100644 --- a/docs/projects/2025-12-05.md +++ b/docs/projects/2025-12-05.md @@ -5,25 +5,118 @@ tags: - Docs --- -# Grabber docs -## But du projet -Grabber est un hub admin pour fetch les donnĂ©es hardware d'un parc informatique via un script qui fetch les ordinateurs (d'abord sur linux, plus tard intĂ©gration d'autres OS), lie les ordinateurs a des utilisateurs (ex. employĂ©s pour administration en entreprise) et de check d'un coup d'oeil les updates disponibles + Ă©tat du software +# Alternavive GLSI lĂ©ger : Grabber -## Fonctionnement -Pour fonctionner, grabber a plusieures tĂąches rĂ©parties par diffĂ©rents Ă©lĂ©ments dans le projet : - -> Cerveau : Coordonne les diffĂ©rentes tĂąches du programme comme lancer le serveur admin, fetch les donnĂ©es d'un ordinateur dans une BDD (grabber.sh) - -> Corps : Serveur admin python qui affichera les donnĂ©es stockĂ©es dans une BDD type sqlite +## Introduction au projet -## Technologies +### Besoin -- Bash -> Script qui fetch et lance la console admin -- Python - - Django -> pour host le site admin en local +Grabber part d'un besoin de gĂ©rer un petit parc informatique (dizaines d'ordinateurs) dans un espace de travail (type entreprise). On peut dĂ©ja noter certains besoins majeurs : **gĂ©rer des ordinateurs Ă  distance**, **connaitre d'un coup d'oeil leur Ă©tat** (updates, hardware, software) et **Ă©tablir une liste de liens entre ordinateurs et employĂ©s**. -## Avancement +### Solution -- [ ] Script bash - * [x] Fetch le hardware - * [ ] Uninstaller -- [ ] Interface admin web (wip) \ No newline at end of file +Grabber donc serait dans l'idĂ©e capable de rĂ©pondre Ă  ces besoins, via une interface web administrateur consultable par le DSI d'une entreprise par exemple. Pour la gestion d'un parc informatique de petite taille/toute petite, on proposera un produit simple, lĂ©ger et plug and play. Via une simple commande de terminal et une configuration au prĂ©alable des ordinateurs cibles capable de recevoir des requĂȘtes SSH, Grabber sera capable de couvrir un maximum des besoins. + +## Choix de la stack technologique + +Le projet en gĂ©nĂ©ral se basera sur du Bash et du Python pour gĂ©rer l'API et le panel Admin. + +### -> *Bash* + +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)* + +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. + +### -> *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. + +## Architecture technique + +### Chef du service : *grabber.sh* + +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 + +**Entre autre, il devra :** + +-> Initialiser l'environnement virtuel Python (nommĂ© gbvenv) + +-> 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) + +-> 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) + +-> Automatiser le processus de "migrations" (python manage.py migrate) + +-> CrĂ©er un token de session qui sĂ©curisera les communications entre Django <-> Grabber <-> Alfred + +### L'agent de collecte : *alfred.run* + +!!! info + + *Au dĂ©part une fonction inclue dans grabber.sh, il a finalement Ă©tĂ© dĂ©cidĂ© de sĂ©parer les deux pour plus de lisibilitĂ© et de facilitĂ© sur la suite pour ĂȘtre executĂ© en autonomie dans une machine cible.* + +Son rĂŽle est de fetch les donnĂ©es de la cible dont on a besoin pour rĂ©pondre au besoin, donnĂ©es Hardware et Software. Toujours en Bash pour sa facilitĂ© d'utilisation dans des tĂąches d'extraction de donnĂ©es de l'OS. + +**En rĂ©sumĂ©, il devra donc :** + +-> RĂ©cupĂ©rer les donnĂ©es systĂšme (avec des outils natifs comme les netutils ou bien la librairie externe inxi) + +-> Empaqueter ces donnĂ©es en un objet JSON (avec jq) + +-> Envoyer les donnĂ©es via une requĂȘte Ă  l'endpoint du serveur Django (avec une requĂȘte HTTP POST curl) + +-> Renvoyer le token de session pour sĂ©curiser la communication + +-> Le tout est codĂ© dans un paquet .run qui contient les librairies requises comme jq et inxi pour ĂȘtre utilisable sur un maximum d'ordinateurs Linux (compilĂ© avec makeself) + +### DĂ©ploiement d'Alfred + +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. + +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. + +#### 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) + +Le cycle de la requĂȘte est le suivant : + + -> Connexion SSH Ă  la cible. + + -> Transfert SFTP de l'exĂ©cutable alfred.run vers le rĂ©pertoire temporaire /tmp/. + + -> ExĂ©cution distante en injectant l'IP du serveur (request.get_host()) et + le Token de session. + + -> Nettoyage des traces (rm /tmp/alfred.run). + +### Protection de l'API avec un "Secret PartagĂ©" + +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). + +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. + +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Ă©. + +### Panel Admin (Django) + +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. + +## Vue d'ensemble du projet et Conclusions + +### DifficultĂ©s rencontrĂ©es et apprentissages + +### Bilan + +### Axes d'amĂ©lioration + +Passer le dĂ©ploiement SSH sur un systĂšme de clĂ©s asymĂ©triques (ClĂ©s Publiques/PrivĂ©es) plutĂŽt que par mot de passe. + +DĂ©ploiement du serveur maĂźtre via Docker pour une approche 100% "Release". + +Ajout d'un historique de l'Ă©tat (ex: voir si un PC est hors ligne depuis X jours). \ No newline at end of file diff --git a/site/404.html b/site/404.html index 15b7b2d..56f8a50 100644 --- a/site/404.html +++ b/site/404.html @@ -506,34 +506,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -556,34 +528,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -731,6 +675,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -799,7 +854,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/index.html b/site/index.html index 2d7ea6b..9931962 100644 --- a/site/index.html +++ b/site/index.html @@ -572,34 +572,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -622,34 +594,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -797,6 +741,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -865,7 +920,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -1025,8 +1080,7 @@ -

    tk completement sous frozen -avant le 28/11 y'a rien a gratter, j'installais linux pour la 9387e fois

    +

    image de couverture docs

    Bienvenue dans mes notes de devops

    Structure

    -> cours (Notes sur les cours)

    diff --git a/site/learn/devops/2025-10-30/index.html b/site/learn/devops/2025-10-30/index.html index 66c8925..c4fa1f8 100644 --- a/site/learn/devops/2025-10-30/index.html +++ b/site/learn/devops/2025-10-30/index.html @@ -578,34 +578,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -628,34 +600,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -803,6 +747,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -871,7 +926,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -1031,7 +1086,8 @@ -

    drake (moi) t'aidant avec mes notes remplies de bonne volontés

    +

    drake (moi) t'aidant avec mes notes remplies de bonne volontés +avant cette note y'a rien a gratter, j'installais linux pour la 387e fois

    C'est quoi linux ? (30/10/25)

    Warning

    diff --git a/site/learn/devops/2025-11-28/index.html b/site/learn/devops/2025-11-28/index.html index 546b2da..956e56a 100644 --- a/site/learn/devops/2025-11-28/index.html +++ b/site/learn/devops/2025-11-28/index.html @@ -628,34 +628,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -678,34 +650,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -853,6 +797,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -921,7 +976,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/devops/2025-12-12/index.html b/site/learn/devops/2025-12-12/index.html index ccaea00..f4b5a37 100644 --- a/site/learn/devops/2025-12-12/index.html +++ b/site/learn/devops/2025-12-12/index.html @@ -12,7 +12,7 @@ - + @@ -678,34 +678,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -728,34 +700,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -903,6 +847,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -971,7 +1026,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/devops/2026-01-22/index.html b/site/learn/devops/2026-01-22/index.html index cfc9318..03354e1 100644 --- a/site/learn/devops/2026-01-22/index.html +++ b/site/learn/devops/2026-01-22/index.html @@ -9,10 +9,10 @@ - + - + @@ -517,34 +517,6 @@ - - -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - @@ -700,34 +672,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -875,6 +819,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -943,7 +998,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/javascript/2026-01-30/index.html b/site/learn/javascript/2026-01-30/index.html index 307d7e7..af797d9 100644 --- a/site/learn/javascript/2026-01-30/index.html +++ b/site/learn/javascript/2026-01-30/index.html @@ -9,7 +9,7 @@ - + @@ -517,34 +517,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -567,34 +539,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -754,6 +698,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -822,7 +877,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/javascript/2026-02-06/index.html b/site/learn/javascript/2026-02-06/index.html index 8d6d757..2c623e3 100644 --- a/site/learn/javascript/2026-02-06/index.html +++ b/site/learn/javascript/2026-02-06/index.html @@ -517,34 +517,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -567,34 +539,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -881,6 +825,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -949,7 +1004,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/javascript/2026-02-09/index.html b/site/learn/javascript/2026-02-09/index.html index bcb14c0..799558e 100644 --- a/site/learn/javascript/2026-02-09/index.html +++ b/site/learn/javascript/2026-02-09/index.html @@ -12,7 +12,7 @@ - + @@ -517,34 +517,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -567,34 +539,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -853,6 +797,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -921,7 +976,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/learn/devops/2026-01-16/index.html b/site/learn/python/2026-01-16/index.html similarity index 95% rename from site/learn/devops/2026-01-16/index.html rename to site/learn/python/2026-01-16/index.html index 4150fef..9034e13 100644 --- a/site/learn/devops/2026-01-16/index.html +++ b/site/learn/python/2026-01-16/index.html @@ -9,10 +9,10 @@ - + - + @@ -23,7 +23,7 @@ - pip et environnements virtuels pour les quoicoubenks (16/01/26) - Les incroyables notes de devops + pip et environnements virtuels (16/01/26) - Les incroyables notes de devops @@ -146,7 +146,7 @@
    - + Skip to content @@ -182,7 +182,7 @@
    - pip et environnements virtuels pour les quoicoubenks (16/01/26) + pip et environnements virtuels (16/01/26)
    @@ -384,8 +384,6 @@ - - @@ -393,11 +391,11 @@ -
  • +
  • - + - @@ -882,7 +937,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -1055,7 +1110,7 @@

    tk completement sous frozen 7alouf ouvre grabber apres 9h brainrot tsunami

    -

    pip et environnements virtuels pour les quoicoubenks (16/01/26)

    +

    pip et environnements virtuels (16/01/26)

    Python et ses environnements virtuels

    @@ -875,6 +686,250 @@ + + + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -943,7 +998,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -1141,7 +1196,12 @@ -
  • + + + +
  • + +
  • @@ -1150,11 +1210,6 @@ -
  • - - - - @@ -1178,12 +1233,15 @@

    Django en gros (16/02/2026)

    Commencer un projet Django

    Pour commencer un projet Django, c'est super simple :

    -

    -> D'abord, créer un dossier de projet - mkdir projet

    -

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip - python3 -m venv "projetvenv" && source projetvenv/bin/activate && pip install django

    -

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet) - django-admin startproject config .

    +

    -> D'abord, créer un dossier de projet

    +
    `mkdir projet`
    +
    +

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip

    +
    `python3 -m venv "projetvenv" && source projetvenv/bin/activate && pip install django`
    +
    +

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet)

    +
    `django-admin startproject config .`
    +

    -> On peut maintenant travailler dans notre projet Django

    Projet et applications

    Django fonctionne sur l'utilisations de petits modules appelĂ©s "Applications", ceux-ci composent un projet Django. Elles peuvent ĂȘtre des composants gĂšrant une API qui prend des donnĂ©es JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas...

    @@ -1191,7 +1249,7 @@

    Note

    En gros, on a un projet (dossier "config") dans lequel on gÚre les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gÚrent leurs tùches propres à elles

    -

    Pour créer une Application on utilise cette commande -> python manage.py startapp api

    +

    Pour créer une Application on utilise cette commande -> python manage.py startapp nomdel'app

    Fonctionnement d'une Application

    Une application se divise avec un fonctionnement en 3 parties

    ModĂšle <--> Vue -> Template

    @@ -1215,7 +1273,7 @@ <title>{{ data.hostname }} - Grabber</title>
    -

    URLs

    +

    URLs

    Un autre composant trĂšs important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer.

    Par exemple

    diff --git a/site/links/index.html b/site/links/index.html index da3fbc0..f5cf533 100644 --- a/site/links/index.html +++ b/site/links/index.html @@ -513,34 +513,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -563,34 +535,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -738,6 +682,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -806,7 +861,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -1047,7 +1102,6 @@ -

    tuto ytb sql

    Liens cools de ma poche

    🎹 Design

    đŸ’œ Developpement

    diff --git a/site/projects/2025-12-05/index.html b/site/projects/2025-12-05/index.html index ce7baeb..82a00f3 100644 --- a/site/projects/2025-12-05/index.html +++ b/site/projects/2025-12-05/index.html @@ -9,7 +9,7 @@ - + @@ -23,7 +23,7 @@ - Grabber docs - Les incroyables notes de devops + Alternavive GLSI léger : Grabber - Les incroyables notes de devops @@ -146,7 +146,7 @@
    - + Skip to content @@ -182,7 +182,7 @@
    - Grabber docs + Alternavive GLSI léger : Grabber
    @@ -515,34 +515,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -565,34 +537,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -740,6 +684,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -819,7 +874,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -837,7 +892,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber @@ -864,47 +919,231 @@ @@ -1034,47 +1273,231 @@ @@ -1096,30 +1519,81 @@

    -

    Grabber docs

    -

    But du projet

    -

    Grabber est un hub admin pour fetch les données hardware d'un parc informatique via un script qui fetch les ordinateurs (d'abord sur linux, plus tard intégration d'autres OS), lie les ordinateurs a des utilisateurs (ex. employés pour administration en entreprise) et de check d'un coup d'oeil les updates disponibles + état du software

    -

    Fonctionnement

    -

    Pour fonctionner, grabber a plusieures tùches réparties par différents éléments dans le projet : - -> Cerveau : Coordonne les différentes tùches du programme comme lancer le serveur admin, fetch les données d'un ordinateur dans une BDD (grabber.sh) - -> Corps : Serveur admin python qui affichera les données stockées dans une BDD type sqlite

    -

    Technologies

    -
      -
    • Bash -> Script qui fetch et lance la console admin
    • -
    • Python
        -
      • Django -> pour host le site admin en local
      • -
      -
    • -
    -

    Avancement

    -
      -
    • Script bash
        -
      • Fetch le hardware
      • -
      • Uninstaller
      • -
      -
    • -
    • Interface admin web (wip)
    • -
    +

    Alternavive GLSI léger : Grabber

    +

    Introduction au projet

    +

    Besoin

    +

    Grabber part d'un besoin de gérer un petit parc informatique (dizaines d'ordinateurs) dans un espace de travail (type entreprise). On peut déja noter certains besoins majeurs : gérer des ordinateurs à distance, connaitre d'un coup d'oeil leur état (updates, hardware, software) et établir une liste de liens entre ordinateurs et employés.

    +

    Solution

    +

    Grabber donc serait dans l'idĂ©e capable de rĂ©pondre Ă  ces besoins, via une interface web administrateur consultable par le DSI d'une entreprise par exemple. Pour la gestion d'un parc informatique de petite taille/toute petite, on proposera un produit simple, lĂ©ger et plug and play. Via une simple commande de terminal et une configuration au prĂ©alable des ordinateurs cibles capable de recevoir des requĂȘtes SSH, Grabber sera capable de couvrir un maximum des besoins.

    +

    Choix de la stack technologique

    +

    Le projet en général se basera sur du Bash et du Python pour gérer l'API et le panel Admin.

    +

    -> Bash

    +

    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)

    +

    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.

    +

    -> 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.

    +

    Architecture technique

    +

    Chef du service : grabber.sh

    +

    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

    +

    Entre autre, il devra :

    +

    -> Initialiser l'environnement virtuel Python (nommé gbvenv)

    +

    -> 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)

    +

    -> 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)

    +

    -> Automatiser le processus de "migrations" (python manage.py migrate)

    +

    -> Créer un token de session qui sécurisera les communications entre Django <-> Grabber <-> Alfred

    +

    L'agent de collecte : alfred.run

    +
    +

    Info

    +

    Au dĂ©part une fonction inclue dans grabber.sh, il a finalement Ă©tĂ© dĂ©cidĂ© de sĂ©parer les deux pour plus de lisibilitĂ© et de facilitĂ© sur la suite pour ĂȘtre executĂ© en autonomie dans une machine cible.

    +
    +

    Son rÎle est de fetch les données de la cible dont on a besoin pour répondre au besoin, données Hardware et Software. Toujours en Bash pour sa facilité d'utilisation dans des tùches d'extraction de données de l'OS.

    +

    En résumé, il devra donc :

    +

    -> Récupérer les données systÚme (avec des outils natifs comme les netutils ou bien la librairie externe inxi)

    +

    -> Empaqueter ces données en un objet JSON (avec jq)

    +

    -> Envoyer les donnĂ©es via une requĂȘte Ă  l'endpoint du serveur Django (avec une requĂȘte HTTP POST curl)

    +

    -> Renvoyer le token de session pour sécuriser la communication

    +

    -> Le tout est codĂ© dans un paquet .run qui contient les librairies requises comme jq et inxi pour ĂȘtre utilisable sur un maximum d'ordinateurs Linux (compilĂ© avec makeself)

    +

    Déploiement d'Alfred

    +

    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.

    +

    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.

    +

    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)

    +

    Le cycle de la requĂȘte est le suivant :

    +
    -> Connexion SSH Ă  la cible.
    +
    +-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.
    +
    +-> Exécution distante en injectant l'IP du serveur (request.get_host()) et 
    +   le Token de session.
    +
    +-> Nettoyage des traces (rm /tmp/alfred.run).
    +
    +

    Protection de l'API avec un "Secret Partagé"

    +

    Pourquoi éviter le CSRF pour une API machine ? Les limites de l'authentification par navigateur pour des scripts automatisés.

    +

    Rotation dynamique des clés (Token) : * Explication de la génération du SESSION_TOKEN (via openssl rand) à chaque lancement de grabber.sh.

    +

    Injection dans settings.json lu par Django (config/settings.py).

    +

    Nettoyage sécurisé (Trap) : L'utilisation de trap dans le lanceur Bash pour effacer le token du JSON à la fermeture du serveur (Ctrl+C), évitant de laisser des identifiants sensibles en clair.

    +

    La validation cÎté Django (api.py) : Comment la vue receive_system_info compare le header HTTP_X_API_KEY avec le token mémorisé avant d'accepter les données.

    +

    Panel Admin (Django)

    +
    7.1. Le modÚle de données (models.py) : Présentation de la table SystemInfo, avec l'adresse MAC comme clé d'unicité (pour mettre à jour un PC existant plutÎt que de le dupliquer).
    +
    +7.2. L'expérience utilisateur (HTML/CSS/JS) :
    +
    +    Affichage propre des données récupérées.
    +
    +    Gestion des erreurs SSH avec les messages Django (succÚs/échec).
    +
    +    L'ajout d'un script JavaScript (Spinner de chargement) lors du déploiement SSH pour éviter les clics multiples.
    +
    +

    Vue d'ensemble du projet et Conclusions

    +

    Difficultés rencontrées et apprentissages

    +

    Bilan

    +

    Axes d'amélioration

    +

    Passer le déploiement SSH sur un systÚme de clés asymétriques (Clés Publiques/Privées) plutÎt que par mot de passe.

    +

    Déploiement du serveur maßtre via Docker pour une approche 100% "Release".

    +

    Ajout d'un historique de l'état (ex: voir si un PC est hors ligne depuis X jours).

    @@ -740,6 +684,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -810,7 +865,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/projects/2026-02-13/index.html b/site/projects/2026-02-13/index.html index a6be022..25b8c1b 100644 --- a/site/projects/2026-02-13/index.html +++ b/site/projects/2026-02-13/index.html @@ -515,34 +515,6 @@ -
  • - - - - - - - - pip et environnements virtuels pour les quoicoubenks (16/01/26) - - - - - - - - -
  • - - - - - - - - - -
  • @@ -565,34 +537,6 @@ - - - - - - -
  • - - - - - - - - Django en gros (16/02/2026) - - - - - - - - -
  • - - - - @@ -740,6 +684,117 @@ + + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + + @@ -810,7 +865,7 @@ - Grabber docs + Alternavive GLSI lĂ©ger : Grabber diff --git a/site/search.json b/site/search.json index b55532d..3c8ee6a 100644 --- a/site/search.json +++ b/site/search.json @@ -1 +1 @@ -{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Bienvenue dans mes notes de devops","text":"

    avant le 28/11 y'a rien a gratter, j'installais linux pour la 9387e fois

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#bienvenue-dans-mes-notes-de-devops","level":1,"title":"Bienvenue dans mes notes de devops","text":"","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#structure","level":2,"title":"Structure","text":"

    -> cours (Notes sur les cours)

    -> projects (Notes sur des nouveaux projets)

    -> liens cools (mes sites favoris)

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"links/","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#liens-cools-de-ma-poche","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#design","level":2,"title":"🎹 Design","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#developpement","level":2,"title":"đŸ’œ Developpement","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"learn/devops/2025-10-30/","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#cest-quoi-linux-301025","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"

    Warning

    Page en travaux, doit ĂȘtre finie avec toutes les informations que j'ai sur Linux en gĂ©nĂ©ral

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#arborescence-type-sur-unix","level":2,"title":"Arborescence type sur UNIX","text":"

    Unix a gĂ©nĂ©ralement cette arborescence que ce soit sur n'importe quelle distro Linux Ă©galement Android pour les tĂ©lĂ©phones et mĂȘme quelques similitudes sur macOS.

    /               # Racine du disque\n├── /bin/       # Contient les commandes de base\n├── /boot/      # Fichiers de demarrage\n├── /dev/       # Tout ce qui est liĂ© aux pĂ©riphĂ©riques\n├── /etc/       # Fichiers de configuration\n├── /home/      # RĂ©pertoires utilisateurs\n├── /lib/       # BibliothĂšques logicielles\n├── /mnt/       # Point de montage pour les systĂšmes de fichier temporaires\n├── /media/     # Point de montage pour les disques temporaires\n├── /opt/       # Logiciels optionnels, la ou on installera des programmes maison\n├── /root/      # RĂ©pertoire du user root\n├── /var/       # Variable, contient des logs, ect...\n├── /usr/       # Contient sensiblement la mĂȘme chose que la racine mais sans ĂȘtre utile au fonctionnement du systĂšme\n├── /srv/       # Services hĂ©bergĂ©s sur le systĂšmes (FTP, HTTP, ect...)\n├── /run/       # Emplacement mĂ©moire des programmes\n└── /tmp/       # Temporaire\n
    source de l'arbo.

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-11-28/","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"

    mon big ass qui fait sudo rm -rf / sans réfléchir

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-sh-pour-les-idiots-281125","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#cheatsheet-de-plein-de-commandes","level":2,"title":"Cheatsheet de plein de commandes","text":"

    Depuis le début, beaucoup de commandes on été utilisées, du coup je note ici les commandes utilisées depuis le début et a quoi elles servent en gros

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-de-base","level":3,"title":"Commandes de base","text":"
    1. sudo : lance une commande avec les superdroits, peut manipuler tout le pc avec en gros

      sudo [commande]\n

    2. ls : liste les fichiers d'un dossier

      # -a pour afficher les fichiers cachés / -l pour afficher en liste avec plus d'infos\nls [options] [fichier|dir]\n

    3. cd : changer de dossier

      # ~ pour aller au répertoire home / .. pour revenir en arriere\ncd [dir]\n

    4. pwd : affiche le répertoire actuel

      pwd\n

    5. touch : affiche le contenu d'un fichier

      touch [fichier]\n

    6. nano : éditeur de texte

      nano [fichier]\n

    7. mkdir : supprime ce qu'on lui donne

      mkdir [options] [fichier|dir]\n

    8. rm : supprime ce qu'on lui donne

      # -r pour supprimer un dossier et son contenu (recursive) (`rmdir` le fait aussi)\n# -f force la commande\nrm [options] [fichier|dir]\n

    9. cp : copie...

      cp [options] [source] [destination]\n

    10. mv : ...et déplace

      mv [options] [source] [destination]\n

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#les-caracteres-dassociations","level":3,"title":"Les caractùres d'associations","text":"

    | (le pipe) -> prend le résultat de la commande de gauche et le donne à celle de droite

    exemple : liste tout un répertoire, mais n'affiche que les résultats qui sont \"feur\"

    ls -la | grep \"feur\"\n

    > et >>

    • envoie le rĂ©sultat d'une commande dans un fichier texte
    • > Ă©crase le fichier / >> ajoute Ă  la fin sans effacer
    • ex: echo \"coucou\" > fichier.txt
    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#permissions-et-utilisateurs","level":3,"title":"Permissions et Utilisateurs","text":"

    chmod [droits] [fichier] - change les permissions d'un fichier (qui peut lire/écrire/exécuter) - chmod +x [fichier] rend un script exécutable (trÚs important) - chmod 777 [fichier] donne tous les droits à tout le monde (dangereux mais ça dépanne)

    chown [user]:[groupe] [fichier] - change le propriétaire du fichier (si t'as copié un truc en sudo et que tu peux plus le toucher)

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#lecture-et-recherche-dans-les-fichiers","level":3,"title":"Lecture et recherche dans les fichiers","text":"

    cat [fichier] - affiche tout le contenu d'un fichier d'un coup dans le terminal - utile pour les petits fichiers, sinon ça inonde l'écran

    less [fichier] - affiche le contenu page par page (on peut scroller) - appuyer sur q pour quitter

    head [fichier] / tail [fichier] - affiche juste le début (head) ou la fin (tail) d'un fichier - tail -f [fichier] hyper utile pour voir les logs en direct (ça attend les nouvelles lignes)

    grep [mot] [fichier] - cherche un mot ou une phrase spécifique dans un fichier (le ctrl+f du terminal) - -r pour chercher dans tous les dossiers (recursive) / -i pour ignorer les majuscules

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-12-12/","level":1,"title":"Git pour les neuilles (12/12/25)","text":"

    completement zehef pcq t'as pas git push

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#git-pour-les-neuilles-121225","level":1,"title":"Git pour les neuilles (12/12/25)","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#creer-un-git","level":2,"title":"CrĂ©er un git","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-le-projet-existe-deja","level":3,"title":"-> Si le projet existe deja","text":"
    • On clone le projet au sein d'un dossier, celui-ci sera dans son dossier de travail. -> git clone (url du projet git)
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-sinon-creer-le-projet","level":3,"title":"-> Sinon crĂ©er le projet","text":"
    • CrĂ©e le projet git Ă  partir de ce dossier. -> git init (dossier de travail)
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#ignorer-des-fichiersdossiers","level":2,"title":"Ignorer des fichiers/dossiers","text":"
    • Ajouter des interdictions dans .gitignore

    echo gbvenv/ >> .gitignore <- on indique via un echo qui écrira dans le fichier .gitignore qu'on ne veut pas push le dossier \"gbvenv\" ici, un fichier on ne mettera pas le slash (logique en amont)

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#une-fois-que-de-fichiers-sont-dispos-empaqueter","level":2,"title":"Une fois que de fichiers sont dispos, empaqueter !","text":"

    Pour envoyer un projet git, c'est comme envoyer un colis Ă  la poste, d'abord, on met nos affaires dans le colis

    Plusieures possibilitĂ©s ☝

    • Ajoute TOUS les fichiers du dossier via l'option -A ou --all -> git add -A

    • Ajoute SEULEMENT les modifications et suppressions (donc pas de nouveaux fichiers) -> git add -u

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#etiqueter-le-paquet","level":2,"title":"Etiqueter le paquet","text":"

    Ensuite, on rempli l'étiquette du colis et on la colle au colis

    • On Ă©crit une note recap courte du commit sur le git -> git commit -m \"(message du commit)\"
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#deposer-le-colis","level":2,"title":"DĂ©poser le colis","text":"

    Enfin pour push, c'est a dire déposer le colis au bureau de poste pour l'envoi, on fait :

    • On envoie le paquet de l'origine Ă  la branche souhaitĂ©e dans le git -> git push -u origin (branche souhaitĂ©e)

    Info

    -u veut dire ce que dit la doc en gros

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-erreur","level":3,"title":"-> SI ERREUR","text":"

    Dans le cas ou un fichier/dossier a été supprimé autre part avant de push nos modifs

    • Merge de force les deux branches pour ne faire qu'une branche git config pull.rebase false
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#utiliser-deux-branches-differentes","level":2,"title":"Utiliser deux branches diffĂ©rentes","text":"

    Dans le cas ou l'on veut travailler avec une seconde branche

    • Pour switch de branche de travail -> git checkout (branche souhaitĂ©e)

    • Pour merge en ecrasant la branche souhaitĂ©e âŹ‡ïž

      git merge -s ours main\ngit checkout main\ngit merge (branche Ă  merge)\n

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2026-01-16/","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"

    7alouf ouvre grabber apres 9h brainrot tsunami

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#pip-et-environnements-virtuels-pour-les-quoicoubenks-160126","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#python-et-ses-environnements-virtuels","level":2,"title":"Python et ses environnements virtuels","text":"
    • En python, on peut travailler dans des \"sandboxes\" ou toutes les libraires installĂ©es resteront contenues dedans

    Utile de créer donc un environnement pour chaque projet afin de en pas perturber d'autres projets avec des milliers de packages inutiles en gros

    python3 -m venv gbvenv <- permet de créer un environnement (venv crée l'environnement \"gbvenv\")

    source gbvenv/bin/activate <- lance cet environnement pour travailler dedans

    • En parlant de packages, parlons de ✹pip✹

    pip est le packages manager de python, en l'appelant, on peut installer des packages comme uvicorn par exemple, utile pour grabber

    pip install --upgrade pip <- update les packages

    python -m pip install *** <- installe le package qu'on notera a la place des ***

    pip freeze >> requirements.txt <- commande super utile pour partager les dependances necessaires pour faire fonctionner son projet sur un autre environnement

    deactivate <- désactive l'environnement virtuel

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#script-de-roi-qui-automatise-le-process","level":2,"title":"Script de roi qui automatise le process","text":"
    • J'ai codĂ© un script qui automatise ce process avec une seule commande :

    bash <(curl -fsSL https://raw.githubusercontent.com/buchtioof/venv-setup/main/venvsetup.sh)

    Pour en apprendre plus : le git du projet

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-22/","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"

    florian quand je lui demande de l'aide

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#sql-pour-les-tung-tung-tung-sahur-220126","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#modele-mvc","level":2,"title":"Modùle MVC","text":"

    Le modÚle MVC est une façon de concevoir un projet logiciel, en gros on sépare celui-ci en trois grandes parties distinctes séparant la logique de la vue et rend le travail plus facile.

    ModĂšle MVC en prenant celui de grabber par exemple :

    - Model = Base De Donnée (ex: EMPLOYEES, COMPUTERS)\n- View = Tableau de bord, Site\n- Controller = Cerveau qui dirige les deux parties Model et View (ex: app.py)\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#tuto-comment-cr2er-une-bdd-sql-facilement-en-2-minutes-super-facile","level":2,"title":"TUTO : COMMENT CR2ER UNE BDD SQL FACILEMENT EN 2 MINUTES (SUPER FACILE)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#structure-dune-base-de-donnees","level":3,"title":"Structure d'une Base De DonnĂ©es","text":"

    celle de grabber pour l'exemple

    BDD (Etape 1) - grabberman\n├── TABLES (Etape 2) - COMPUTERS\n│   ├── Colonne (Etape 3) - PcId, entier/clĂ© primaire\n│   │   └── DonnĂ©e (Etape 4)\n│   ├── Colonne (Etape 3) - Hostname, chaĂźne de charactĂšre\n│   └── Colonne (Etape 3) - MacAddress, chaĂźne de charactĂšre\n└── TABLES (Etape 2) - EMPLOYEES\n    ├── Colonne (Etape 3) - UserId, entier/clĂ© primaire\n    ├── Colonne (Etape 3) - Username, chaĂźne de charactĂšre\n    └── Colonne (Etape 3) - PcId, clĂ© secondaire\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-1-creer-une-bdd","level":3,"title":"Etape 1 : CrĂ©er une BDD","text":"

    sqlite3 grabberman.db <- Commande qui crée une DB qu'on appellera ici \"grabberman\"

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-2-creer-une-table","level":3,"title":"Etape 2 : CrĂ©er une table","text":"
    CREATE TABLE \"COMPUTERS\" \n(\n    PcId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Hostname VARCHAR(50) NOT NULL, \n    MacAddress VARCHAR(50)\n);\n

    Note

    Ici on crée une table dans laquelle on stockera des données (des PC que l'on grab par exemple)

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-3-ajouter-des-donnees-dans-une-table","level":3,"title":"Etape 3 : Ajouter des donnĂ©es dans une table","text":"

    INSERT into COMPUTERS (Hostname, MacAddress) VALUES ('mypc', '1B:12:F0:FL:94');

    Note

    Pour ajouter une donnée dans une tableau, on INSERE dans le TABLEAU donné les VALEURS dans les Colonnes

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-4-creer-un-autre-tableau-avec-une-cle-liee-foreign-key","level":3,"title":"Etape 4 : CrĂ©er un autre tableau avec une clĂ© liĂ©e (foreign key)","text":"
    CREATE TABLE \"EMPLOYEES\" \n(\n    UserId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Username VARCHAR(50) NOT NULL, \n    FOREIGN KEY (PcId) REFERENCES COMPUTERS(PcId)\n);\n

    Note

    On recommence comme à l'étape 2, en ajoutant une clé étrangÚre foreign key, qui lie une clé extérieure, PcId ici, dans notre second Tableau

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-02-16/","level":1,"title":"Django en gros (16/02/2026)","text":"","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#commencer-un-projet-django","level":2,"title":"Commencer un projet Django","text":"

    Pour commencer un projet Django, c'est super simple :

    -> D'abord, créer un dossier de projet mkdir projet

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip python3 -m venv \"projetvenv\" && source projetvenv/bin/activate && pip install django

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet) django-admin startproject config .

    -> On peut maintenant travailler dans notre projet Django

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#projet-et-applications","level":2,"title":"Projet et applications","text":"

    Django fonctionne sur l'utilisations de petits modules appelĂ©s \"Applications\", ceux-ci composent un projet Django. Elles peuvent ĂȘtre des composants gĂšrant une API qui prend des donnĂ©es JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas...

    Note

    En gros, on a un projet (dossier \"config\") dans lequel on gÚre les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gÚrent leurs tùches propres à elles

    Pour créer une Application on utilise cette commande -> python manage.py startapp api

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#fonctionnement-dune-application","level":2,"title":"Fonctionnement d'une Application","text":"

    Une application se divise avec un fonctionnement en 3 parties

    ModĂšle <--> Vue -> Template

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#modele","level":3,"title":"Modùle","text":"

    Le ModÚle sera la partie manipulation d'objets (comme en PhP), dans le projet Grabber, Django s'occupera de créer la DB sql via ce module

    Warning

    Quand on travaille sur le fichier models.py (généralement celui qui s'occupe de ce module) on doit utiliser deux commandes qui construisent le modÚle

    python manage.py makemigrations\npython manage.py migrate\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#vue","level":3,"title":"Vue","text":"

    La Vue ici, c'est un peu le cerveau du projet, il reçoit les requĂȘtes (par exemple, l'utilisateur qui demande une URL ou alors un fichier bash qui envoie des donnĂ©es comme avec Grabber) et peut renvoyer ces requĂȘtes au ModĂšle pour avoir un rĂ©sultat, etc...

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#template","level":3,"title":"Template","text":"

    Le template, c'est l'interface, par exemple des fichiers HTML. Il reçoit les données brutes de la Vue et les affiche proprement dans une jolie page web.

    Utiliser les données brutes dans une template

    Pour se faire, on doit utiliser cette balise {{ ... }} dans le HTML, cela veut dire pour Django que l'on récupÚre les données d'une clé spécifique

    <!-- Dans les crochets, on appelle la donnée \"hostname\" de la table \"data\"-->\n<title>{{ data.hostname }} - Grabber</title>\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#urls","level":3,"title":"URLs","text":"

    Un autre composant trĂšs important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer.

    Par exemple

    Appeler la racine (localhost:5000/) doit ĂȘtre routĂ© comme ceci :

    from django.urls import path\nfrom api import views\n\nurlpatterns = [\n    # Route de la racine qui appelle la fonction computers_list\n    path('', views.computers_list, name='computers'),\n]\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/javascript/2026-01-30/","level":1,"title":"Javascript (30/01/26)","text":"

    celui qui pete fort dans la classe jv te grabber

    ","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-01-30/#javascript-300126","level":1,"title":"Javascript (30/01/26)","text":"","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-02-06/","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#asynchrone-et-promesses-060226","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"

    Info

    Pour le TP, on a besoin de manipuler des fichiers. Mais avant d'utiliser le module file system dit \"fs\" (qui s'occupe de ce besoin), il faut comprendre un fonctionnement de base en informatique, essentielle aux modules faisant des requĂȘtes a des systemes externes comme fs, l'asynchrone.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#cest-quoi-asynchrone","level":2,"title":"C'est quoi Asynchrone ?","text":"

    Asynchrone permet de ne pas bloquer le code mĂȘme si il n'a pas de rĂ©sultat mais avec promesse, il laisse le code continuer pour trouver une rĂ©ponse et la rapporter comme promis.

    Rien de mieux qu'un exemple concret et gourmand en amont et en aval.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#1-sans-asynchrone","level":3,"title":"1. SANS Asynchrone","text":"
    1. Tu commandes un Tasty Crousty.
    2. Ce neuille de caissier part en cuisine.
    3. Il fait cuire le riz lui-mĂȘme.
    4. Il coupe les tenders.
    5. Il met tout dans la barquette puis sauce.
    6. Et revient pour te donner le Tasty Crousty 67 doro party.
    7. SEULEMENT MAINTENANT, il prend la commande du gwer suivant.

    Résultat : La file d'attente sort du restaurant. Si la cuisson prend 10 minutes, tout le restaurant est bloqué pendant 10 minutes. Bien guez.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#2-avec-asynchrone","level":3,"title":"2. AVEC Asynchrone","text":"
    1. Tu commandes un Tasty Crouspy.
    2. La caissiÚre crie en cuisine \"Un Crousty piquant sucré supplément poulet !\".
    3. Elle te donne un bipeur, faisant donc la promesse de te servir un délicieux Crouspy Tasty.
    4. Puis elle passe directement au client suivant.
    5. Toi, tu vas t'asseoir et tu attends.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#mais-cest-quoi-cette-promesse-promise","level":2,"title":"Mais c'est quoi cette promesse ? (Promise)","text":"

    Note

    â˜ïžđŸ€“ Node.js fonctionne sur un principe de thread unique (monothread)... En gros, il ne peut effectuer qu'une seule tĂąche Ă  la fois.

    Alors pour éviter de bloquer le programme pendant de longues opérations (comme lire des données au fin fond du disque dur), il délÚgue ces tùches a l'ordinateur et utilise un mécanisme de Promesses.

    Dans notre exemple, la Promise, c'est le bipeur.

    Ce boßtier est une promesse. Le restaurant te dit : \"Je n'ai pas ton crousty tout de suite, mais je te promets que je te préviendrai dÚs qu'il y a du nouveau.\"

    Une Promise a toujours 3 états possibles, et seulement 3 :

    1. En attente (Pending) : Le boĂźtier ne fait rien. Le cuisinier travaille. Tu attends.
    2. SuccÚs (Resolved) : Le boßtier vibre ! La promesse est tenue, tu as ton chicken (la donnée est arrivée).
    3. Échec (Rejected) : Le manager arrive et te dit \"DĂ©solĂ©, la cuisine a pris feu, pas de dĂ©licieux crousty pour ce soir\". La promesse est rompue (il y a une erreur).
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemples-async-et-await","level":2,"title":"Exemples async et await","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-dun-async-exo-du-tp-2-de-js","level":3,"title":"Exemple d'un async (exo du TP 2 de JS)","text":"
    files.forEach((fileName) => {\n    fs.readFile(fileName, 'utf8').then((content) => {\n        ...\n    })\n});\n
    • fs.readFile : Envoie le job de lire un fichier Ă  l'ordinateur avec des parametres et quand c'est pret, enrengistre son rĂ©sultat dans content.
    • La Promise : En lançant fs.readFile, celui-ci promet que dĂšs qu'il a un rĂ©sultat, il le renverra dans content
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-concret-await-exo-du-tp-2-de-js","level":3,"title":"Exemple concret await (exo du TP 2 de JS)","text":"

    On peut également demander spécifiquement d'attendre le retour d'une promesse avec await

    const stats = await fs.stat(filename);\n
    • fs.stat : Envoie le job de rĂ©cupĂ©rer les stats d'un fichier Ă  l'ordinateur et quand c'est pret, enrengistre son rĂ©sultat dans stats.
    • La Promise : On te promet un rĂ©sultat dans stats
    • **await** : Tant que l'on a pas de rĂ©sultat, on \"fige\" Ă  cette ligne jusqu'Ă  ce que la promesse est reçue.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-des-apis-et-serveur-http-090226","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-et-apis","level":2,"title":"Fetch et APIs","text":"

    Dans le cadre d'un TP, on a fait des appels à des APIs externes comme celle du CNAM ou encore openweathermap pour intégrer les données actuelles dans un script JS.

    Pour faire des appels, on utlise la mĂ©thode Asynchrone du cours prĂ©cĂ©dent qui nous permettra de faire des appels des APIs sans arrĂȘter le programme en attendant la rĂ©ponse. Une fonction nous permet de faire cet appel : fetch()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-le-coursier","level":3,"title":"fetch() (Le coursier)","text":"

    fetch Ă  le rĂŽle de coursier, c'est lui qui effectuera la requĂȘte HTTP (GET par dĂ©faut).

    • Ce que ça fait : Ça envoie un ping Ă  une URL pour aller chercher des data.

    • Et ça renvoie une promesse en attendant la rĂ©ponse de l'API

    Pour traiter nos réponses proprement, on combine nos fetch avec le module json()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#json-le-traducteur","level":3,"title":"json() (Le traducteur)","text":"

    Quand fetch revient, il te ramĂšne un gros paquet brut (un Response object).

    • Ce que ça fait : Ça prend ce paquet et ça le transforme en Objet JavaScript utilisable (avec des accolades {} et tout).

    • Note : C'est aussi asynchrone, donc il faut un await devant aussi.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#exemple-du-tp","level":3,"title":"Exemple du TP","text":"

    Dans une fonction async fetchCityInfo(), on essayera de fetch via cette fonction :

    // Attend de fetch les données d'une ville donnée par l'utilisateur via la variable cityName\nconst geoRes = await fetch(`https://geoservice.cnam.fr/api/cities?name=${encodeURIComponent(cityName)}`);\n

    Puis on encode les données brutes reçues dans un joli tableau JSON :

    // La constante cities récupÚre le résultat geoRes et le range en JSON\nconst cities = await geoRes.json();\n

    Plus tard, on refait un fetch de données avec une clé API pour openweathermap (cas concret en gros) :

    //Comme tout à l'heure, on fetch les données de l'API et on attend la réponse via await\nconst weatherRes = await fetch(`http://api.weatherapi.com/v1/current.json?q=${encodeURIComponent(cityName)}&key=****`);\n

    Bravo, tu as fait un appel d'API et l'a rangé dans un beau tableau JSON.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#serveur-http","level":2,"title":"Serveur HTTP","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"projects/2025-12-05/","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#grabber-docs","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#but-du-projet","level":2,"title":"But du projet","text":"

    Grabber est un hub admin pour fetch les données hardware d'un parc informatique via un script qui fetch les ordinateurs (d'abord sur linux, plus tard intégration d'autres OS), lie les ordinateurs a des utilisateurs (ex. employés pour administration en entreprise) et de check d'un coup d'oeil les updates disponibles + état du software

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#fonctionnement","level":2,"title":"Fonctionnement","text":"

    Pour fonctionner, grabber a plusieures tùches réparties par différents éléments dans le projet : -> Cerveau : Coordonne les différentes tùches du programme comme lancer le serveur admin, fetch les données d'un ordinateur dans une BDD (grabber.sh) -> Corps : Serveur admin python qui affichera les données stockées dans une BDD type sqlite

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#technologies","level":2,"title":"Technologies","text":"
    • Bash -> Script qui fetch et lance la console admin
    • Python
      • Django -> pour host le site admin en local
    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#avancement","level":2,"title":"Avancement","text":"
    • Script bash
      • Fetch le hardware
      • Uninstaller
    • Interface admin web (wip)
    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2026-01-23/","level":1,"title":"Docs et notes avec Zensical","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#docs-et-notes-avec-zensical","level":1,"title":"Docs et notes avec Zensical","text":"

    Note

    Pendant la création de cette note j'ai migré de mkdocs à Zensicle (maj de mkdocs en meilleur) et donc j'utilise une config qui réutilise les fichiers et la structure mkdocs.

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#pourquoi-faire","level":2,"title":"Pourquoi faire ?","text":"
    • Tester de crĂ©er un nouvel environnement en python
    • Travailler avec des modules pip pour amĂ©liorer le projet
    • Changer un peu de grabber
    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#comment-zensicle-marche","level":2,"title":"Comment Zensicle marche","text":"
    • mkdocs.yml est la navbar du site
    • dossier docs est la racine du site mkdocs
    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#hebergement-via-github-github-actions","level":2,"title":"Hébergement via Github (Github Actions)","text":"

    Pour héberger mon site de documentation en ligne, j'utilise Github via Github Actions qui est la solution parfaite pour un projet léger comme celui-ci.

    Docs pour host sur Github

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-02-13/","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#faire-un-portfolio-en-js-moderne","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#but-du-projet","level":2,"title":"But du projet","text":"

    Ce projet est un moyen de toucher concrÚtement au JavaScript avec l'utilisation de React, pour faire un site portfolio personnel dans le but de promouvoir mes compétences personnelles et professionnelles ainsi que mes projets et hobbies à destination des professionnels.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#stack-de-travail","level":2,"title":"Stack de travail","text":"

    On doit choisir quelle stack, c'est Ă  dire quel combo d'outils on utilisera pour faire fonctionner le tout. Dans une stack de projet Web moderne, on doit choisir un Moteur, un Framework et le compilateur. Mais Ă  quoi servent-ils ?

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-moteur-build-tool","level":3,"title":"Le Moteur (Build tool)","text":"

    Souvent appelé \"moteur\" par abus de langage, c'est l'outil qui fait tourner tout l'écosystÚme. Il coordonne le compilateur, le serveur et les fichiers.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-framework","level":3,"title":"Le Framework","text":"

    Le framework est un ensemble d'outils et de rĂšgles de construction. Au lieu de partir d'une page blanche, on utilise des blocs dĂ©jĂ  prĂȘtes et ça Ă©vite de recrĂ©er du code que la communautĂ© aurait dĂ©jĂ  Ă©crit.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-compilateur","level":3,"title":"Le Compilateur","text":"

    C'est le mĂȘme principe que dans plein d'autres languages comme le C par exemple, il reprend notre code, ici le JSX (un JavaScript mĂ©langĂ© Ă  du HTML) en JS et HTML standard pour qu'un navigateur comprenne correctement.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#choix","level":3,"title":"Choix","text":"

    Il existe donc plusieurs Moteurs (Vite, Next.JS, ...), Frameworks (React, Vue, Svelte, ...) et Compilateurs (Babel, SWC, ...) mais pour ce projet on retiendra une stack simple pour un débutant et efficace pour tester et déployer.

    Stack choisie

    • Moteur : Vite -> Le moteur le plus rapide, sans fioritures et simple d'utilisation avec des outils de bases trĂšs utiles
    • Framework : React -> Le framework le plus populaire avec des tonnes de librairies deja prĂȘtes et une communautĂ© prĂ©sente
    • Compilateur : JS/SWC -> TrĂšs efficace et rapide et simple et utilnous permet d'utilise JS
    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#points-importants-du-projet","level":2,"title":"Points importants du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#creation-du-projet","level":3,"title":"Création du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#packages-npm","level":3,"title":"Packages npm","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#hebergement-avec-vercel","level":3,"title":"Hébergement avec Vercel","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#cles-denvironnements","level":3,"title":"Clés d'environnements","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]}]} \ No newline at end of file +{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Bienvenue dans mes notes de devops","text":"","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#bienvenue-dans-mes-notes-de-devops","level":1,"title":"Bienvenue dans mes notes de devops","text":"","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#structure","level":2,"title":"Structure","text":"

    -> cours (Notes sur les cours)

    -> projects (Notes sur des nouveaux projets)

    -> liens cools (mes sites favoris)

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"links/","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#design","level":2,"title":"🎹 Design","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#developpement","level":2,"title":"đŸ’œ Developpement","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"learn/devops/2025-10-30/","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"

    avant cette note y'a rien a gratter, j'installais linux pour la 387e fois

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#cest-quoi-linux-301025","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"

    Warning

    Page en travaux, doit ĂȘtre finie avec toutes les informations que j'ai sur Linux en gĂ©nĂ©ral

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#arborescence-type-sur-unix","level":2,"title":"Arborescence type sur UNIX","text":"

    Unix a gĂ©nĂ©ralement cette arborescence que ce soit sur n'importe quelle distro Linux Ă©galement Android pour les tĂ©lĂ©phones et mĂȘme quelques similitudes sur macOS.

    /               # Racine du disque\n├── /bin/       # Contient les commandes de base\n├── /boot/      # Fichiers de demarrage\n├── /dev/       # Tout ce qui est liĂ© aux pĂ©riphĂ©riques\n├── /etc/       # Fichiers de configuration\n├── /home/      # RĂ©pertoires utilisateurs\n├── /lib/       # BibliothĂšques logicielles\n├── /mnt/       # Point de montage pour les systĂšmes de fichier temporaires\n├── /media/     # Point de montage pour les disques temporaires\n├── /opt/       # Logiciels optionnels, la ou on installera des programmes maison\n├── /root/      # RĂ©pertoire du user root\n├── /var/       # Variable, contient des logs, ect...\n├── /usr/       # Contient sensiblement la mĂȘme chose que la racine mais sans ĂȘtre utile au fonctionnement du systĂšme\n├── /srv/       # Services hĂ©bergĂ©s sur le systĂšmes (FTP, HTTP, ect...)\n├── /run/       # Emplacement mĂ©moire des programmes\n└── /tmp/       # Temporaire\n
    source de l'arbo.

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-11-28/","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"

    mon big ass qui fait sudo rm -rf / sans réfléchir

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-sh-pour-les-idiots-281125","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#cheatsheet-de-plein-de-commandes","level":2,"title":"Cheatsheet de plein de commandes","text":"

    Depuis le début, beaucoup de commandes on été utilisées, du coup je note ici les commandes utilisées depuis le début et a quoi elles servent en gros

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-de-base","level":3,"title":"Commandes de base","text":"
    1. sudo : lance une commande avec les superdroits, peut manipuler tout le pc avec en gros

      sudo [commande]\n

    2. ls : liste les fichiers d'un dossier

      # -a pour afficher les fichiers cachés / -l pour afficher en liste avec plus d'infos\nls [options] [fichier|dir]\n

    3. cd : changer de dossier

      # ~ pour aller au répertoire home / .. pour revenir en arriere\ncd [dir]\n

    4. pwd : affiche le répertoire actuel

      pwd\n

    5. touch : affiche le contenu d'un fichier

      touch [fichier]\n

    6. nano : éditeur de texte

      nano [fichier]\n

    7. mkdir : supprime ce qu'on lui donne

      mkdir [options] [fichier|dir]\n

    8. rm : supprime ce qu'on lui donne

      # -r pour supprimer un dossier et son contenu (recursive) (`rmdir` le fait aussi)\n# -f force la commande\nrm [options] [fichier|dir]\n

    9. cp : copie...

      cp [options] [source] [destination]\n

    10. mv : ...et déplace

      mv [options] [source] [destination]\n

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#les-caracteres-dassociations","level":3,"title":"Les caractùres d'associations","text":"

    | (le pipe) -> prend le résultat de la commande de gauche et le donne à celle de droite

    exemple : liste tout un répertoire, mais n'affiche que les résultats qui sont \"feur\"

    ls -la | grep \"feur\"\n

    > et >>

    • envoie le rĂ©sultat d'une commande dans un fichier texte
    • > Ă©crase le fichier / >> ajoute Ă  la fin sans effacer
    • ex: echo \"coucou\" > fichier.txt
    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#permissions-et-utilisateurs","level":3,"title":"Permissions et Utilisateurs","text":"

    chmod [droits] [fichier] - change les permissions d'un fichier (qui peut lire/écrire/exécuter) - chmod +x [fichier] rend un script exécutable (trÚs important) - chmod 777 [fichier] donne tous les droits à tout le monde (dangereux mais ça dépanne)

    chown [user]:[groupe] [fichier] - change le propriétaire du fichier (si t'as copié un truc en sudo et que tu peux plus le toucher)

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#lecture-et-recherche-dans-les-fichiers","level":3,"title":"Lecture et recherche dans les fichiers","text":"

    cat [fichier] - affiche tout le contenu d'un fichier d'un coup dans le terminal - utile pour les petits fichiers, sinon ça inonde l'écran

    less [fichier] - affiche le contenu page par page (on peut scroller) - appuyer sur q pour quitter

    head [fichier] / tail [fichier] - affiche juste le début (head) ou la fin (tail) d'un fichier - tail -f [fichier] hyper utile pour voir les logs en direct (ça attend les nouvelles lignes)

    grep [mot] [fichier] - cherche un mot ou une phrase spécifique dans un fichier (le ctrl+f du terminal) - -r pour chercher dans tous les dossiers (recursive) / -i pour ignorer les majuscules

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-12-12/","level":1,"title":"Git pour les neuilles (12/12/25)","text":"

    completement zehef pcq t'as pas git push

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#git-pour-les-neuilles-121225","level":1,"title":"Git pour les neuilles (12/12/25)","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#creer-un-git","level":2,"title":"CrĂ©er un git","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-le-projet-existe-deja","level":3,"title":"-> Si le projet existe deja","text":"
    • On clone le projet au sein d'un dossier, celui-ci sera dans son dossier de travail. -> git clone (url du projet git)
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-sinon-creer-le-projet","level":3,"title":"-> Sinon crĂ©er le projet","text":"
    • CrĂ©e le projet git Ă  partir de ce dossier. -> git init (dossier de travail)
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#ignorer-des-fichiersdossiers","level":2,"title":"Ignorer des fichiers/dossiers","text":"
    • Ajouter des interdictions dans .gitignore

    echo gbvenv/ >> .gitignore <- on indique via un echo qui écrira dans le fichier .gitignore qu'on ne veut pas push le dossier \"gbvenv\" ici, un fichier on ne mettera pas le slash (logique en amont)

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#une-fois-que-de-fichiers-sont-dispos-empaqueter","level":2,"title":"Une fois que de fichiers sont dispos, empaqueter !","text":"

    Pour envoyer un projet git, c'est comme envoyer un colis Ă  la poste, d'abord, on met nos affaires dans le colis

    Plusieures possibilitĂ©s ☝

    • Ajoute TOUS les fichiers du dossier via l'option -A ou --all -> git add -A

    • Ajoute SEULEMENT les modifications et suppressions (donc pas de nouveaux fichiers) -> git add -u

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#etiqueter-le-paquet","level":2,"title":"Etiqueter le paquet","text":"

    Ensuite, on rempli l'étiquette du colis et on la colle au colis

    • On Ă©crit une note recap courte du commit sur le git -> git commit -m \"(message du commit)\"
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#deposer-le-colis","level":2,"title":"DĂ©poser le colis","text":"

    Enfin pour push, c'est a dire déposer le colis au bureau de poste pour l'envoi, on fait :

    • On envoie le paquet de l'origine Ă  la branche souhaitĂ©e dans le git -> git push -u origin (branche souhaitĂ©e)

    Info

    -u veut dire ce que dit la doc en gros

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-erreur","level":3,"title":"-> SI ERREUR","text":"

    Dans le cas ou un fichier/dossier a été supprimé autre part avant de push nos modifs

    • Merge de force les deux branches pour ne faire qu'une branche git config pull.rebase false
    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#utiliser-deux-branches-differentes","level":2,"title":"Utiliser deux branches diffĂ©rentes","text":"

    Dans le cas ou l'on veut travailler avec une seconde branche

    • Pour switch de branche de travail -> git checkout (branche souhaitĂ©e)

    • Pour merge en ecrasant la branche souhaitĂ©e âŹ‡ïž

      git merge -s ours main\ngit checkout main\ngit merge (branche Ă  merge)\n

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2026-01-22/","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"

    florian quand je lui demande de l'aide

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#sql-pour-les-tung-tung-tung-sahur-220126","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#modele-mvc","level":2,"title":"Modùle MVC","text":"

    Le modÚle MVC est une façon de concevoir un projet logiciel, en gros on sépare celui-ci en trois grandes parties distinctes séparant la logique de la vue et rend le travail plus facile.

    ModĂšle MVC en prenant celui de grabber par exemple :

    - Model = Base De Donnée (ex: EMPLOYEES, COMPUTERS)\n- View = Tableau de bord, Site\n- Controller = Cerveau qui dirige les deux parties Model et View (ex: app.py)\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#tuto-comment-cr2er-une-bdd-sql-facilement-en-2-minutes-super-facile","level":2,"title":"TUTO : COMMENT CR2ER UNE BDD SQL FACILEMENT EN 2 MINUTES (SUPER FACILE)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#structure-dune-base-de-donnees","level":3,"title":"Structure d'une Base De DonnĂ©es","text":"

    celle de grabber pour l'exemple

    BDD (Etape 1) - grabberman\n├── TABLES (Etape 2) - COMPUTERS\n│   ├── Colonne (Etape 3) - PcId, entier/clĂ© primaire\n│   │   └── DonnĂ©e (Etape 4)\n│   ├── Colonne (Etape 3) - Hostname, chaĂźne de charactĂšre\n│   └── Colonne (Etape 3) - MacAddress, chaĂźne de charactĂšre\n└── TABLES (Etape 2) - EMPLOYEES\n    ├── Colonne (Etape 3) - UserId, entier/clĂ© primaire\n    ├── Colonne (Etape 3) - Username, chaĂźne de charactĂšre\n    └── Colonne (Etape 3) - PcId, clĂ© secondaire\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-1-creer-une-bdd","level":3,"title":"Etape 1 : CrĂ©er une BDD","text":"

    sqlite3 grabberman.db <- Commande qui crée une DB qu'on appellera ici \"grabberman\"

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-2-creer-une-table","level":3,"title":"Etape 2 : CrĂ©er une table","text":"
    CREATE TABLE \"COMPUTERS\" \n(\n    PcId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Hostname VARCHAR(50) NOT NULL, \n    MacAddress VARCHAR(50)\n);\n

    Note

    Ici on crée une table dans laquelle on stockera des données (des PC que l'on grab par exemple)

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-3-ajouter-des-donnees-dans-une-table","level":3,"title":"Etape 3 : Ajouter des donnĂ©es dans une table","text":"

    INSERT into COMPUTERS (Hostname, MacAddress) VALUES ('mypc', '1B:12:F0:FL:94');

    Note

    Pour ajouter une donnée dans une tableau, on INSERE dans le TABLEAU donné les VALEURS dans les Colonnes

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-4-creer-un-autre-tableau-avec-une-cle-liee-foreign-key","level":3,"title":"Etape 4 : CrĂ©er un autre tableau avec une clĂ© liĂ©e (foreign key)","text":"
    CREATE TABLE \"EMPLOYEES\" \n(\n    UserId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Username VARCHAR(50) NOT NULL, \n    FOREIGN KEY (PcId) REFERENCES COMPUTERS(PcId)\n);\n

    Note

    On recommence comme à l'étape 2, en ajoutant une clé étrangÚre foreign key, qui lie une clé extérieure, PcId ici, dans notre second Tableau

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/javascript/2026-01-30/","level":1,"title":"Javascript (30/01/26)","text":"

    celui qui pete fort dans la classe jv te grabber

    ","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-01-30/#javascript-300126","level":1,"title":"Javascript (30/01/26)","text":"","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-02-06/","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#asynchrone-et-promesses-060226","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"

    Info

    Pour le TP, on a besoin de manipuler des fichiers. Mais avant d'utiliser le module file system dit \"fs\" (qui s'occupe de ce besoin), il faut comprendre un fonctionnement de base en informatique, essentielle aux modules faisant des requĂȘtes a des systemes externes comme fs, l'asynchrone.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#cest-quoi-asynchrone","level":2,"title":"C'est quoi Asynchrone ?","text":"

    Asynchrone permet de ne pas bloquer le code mĂȘme si il n'a pas de rĂ©sultat mais avec promesse, il laisse le code continuer pour trouver une rĂ©ponse et la rapporter comme promis.

    Rien de mieux qu'un exemple concret et gourmand en amont et en aval.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#1-sans-asynchrone","level":3,"title":"1. SANS Asynchrone","text":"
    1. Tu commandes un Tasty Crousty.
    2. Ce neuille de caissier part en cuisine.
    3. Il fait cuire le riz lui-mĂȘme.
    4. Il coupe les tenders.
    5. Il met tout dans la barquette puis sauce.
    6. Et revient pour te donner le Tasty Crousty 67 doro party.
    7. SEULEMENT MAINTENANT, il prend la commande du gwer suivant.

    Résultat : La file d'attente sort du restaurant. Si la cuisson prend 10 minutes, tout le restaurant est bloqué pendant 10 minutes. Bien guez.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#2-avec-asynchrone","level":3,"title":"2. AVEC Asynchrone","text":"
    1. Tu commandes un Tasty Crouspy.
    2. La caissiÚre crie en cuisine \"Un Crousty piquant sucré supplément poulet !\".
    3. Elle te donne un bipeur, faisant donc la promesse de te servir un délicieux Crouspy Tasty.
    4. Puis elle passe directement au client suivant.
    5. Toi, tu vas t'asseoir et tu attends.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#mais-cest-quoi-cette-promesse-promise","level":2,"title":"Mais c'est quoi cette promesse ? (Promise)","text":"

    Note

    â˜ïžđŸ€“ Node.js fonctionne sur un principe de thread unique (monothread)... En gros, il ne peut effectuer qu'une seule tĂąche Ă  la fois.

    Alors pour éviter de bloquer le programme pendant de longues opérations (comme lire des données au fin fond du disque dur), il délÚgue ces tùches a l'ordinateur et utilise un mécanisme de Promesses.

    Dans notre exemple, la Promise, c'est le bipeur.

    Ce boßtier est une promesse. Le restaurant te dit : \"Je n'ai pas ton crousty tout de suite, mais je te promets que je te préviendrai dÚs qu'il y a du nouveau.\"

    Une Promise a toujours 3 états possibles, et seulement 3 :

    1. En attente (Pending) : Le boĂźtier ne fait rien. Le cuisinier travaille. Tu attends.
    2. SuccÚs (Resolved) : Le boßtier vibre ! La promesse est tenue, tu as ton chicken (la donnée est arrivée).
    3. Échec (Rejected) : Le manager arrive et te dit \"DĂ©solĂ©, la cuisine a pris feu, pas de dĂ©licieux crousty pour ce soir\". La promesse est rompue (il y a une erreur).
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemples-async-et-await","level":2,"title":"Exemples async et await","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-dun-async-exo-du-tp-2-de-js","level":3,"title":"Exemple d'un async (exo du TP 2 de JS)","text":"
    files.forEach((fileName) => {\n    fs.readFile(fileName, 'utf8').then((content) => {\n        ...\n    })\n});\n
    • fs.readFile : Envoie le job de lire un fichier Ă  l'ordinateur avec des parametres et quand c'est pret, enrengistre son rĂ©sultat dans content.
    • La Promise : En lançant fs.readFile, celui-ci promet que dĂšs qu'il a un rĂ©sultat, il le renverra dans content
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-concret-await-exo-du-tp-2-de-js","level":3,"title":"Exemple concret await (exo du TP 2 de JS)","text":"

    On peut également demander spécifiquement d'attendre le retour d'une promesse avec await

    const stats = await fs.stat(filename);\n
    • fs.stat : Envoie le job de rĂ©cupĂ©rer les stats d'un fichier Ă  l'ordinateur et quand c'est pret, enrengistre son rĂ©sultat dans stats.
    • La Promise : On te promet un rĂ©sultat dans stats
    • **await** : Tant que l'on a pas de rĂ©sultat, on \"fige\" Ă  cette ligne jusqu'Ă  ce que la promesse est reçue.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-des-apis-et-serveur-http-090226","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-et-apis","level":2,"title":"Fetch et APIs","text":"

    Dans le cadre d'un TP, on a fait des appels à des APIs externes comme celle du CNAM ou encore openweathermap pour intégrer les données actuelles dans un script JS.

    Pour faire des appels, on utlise la mĂ©thode Asynchrone du cours prĂ©cĂ©dent qui nous permettra de faire des appels des APIs sans arrĂȘter le programme en attendant la rĂ©ponse. Une fonction nous permet de faire cet appel : fetch()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-le-coursier","level":3,"title":"fetch() (Le coursier)","text":"

    fetch Ă  le rĂŽle de coursier, c'est lui qui effectuera la requĂȘte HTTP (GET par dĂ©faut).

    • Ce que ça fait : Ça envoie un ping Ă  une URL pour aller chercher des data.

    • Et ça renvoie une promesse en attendant la rĂ©ponse de l'API

    Pour traiter nos réponses proprement, on combine nos fetch avec le module json()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#json-le-traducteur","level":3,"title":"json() (Le traducteur)","text":"

    Quand fetch revient, il te ramĂšne un gros paquet brut (un Response object).

    • Ce que ça fait : Ça prend ce paquet et ça le transforme en Objet JavaScript utilisable (avec des accolades {} et tout).

    • Note : C'est aussi asynchrone, donc il faut un await devant aussi.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#exemple-du-tp","level":3,"title":"Exemple du TP","text":"

    Dans une fonction async fetchCityInfo(), on essayera de fetch via cette fonction :

    // Attend de fetch les données d'une ville donnée par l'utilisateur via la variable cityName\nconst geoRes = await fetch(`https://geoservice.cnam.fr/api/cities?name=${encodeURIComponent(cityName)}`);\n

    Puis on encode les données brutes reçues dans un joli tableau JSON :

    // La constante cities récupÚre le résultat geoRes et le range en JSON\nconst cities = await geoRes.json();\n

    Plus tard, on refait un fetch de données avec une clé API pour openweathermap (cas concret en gros) :

    //Comme tout à l'heure, on fetch les données de l'API et on attend la réponse via await\nconst weatherRes = await fetch(`http://api.weatherapi.com/v1/current.json?q=${encodeURIComponent(cityName)}&key=****`);\n

    Bravo, tu as fait un appel d'API et l'a rangé dans un beau tableau JSON.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#serveur-http","level":2,"title":"Serveur HTTP","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/python/2026-01-16/","level":1,"title":"pip et environnements virtuels (16/01/26)","text":"

    7alouf ouvre grabber apres 9h brainrot tsunami

    ","path":["Cours","🐍 Python","pip et environnements virtuels (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/python/2026-01-16/#pip-et-environnements-virtuels-160126","level":1,"title":"pip et environnements virtuels (16/01/26)","text":"","path":["Cours","🐍 Python","pip et environnements virtuels (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/python/2026-01-16/#python-et-ses-environnements-virtuels","level":2,"title":"Python et ses environnements virtuels","text":"
    • En python, on peut travailler dans des \"sandboxes\" ou toutes les libraires installĂ©es resteront contenues dedans

    Utile de créer donc un environnement pour chaque projet afin de en pas perturber d'autres projets avec des milliers de packages inutiles en gros

    python3 -m venv gbvenv <- permet de créer un environnement (venv crée l'environnement \"gbvenv\")

    source gbvenv/bin/activate <- lance cet environnement pour travailler dedans

    • En parlant de packages, parlons de ✹pip✹

    pip est le packages manager de python, en l'appelant, on peut installer des packages comme uvicorn par exemple, utile pour grabber

    pip install --upgrade pip <- update les packages

    python -m pip install *** <- installe le package qu'on notera a la place des ***

    pip freeze >> requirements.txt <- commande super utile pour partager les dependances necessaires pour faire fonctionner son projet sur un autre environnement

    deactivate <- désactive l'environnement virtuel

    ","path":["Cours","🐍 Python","pip et environnements virtuels (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/python/2026-01-16/#script-de-roi-qui-automatise-le-process","level":2,"title":"Script de roi qui automatise le process","text":"
    • J'ai codĂ© un script qui automatise ce process avec une seule commande :

    bash <(curl -fsSL https://raw.githubusercontent.com/buchtioof/venv-setup/main/venvsetup.sh)

    Pour en apprendre plus : le git du projet

    ","path":["Cours","🐍 Python","pip et environnements virtuels (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/python/2026-02-16/","level":1,"title":"Django en gros (16/02/2026)","text":"","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#commencer-un-projet-django","level":2,"title":"Commencer un projet Django","text":"

    Pour commencer un projet Django, c'est super simple :

    -> D'abord, créer un dossier de projet

    `mkdir projet`\n

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip

    `python3 -m venv \"projetvenv\" && source projetvenv/bin/activate && pip install django`\n

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet)

    `django-admin startproject config .`\n

    -> On peut maintenant travailler dans notre projet Django

    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#projet-et-applications","level":2,"title":"Projet et applications","text":"

    Django fonctionne sur l'utilisations de petits modules appelĂ©s \"Applications\", ceux-ci composent un projet Django. Elles peuvent ĂȘtre des composants gĂšrant une API qui prend des donnĂ©es JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas...

    Note

    En gros, on a un projet (dossier \"config\") dans lequel on gÚre les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gÚrent leurs tùches propres à elles

    Pour créer une Application on utilise cette commande -> python manage.py startapp nomdel'app

    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#fonctionnement-dune-application","level":2,"title":"Fonctionnement d'une Application","text":"

    Une application se divise avec un fonctionnement en 3 parties

    ModĂšle <--> Vue -> Template

    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#modele","level":3,"title":"Modùle","text":"

    Le ModÚle sera la partie manipulation d'objets (comme en PhP), dans le projet Grabber, Django s'occupera de créer la DB sql via ce module

    Warning

    Quand on travaille sur le fichier models.py (généralement celui qui s'occupe de ce module) on doit utiliser deux commandes qui construisent le modÚle

    python manage.py makemigrations\npython manage.py migrate\n
    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#vue","level":3,"title":"Vue","text":"

    La Vue ici, c'est un peu le cerveau du projet, il reçoit les requĂȘtes (par exemple, l'utilisateur qui demande une URL ou alors un fichier bash qui envoie des donnĂ©es comme avec Grabber) et peut renvoyer ces requĂȘtes au ModĂšle pour avoir un rĂ©sultat, etc...

    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#template","level":3,"title":"Template","text":"

    Le template, c'est l'interface, par exemple des fichiers HTML. Il reçoit les données brutes de la Vue et les affiche proprement dans une jolie page web.

    Utiliser les données brutes dans une template

    Pour se faire, on doit utiliser cette balise {{ ... }} dans le HTML, cela veut dire pour Django que l'on récupÚre les données d'une clé spécifique

    <!-- Dans les crochets, on appelle la donnée \"hostname\" de la table \"data\"-->\n<title>{{ data.hostname }} - Grabber</title>\n
    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/python/2026-02-16/#urls","level":2,"title":"URLs","text":"

    Un autre composant trĂšs important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer.

    Par exemple

    Appeler la racine (localhost:5000/) doit ĂȘtre routĂ© comme ceci :

    from django.urls import path\nfrom api import views\n\nurlpatterns = [\n    # Route de la racine qui appelle la fonction computers_list\n    path('', views.computers_list, name='computers'),\n]\n
    ","path":["Cours","🐍 Python","Django en gros (16/02/2026)"],"tags":[]},{"location":"projects/2025-12-05/","level":1,"title":"Alternavive GLSI lĂ©ger : Grabber","text":"","path":["Projets","Alternavive GLSI lĂ©ger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#alternavive-glsi-leger-grabber","level":1,"title":"Alternavive GLSI lĂ©ger : Grabber","text":"","path":["Projets","Alternavive GLSI lĂ©ger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#introduction-au-projet","level":2,"title":"Introduction au projet","text":"","path":["Projets","Alternavive GLSI lĂ©ger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#besoin","level":3,"title":"Besoin","text":"

    Grabber part d'un besoin de gérer un petit parc informatique (dizaines d'ordinateurs) dans un espace de travail (type entreprise). On peut déja noter certains besoins majeurs : gérer des ordinateurs à distance, connaitre d'un coup d'oeil leur état (updates, hardware, software) et établir une liste de liens entre ordinateurs et employés.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#solution","level":3,"title":"Solution","text":"

    Grabber donc serait dans l'idĂ©e capable de rĂ©pondre Ă  ces besoins, via une interface web administrateur consultable par le DSI d'une entreprise par exemple. Pour la gestion d'un parc informatique de petite taille/toute petite, on proposera un produit simple, lĂ©ger et plug and play. Via une simple commande de terminal et une configuration au prĂ©alable des ordinateurs cibles capable de recevoir des requĂȘtes SSH, Grabber sera capable de couvrir un maximum des besoins.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#choix-de-la-stack-technologique","level":2,"title":"Choix de la stack technologique","text":"

    Le projet en général se basera sur du Bash et du Python pour gérer l'API et le panel Admin.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#-bash","level":3,"title":"-> Bash","text":"

    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...)

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#-python-django","level":3,"title":"-> Python (Django)","text":"

    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.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#-sqlite","level":3,"title":"-> SQLite","text":"

    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.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#architecture-technique","level":2,"title":"Architecture technique","text":"","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#chef-du-service-grabbersh","level":3,"title":"Chef du service : grabber.sh","text":"

    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

    Entre autre, il devra :

    -> Initialiser l'environnement virtuel Python (nommé gbvenv)

    -> 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)

    -> 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)

    -> Automatiser le processus de \"migrations\" (python manage.py migrate)

    -> Créer un token de session qui sécurisera les communications entre Django <-> Grabber <-> Alfred

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#lagent-de-collecte-alfredrun","level":3,"title":"L'agent de collecte : alfred.run","text":"

    Info

    Au dĂ©part une fonction inclue dans grabber.sh, il a finalement Ă©tĂ© dĂ©cidĂ© de sĂ©parer les deux pour plus de lisibilitĂ© et de facilitĂ© sur la suite pour ĂȘtre executĂ© en autonomie dans une machine cible.

    Son rÎle est de fetch les données de la cible dont on a besoin pour répondre au besoin, données Hardware et Software. Toujours en Bash pour sa facilité d'utilisation dans des tùches d'extraction de données de l'OS.

    En résumé, il devra donc :

    -> Récupérer les données systÚme (avec des outils natifs comme les netutils ou bien la librairie externe inxi)

    -> Empaqueter ces données en un objet JSON (avec jq)

    -> Envoyer les donnĂ©es via une requĂȘte Ă  l'endpoint du serveur Django (avec une requĂȘte HTTP POST curl)

    -> Renvoyer le token de session pour sécuriser la communication

    -> Le tout est codĂ© dans un paquet .run qui contient les librairies requises comme jq et inxi pour ĂȘtre utilisable sur un maximum d'ordinateurs Linux (compilĂ© avec makeself)

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#deploiement-dalfred","level":3,"title":"Déploiement d'Alfred","text":"

    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.

    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.

    ","path":["Projets","Alternavive GLSI lĂ©ger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#requete-avec-paramiko","level":4,"title":"RequĂȘte avec Paramiko","text":"

    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)

    Le cycle de la requĂȘte est le suivant :

    -> Connexion SSH à la cible.\n\n-> Transfert SFTP de l'exécutable alfred.run vers le répertoire temporaire /tmp/.\n\n-> Exécution distante en injectant l'IP du serveur (request.get_host()) et \n   le Token de session.\n\n-> Nettoyage des traces (rm /tmp/alfred.run).\n
    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#protection-de-lapi-avec-un-secret-partage","level":3,"title":"Protection de l'API avec un \"Secret Partagé\"","text":"

    Pourquoi éviter le CSRF pour une API machine ? Les limites de l'authentification par navigateur pour des scripts automatisés.

    Rotation dynamique des clés (Token) : * Explication de la génération du SESSION_TOKEN (via openssl rand) à chaque lancement de grabber.sh.

    Injection dans settings.json lu par Django (config/settings.py).

    Nettoyage sécurisé (Trap) : L'utilisation de trap dans le lanceur Bash pour effacer le token du JSON à la fermeture du serveur (Ctrl+C), évitant de laisser des identifiants sensibles en clair.

    La validation cÎté Django (api.py) : Comment la vue receive_system_info compare le header HTTP_X_API_KEY avec le token mémorisé avant d'accepter les données.

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#panel-admin-django","level":3,"title":"Panel Admin (Django)","text":"
    7.1. Le modÚle de données (models.py) : Présentation de la table SystemInfo, avec l'adresse MAC comme clé d'unicité (pour mettre à jour un PC existant plutÎt que de le dupliquer).\n\n7.2. L'expérience utilisateur (HTML/CSS/JS) :\n\n    Affichage propre des données récupérées.\n\n    Gestion des erreurs SSH avec les messages Django (succÚs/échec).\n\n    L'ajout d'un script JavaScript (Spinner de chargement) lors du déploiement SSH pour éviter les clics multiples.\n
    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#vue-densemble-du-projet-et-conclusions","level":2,"title":"Vue d'ensemble du projet et Conclusions","text":"","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#difficultes-rencontrees-et-apprentissages","level":3,"title":"Difficultés rencontrées et apprentissages","text":"","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#bilan","level":3,"title":"Bilan","text":"","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#axes-damelioration","level":3,"title":"Axes d'amélioration","text":"

    Passer le déploiement SSH sur un systÚme de clés asymétriques (Clés Publiques/Privées) plutÎt que par mot de passe.

    Déploiement du serveur maßtre via Docker pour une approche 100% \"Release\".

    Ajout d'un historique de l'état (ex: voir si un PC est hors ligne depuis X jours).

    ","path":["Projets","Alternavive GLSI léger : Grabber"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2026-01-23/","level":1,"title":"Docs et notes avec Zensical","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#docs-et-notes-avec-zensical","level":1,"title":"Docs et notes avec Zensical","text":"

    Note

    Pendant la création de cette note j'ai migré de mkdocs à Zensicle (maj de mkdocs en meilleur) et donc j'utilise une config qui réutilise les fichiers et la structure mkdocs.

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#pourquoi-faire","level":2,"title":"Pourquoi faire ?","text":"
    • Tester de crĂ©er un nouvel environnement en python
    • Travailler avec des modules pip pour amĂ©liorer le projet
    • Changer un peu de grabber
    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#comment-zensicle-marche","level":2,"title":"Comment Zensicle marche","text":"
    • mkdocs.yml est la navbar du site
    • dossier docs est la racine du site mkdocs
    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#hebergement-via-github-github-actions","level":2,"title":"Hébergement via Github (Github Actions)","text":"

    Pour héberger mon site de documentation en ligne, j'utilise Github via Github Actions qui est la solution parfaite pour un projet léger comme celui-ci.

    Docs pour host sur Github

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-02-13/","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#faire-un-portfolio-en-js-moderne","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#but-du-projet","level":2,"title":"But du projet","text":"

    Ce projet est un moyen de toucher concrÚtement au JavaScript avec l'utilisation de React, pour faire un site portfolio personnel dans le but de promouvoir mes compétences personnelles et professionnelles ainsi que mes projets et hobbies à destination des professionnels.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#stack-de-travail","level":2,"title":"Stack de travail","text":"

    On doit choisir quelle stack, c'est Ă  dire quel combo d'outils on utilisera pour faire fonctionner le tout. Dans une stack de projet Web moderne, on doit choisir un Moteur, un Framework et le compilateur. Mais Ă  quoi servent-ils ?

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-moteur-build-tool","level":3,"title":"Le Moteur (Build tool)","text":"

    Souvent appelé \"moteur\" par abus de langage, c'est l'outil qui fait tourner tout l'écosystÚme. Il coordonne le compilateur, le serveur et les fichiers.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-framework","level":3,"title":"Le Framework","text":"

    Le framework est un ensemble d'outils et de rĂšgles de construction. Au lieu de partir d'une page blanche, on utilise des blocs dĂ©jĂ  prĂȘtes et ça Ă©vite de recrĂ©er du code que la communautĂ© aurait dĂ©jĂ  Ă©crit.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-compilateur","level":3,"title":"Le Compilateur","text":"

    C'est le mĂȘme principe que dans plein d'autres languages comme le C par exemple, il reprend notre code, ici le JSX (un JavaScript mĂ©langĂ© Ă  du HTML) en JS et HTML standard pour qu'un navigateur comprenne correctement.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#choix","level":3,"title":"Choix","text":"

    Il existe donc plusieurs Moteurs (Vite, Next.JS, ...), Frameworks (React, Vue, Svelte, ...) et Compilateurs (Babel, SWC, ...) mais pour ce projet on retiendra une stack simple pour un débutant et efficace pour tester et déployer.

    Stack choisie

    • Moteur : Vite -> Le moteur le plus rapide, sans fioritures et simple d'utilisation avec des outils de bases trĂšs utiles
    • Framework : React -> Le framework le plus populaire avec des tonnes de librairies deja prĂȘtes et une communautĂ© prĂ©sente
    • Compilateur : JS/SWC -> TrĂšs efficace et rapide et simple et utilnous permet d'utilise JS
    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#points-importants-du-projet","level":2,"title":"Points importants du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#creation-du-projet","level":3,"title":"Création du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#packages-npm","level":3,"title":"Packages npm","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#hebergement-avec-vercel","level":3,"title":"Hébergement avec Vercel","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#cles-denvironnements","level":3,"title":"Clés d'environnements","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]}]} \ No newline at end of file