Documentation · projet personnel

Cyber, bot Discord tout-en-un et sécurisé

Le compte rendu complet, étape par étape, de la création de Cyber, de son panel d'administration et de son site cyberbot.fr. Projet personnel d'Enzo Cerejo, étudiant en BTS CIEL, réalisé en octobre 2026 avec l'assistance de l'IA Claude (Anthropic). Le code du bot reste privé : aucun secret ne figure ici.

Chiffres clés

Durée 5 jours (25 → 29 octobre 2026)
Versions v1.0 → v1.9
Commandes 61, en 2 modules (Communauté, Académie), en français et en anglais
Académie 47 fiches CCNA, 498 questions, 92 termes de glossaire
Tickets 123 modèles prêts à l'emploi
Sécurité 5 audits, plus de 45 points corrigés, 0 secret publié

À propos des images

Les captures du site et du panel viennent du mode démonstration, qui était public jusqu'au 29 octobre (aucune donnée réelle). Les écrans d'outils (Cloudflare, console d'hébergement, profil Discord…) sont des illustrations recréées d'après les vraies captures du projet, pour garder le même rendu sans exposer d'identifiants, d'adresses IP ni d'informations personnelles.

Chapitre 1

Contexte et objectifs

Le point de départ

Cyber est un bot Discord créé par Enzo Cerejo, étudiant en BTS CIEL (Cybersécurité, Informatique et réseaux, Électronique), option Informatique et Réseaux. Le projet est né d'un constat simple : sur un serveur Discord, on empile souvent cinq ou six bots différents (un pour les tickets, un pour la modération, un pour les niveaux, un pour les giveaways…). Chacun a ses permissions, son tableau de bord, ses pannes.

L'idée : un seul bot, gratuit, qui remplace tous les autres, avec en plus un module pédagogique pour réviser les réseaux au niveau CCNA, ce qui colle à la formation d'Enzo.

Les objectifs fixés

Objectif Ce que ça veut dire concrètement
Tout-en-un Modération, automod, tickets, niveaux, giveaways, vérification, vocaux temporaires, rôles…
Modulable Chaque serveur active seulement ce dont il a besoin (modules Communauté et Académie)
Pédagogique Fiches de cours CCNA, quiz, glossaire, défi du jour, outils réseau
Simple à configurer Un panel web façon MEE6 avec connexion Discord
Sûr Aucun secret publié, permissions minimales, panel protégé, données personnelles maîtrisées
Professionnel Site public, nom de domaine, pages légales, identité visuelle, préparation à la vérification Discord

La vision à long terme : les « cassettes »

Enzo a résumé sa vision ainsi : un serveur demande un module sur mesure, Enzo le développe, puis donne au serveur un identifiant unique. L'administrateur le saisit dans son panel (« Ajouter un module ») et Cyber installe le module, comme les cartes que l'on insère dans Baymax dans Les Nouveaux Héros.

Au moment de cette documentation, cette fonction est annoncée « Bientôt » dans le panel et dans la bio du bot : elle n'est pas encore codée. Les modules Communauté et Académie, eux, sont activables par serveur.

Méthode de travail

Le projet a été mené avec l'assistance de Claude (Anthropic), utilisé comme développeur et formateur :

  • Enzo joue le rôle de chef de projet et d'administrateur système : il définit les besoins, teste chaque version sur ses serveurs, configure l'infrastructure (nom de domaine, DNS Cloudflare, portail développeur Discord, GitHub, hébergeur) et valide les choix de sécurité.
  • Claude écrit le code, explique chaque notion en français, réalise les audits et rédige les guides pas à pas.

Les règles posées dès le départ :

  1. Ne jamais lire, afficher ni publier le fichier .env (token du bot, secrets).
  2. Toujours tester avant de livrer (node src/check.js valide toutes les commandes).
  3. Garder une sauvegarde de chaque fichier modifié.
  4. Expliquer simplement ce qui change et ce qu'il faut faire ensuite (relancer DEMARRER.bat, publier avec PUBLIER.bat).
Chronologie du projet
Chronologie du projet

Compétences BTS CIEL mobilisées

  • Réseau : DNS (enregistrements A, CNAME, TXT, SPF, DMARC), ports, NAT, IPv4/IPv6, tunnels, HTTPS/TLS.
  • Cybersécurité : gestion des secrets, principe du moindre privilège, authentification multifacteur, audits, OWASP (XSS, CSRF, injections), RGPD.
  • Systèmes : hébergement Linux en conteneur (Pterodactyl/Docker), scripts Windows (.bat), sauvegardes et restauration.
  • Développement : Node.js, API Discord, Express, HTML/CSS/JS, Git et GitHub.
  • Gestion de projet : versions, priorisation, documentation, relation avec un hébergeur (tickets de support).
↑ Haut de page

Chapitre 2

Carnet de bord

Ce chapitre est le compte rendu chronologique du projet : ce qui a été fait, les problèmes rencontrés (techniques comme humains), comment ils ont été résolus et ce que j'en ai retenu. Les heures sont en heure de Paris.

Légende : 🛠️ réalisation · ⚠️ problème · 💡 solution ou décision · 🧠 ce que j'ai appris

Chronologie du projet
Chronologie du projet

Jours 1 et 2 · 25 et 26 octobre : naissance de Cyber

Tout commence dans une première conversation avec Claude, intitulée « Bot Discord personnalisé ». Ma première phrase : « Tu peux m'aider à créer mon propre bot Discord ? Le code et tout ? », pour le tester sur un serveur où je suis administrateur.

Le cahier des charges

  • 🛠️ Mes premières réponses fixent le cap : des commandes utiles, de la modération, l'accueil et les rôles, des embeds, des infos sur les comptes, et, en clin d'œil au homelab, un ping d'IP qui ne donne aucune information sensible. Pour le langage : « choisis le plus performant pour beaucoup d'utilisation » (ce sera Node.js avec discord.js).
  • 💡 Très vite, l'ambition grandit : « J'aimerais remplacer toutes les commandes de tous les autres bots », « je veux un max de commandes, vraiment beaucoup ». C'est la naissance de l'objectif « un seul bot à la place de MEE6, Carl-bot, Dyno et Ticket Tool ».
  • ⚠️ Problème humain : je demande un logo « rouge vif pastel qui fait peur, comme le dragon de Kali Linux mais sans lui ressembler », puis « plus comme un dragon ». Claude ne génère pas d'images.
  • 💡 Solution : « au pire, crée-moi un prompt et j'irai le demander à une IA spécialisée ». C'est la méthode qui servira pour tous les visuels (chapitre 10). Le logo final sera finalement un masque de démon rouge, que j'ai fait générer moi-même.

Étape par étape dans le portail Discord

  • ⚠️ « J'ai déjà ajouté l'app au serveur mais elle n'est pas affichée en tant que BOT. » 💡 L'application avait été invitée sans la portée bot : il faut générer le lien d'invitation avec les bonnes portées (bot et applications.commands).
  • ⚠️ Problème humain : « Tu veux que j'aille sur CSC et que je te donne l'accès ? Comment faire ? Serveur MPC ? » Je ne savais pas comment laisser Claude travailler sur mon PC. 💡 Claude a écrit les fichiers lui-même dans un dossier de mon PC, puis m'a donné un seul script à lancer : DEMARRER.bat.
  • ⚠️ Problème humain et de sécurité : j'ai collé le token du bot directement dans la conversation, puis refusé de le changer (« personne n'aura la conversation »). 🧠 J'ai compris plus tard qu'un secret qui a circulé doit être considéré comme compromis : tous les secrets ont été régénérés le 28 octobre (chapitre 8). C'est aussi de là que vient la règle n°1 du projet : le .env n'est jamais lu, affiché ni publié.

Les premières versions (v1.0 et v1.1)

  • 🛠️ v1.0 : 20 commandes (modération, informations, rôles, sondages, embeds), bienvenue, rôle automatique, salon de logs. Dès le début, /pingip refuse les adresses privées pour ne pas pouvoir scanner mon propre réseau.
  • 🛠️ v1.1 : niveaux, automod, tickets, giveaways, vérification, vocaux temporaires, outils réseau. Je demande aussi « où se trouve précisément le dossier du bot, comment je le lance, et la liste de toutes les commandes avec ce qu'elles font ».
  • ⚠️ Discord refuse /panelroles : une option obligatoire était placée après une option facultative. 💡 Ordre corrigé, et le script de vérification check.js contrôle désormais cette règle pour toutes les commandes. « Ça marche ! »
  • 💡 Mes retours de testeur : je supprime /8ball et /dire (« j'aime pas »), je demande beaucoup plus de blagues et un /userinfo plus complet.
  • ⚠️ Sur la page Verification Qualifications du portail, je découvre qu'il faut des conditions d'utilisation et une politique de confidentialité. 💡 On remet ça à plus tard : la vérification n'est obligatoire qu'à partir de 75 serveurs (elle sera préparée le 28, chapitre 9).

Héberger le bot et créer le site (v1.2)

  • ⚠️ Idée reçue : « Est-ce que je peux héberger le bot sur GitHub, comme mon portfolio ? » 💡 Non : GitHub Pages ne sert que des pages statiques. Il est parfait pour le site, mais le bot doit tourner sur une machine allumée en continu. Plan retenu : le site sur GitHub Pages (gratuit et sécurisé), le bot sur mon PC pour l'instant, puis sur ma propre machine plus tard.
  • 🛠️ Le site vitrine voit le jour, d'abord sur enzocerejo.github.io/cyber, avec le logo, la bannière et le fond que j'avais préparés.
  • ⚠️ Les images ne s'affichaient pas en ligne : le dossier assets n'avait jamais été envoyé sur GitHub, et je devais tout recopier à la main à chaque modification. 💡 Création de PUBLIER.bat, qui publie tout le dossier avec Git en un double-clic.
  • ⚠️ Après une mise à jour, le navigateur affichait le nouveau HTML avec l'ancien CSS. 💡 Numéros de version « anti-cache » ajoutés automatiquement à chaque fichier.
  • 🛠️ Refonte visuelle à ma demande : plus de bannière ni d'image de fond (« laisse parler ton imagination »), fond de réseau animé, titre « glitch », démonstration Discord animée. J'enlève aussi mon email du site : un contact viendra avec un nom de domaine.
  • ⚠️ « Pas bien fait ici, refais bien » : une partie du site n'était qu'à moitié stylée. Puis « bug logo modo » : l'icône bouclier de la carte Modération sautait sur le bord au survol. 💡 Les deux corrigés (l'icône prenait toute la largeur de la carte).
  • 💡 Ma question : pourquoi ne pas faire dès maintenant le panel sans le serveur, juste pour avoir le visuel prêt avant Noël ? Résultat : un panel d'aperçu sur le site, avec la vraie connexion Discord, des salons fictifs et un mode démo sans compte.
  • ⚠️ « redirect_uri OAuth2 non valide » en cliquant sur « Se connecter avec Discord ». 💡 Deux causes : index.html dans l'adresse, et « Cyber » contre « cyber » (GitHub respecte les majuscules, Discord compare caractère par caractère). L'adresse est maintenant normalisée.
  • 🧠 Une question honnête que j'ai posée ce soir-là : « Un bot entièrement codé par une IA peut-il vraiment être utilisé sans crainte ? » La réponse : oui, s'il est bien suivi : tests, audits, aucune donnée sensible, et quelqu'un qui comprend ce qui est livré. C'est ce qui a guidé la suite du projet.
  • 💡 Côté matériel, je parle déjà du futur hébergement : mon père me propose d'échanger son kit Raspberry Pi 5 8 Go contre un Pi 5 2 Go. Je garde l'idée pour Noël (chapitre 7).

Les deux modules (v1.3)

  • 💡 Mon idée : « deux parties qui peuvent se cumuler ou marcher indépendamment », la partie communauté (modération, tickets…) et une partie cyber qui explique « ce que sont les pare-feu, les routeurs… vraiment très complète ». Le choix doit être « une simple case à cocher ou une commande ». Le niveau : CCNA, avec les trois modules du cursus (ITN, SRWE, ENSA), et une IA qui répond aux questions tant que ça reste de l'informatique.
  • 🛠️ Résultat : les modules Communauté et Académie, 47 fiches de cours, /quiz, /glossaire, /port, /osi, /cisco, le défi du jour et /ia (limitée à 5 questions par heure et par personne).
  • ⚠️ Les commandes n'apparaissaient que sur un seul serveur : elles étaient enregistrées sur un identifiant de serveur fixe. 💡 Enregistrement automatique sur tous les serveurs du bot, et dès qu'il en rejoint un nouveau.
  • 🧠 « C'est optimisé si un jour il est sur 150 000 serveurs ? » Réponse honnête : c'est la bonne méthode pour développer, mais en production il faudra des commandes globales, puis le sharding obligatoire à partir de 2 500 serveurs et une vraie base de données (chapitre 12).

Le choix à l'arrivée et le panel animé (v1.4)

Lundi 26 octobre, 22 h 52 · 🛠️ Une fonction dont on avait parlé n'existait pas encore : le choix des modules à la première invitation. Il est créé à deux endroits : un message de bienvenue dans Discord avec trois boutons (Communauté, Académie, Les deux, réservés à ceux qui gèrent le serveur), et un écran d'accueil dans le panel. Le panel reçoit aussi des aperçus fidèles à Discord, un simulateur d'automod, des animations et une alerte en cas de modifications non enregistrées. Le serveur de support est relié partout (/aide, site, pages légales).

Mes retours de testeur et le fichier de contexte (v1.5)

23 h 17 · ⚠️ Je teste et je liste ce qui ne va pas : pas assez de questions dans le quiz, /rappel envoie plusieurs MP au lieu d'un, la réponse /afk se multiplie, et les explications (DDoS par exemple) sont trop courtes.

23 h 19 · 💡 Le diagnostic surprend : ce n'était pas un bug des commandes. Trois copies de Cyber tournaient en même temps sur mon PC, parce que je relançais DEMARRER.bat sans fermer l'ancienne fenêtre. Chacune répondait. Le bot réserve maintenant un port local (instance unique) et DEMARRER.bat ferme les anciennes copies.

23 h 48 · 🛠️ v1.5 : 498 questions au lieu de 75 (au moins 10 par fiche), séries de 5 questions par sujet avec bilan, 47 fiches réécrites 3 à 5 fois plus détaillées, 92 termes de glossaire (DDoS détaille maintenant le botnet, les types d'attaque, l'amplification et les défenses).

  • ⚠️ Problème humain : la conversation devenait trop longue et les réponses ralentissaient. Je demande si je peux l'exporter et la renvoyer dans une nouvelle conversation. 💡 Ça n'irait pas plus vite. La bonne solution : un fichier CONTEXTE-CLAUDE.md qui résume tout le projet (règles de sécurité, structure, recettes de publication, reste à faire), plus les outils de génération du site copiés dans le dossier du bot. Il suffit d'écrire « lis CONTEXTE-CLAUDE.md et on continue ».

🧠 Un bon fichier de contexte vaut de l'or : sans lui, il faudrait tout réexpliquer à chaque fois. Et un bug « qui se répète » n'est pas forcément dans le code : il faut d'abord vérifier combien de fois le programme tourne.


Nuit du 26 au 27 octobre : premier hébergement et premier audit

23 h 59 · Je reprends le projet avec le fichier de contexte. Le bot est en v1.5 (58 commandes) et tourne seulement quand mon PC est allumé.

00 h 04 · 💡 Idée : utiliser Teoheberg, un hébergeur gratuit, pour que le bot tourne en continu et que je puisse configurer le panel avec de vraies données. J'envoie des captures des onglets Startup et Network.

00 h 14 · 🛠️ Le bot est adapté (port de l'hébergeur, enregistrement des commandes au démarrage, script PREPARER-TEOHEBERG.bat qui crée un zip sans secret) avec un guide pas à pas.

00 h 42 · ✅ « Ça a l'air de marcher tranquille. » Mais j'ai plein de questions : mon DEMARRER.bat sert encore à quelque chose ? Comment tu mets à jour les fichiers là-bas ? Je peux héberger le site aussi ? 💡 Réponses : DEMARRER.bat sert aux tests sur le PC (en éteignant l'hébergeur avant), le site reste sur GitHub Pages (gratuit, HTTPS), et pour les mises à jour, mieux vaut un dépôt GitHub privé.

00 h 51 · 🛠️ Je choisis la méthode GitHub privé et je demande en même temps un audit de sécurité complet. Résultat : 4 vulnérabilités npm corrigées et 12 failles dans le code, dont une grave : un simple membre pouvait devenir administrateur via un rôle mal configuré (détails au chapitre 8).

01 h 23 · ⚠️ Problème humain : « Je mets où le token du bot sur GitHub ? » 💡 Nulle part ! J'avais confondu deux choses : le token du bot (secret, seulement dans le .env) et le jeton GitHub (qui permet à l'hébergeur de lire le dépôt privé). 🧠 Il y a plusieurs « tokens » dans un projet et chacun a un rôle et un niveau de risque différent.

01 h 24 · ⚠️ Après le premier clone sur l'hébergeur : « J'ai que ça, je fais quoi ? » 💡 C'est normal, le .env n'est volontairement pas sur GitHub : il faut le créer à la main sur le serveur.

01 h 32 · ✅ Tout marche. Je veux relier le panel au site. ⚠️ Le site est en HTTPS et l'hébergeur en HTTP : les navigateurs bloquent ce mélange.

01 h 36 · ⚠️ Le panel ne s'ouvre pas du tout (ERR_CONNECTION_TIMED_OUT). 💡 Diagnostic : le nom de l'hébergeur passe par Cloudflare, qui ne laisse pas passer ce port. J'ouvre un ticket au support avec un message préparé.


Mercredi 28 octobre : la grosse journée

Matin : le tunnel et le nom de domaine

08 h 53 · ⚠️ Réponse du support : la machine n'a aucun port entrant ouvert. Le panel ne sera jamais joignable directement. 💡 Trois options : se passer du panel en ligne, passer à une offre payante, ou créer un tunnel Cloudflare (c'est le serveur qui appelle Cloudflare). Je choisis le tunnel.

09 h 05 · Je demande si c'est sécurisé, puis si les injections SQL sont possibles sur le login du panel. 💡 Le tunnel est chiffré mais rend le panel public, donc il faut le protéger. Et pas d'injection SQL possible : il n'y a ni base SQL ni mot de passe. 🧠 Une faille dépend de la technologie : sans SQL, pas d'injection SQL, mais il reste le XSS, le CSRF, le vol de session…

10 h 17 · Choix du nom de domaine. cyber.com est hors de portée. 💡 cyberbot.fr chez OVH, environ 6 €.

10 h 38 · ⚠️ Piège évité : le DNSSEC activé par défaut aurait coupé le domaine au moment de passer chez Cloudflare. Je le retire avant de payer.

10 h 47 · ✅ cyberbot.fr est à moi.

10 h 52 → 11 h 03 · ⚠️ Problème d'interface : Cloudflare a réorganisé ses menus. Je me retrouve dans « Register domain » (acheter) au lieu d'« Onboard a domain » (ajouter), puis « Networks » n'est plus à l'endroit prévu. 💡 La recherche rapide (Ctrl + K) règle le problème. Au passage, j'ajoute SPF et DMARC contre l'usurpation de mail, et je change les serveurs DNS chez OVH.

11 h 06 · ⚠️ Zero Trust demande une carte bancaire même pour l'offre gratuite. 💡 Rien n'est débité tant qu'on reste sur Free.

11 h 15 · 🛠️ Tunnel créé. Je copie le token sans jamais l'envoyer dans la conversation.

11 h 20 · ⚠️ « Je ne peux pas faire Next s'il n'est pas connecté… » 💡 On inverse l'ordre : d'abord le .env et le redémarrage, ensuite la route.

11 h 22 · ✅ cloudflared tourne sur l'hébergeur, le tunnel est connecté.

11 h 27 · ⚠️ Erreur DNS sur panel.cyberbot.fr. 💡 Deux causes : la route n'était pas encore ajoutée, et le domaine était encore « en attente » chez Cloudflare. Puis ipconfig /flushdns sur le PC, parce que Windows avait gardé en mémoire le « n'existe pas ».

12 h 08 · ✅ Le domaine est actif.

Midi : l'incident

12 h 19 · ⚠️ Erreur 1033 : Cloudflare ne trouve plus aucun connecteur.

12 h 21 · Le tunnel est « Down ».

12 h 23 · ⚠️⚠️ « Je n'ai plus de serveur ? » Le serveur a été supprimé par l'hébergeur. Il n'apparaît plus nulle part. Les données (data/ : niveaux, réglages) sont perdues, sauf une copie plus ancienne sur mon PC. 💡 Pas de panique : je ne recrée rien avant de connaître la raison, j'ouvre un ticket (rédigé pour l'occasion, en étant transparent sur le tunnel), et je relance le bot sur mon PC avec DEMARRER.bat. 🧠 Un hébergeur gratuit peut disparaître du jour au lendemain. Sans sauvegarde, on perd tout. C'est ce qui a déclenché les sauvegardes automatiques l'après-midi même.

12 h 33 · Plutôt que d'attendre, on avance sur deux chantiers en parallèle : passer le site sur cyberbot.fr, et refaire l'interface du panel.

Erreur 1033 (illustration)
Erreur 1033 (illustration)

Début d'après-midi : le site sur cyberbot.fr et le nouveau panel

13 h 38 · 🛠️ Quatre enregistrements A vers GitHub Pages et un CNAME www, tous en « DNS only ». Vérification du domaine dans GitHub avec un enregistrement TXT.

13 h 44 · ✅ « DNS check successful ». GitHub prépare le certificat HTTPS tout seul.

13 h 47 → 14 h 04 · ⚠️ Problème d'outil : Claude n'arrive pas à se connecter à mon PC pour modifier les fichiers. Je ne sais pas où se trouve « Remote Control ». 💡 Finalement, je donne l'accès au dossier Cyber qui regroupe le bot et le site.

13 h 55 · Question bonus : « l'interface paraît plus zoomée ». 💡 Normal : le navigateur retient un zoom par adresse, et cyberbot.fr repart à 100 %.

14 h 07 · 🛠️ Fichier CNAME, liens mis à jour partout, PUBLIER.bat qui récupère d'abord les changements faits en ligne. Python n'étant pas installé sur mon PC, le build est reproduit à la main.

14 h 20 · ✅ Le site est en ligne sur https://cyberbot.fr.

12 h 33 → 15 h 53 · Refonte du panel : trois styles proposés, je choisis « Console cyber ». Les changements arrivent dans une pull request. ⚠️ Problème humain : on me demande « ok » à chaque étape et ça ralentit tout. 💡 Je réponds « pas besoin de ok » : désormais, les étapes réversibles se font directement (avec sauvegarde), seules les actions irréversibles me sont demandées. ⚠️ « C'est quoi fusionner la PR ? » 💡 Une PR est une proposition de modification ; « Merge » l'accepte et met le site à jour. Je fusionne la PR #1. 🧠 J'ai appris le vocabulaire Git en pratique : branche, pull request, merge, revert.

15 h 03 · 🛠️ Ruleset GitHub sur main : suppression et force push interdits.

Après-midi : l'audit global et le cadenas du panel

15 h 06 · Je demande un audit de tout : sécurité, erreurs, optimisation.

15 h 12 · Rapport : aucune fuite de secret. 1 point critique (régénérer les secrets qui étaient sur le serveur supprimé), 5 importants, 12 mineurs.

15 h 34 · Je réponds point par point. Je choisis quoi corriger, ce qu'on fait ensemble, ce qu'on me rappellera plus tard. Pour les giveaways, je refuse une purge fixe à 30 jours (certains durent plus longtemps) : 💡 on compte maintenant à partir de la fin de chaque giveaway, avec une durée réglable par serveur.

16 h 19 · 🛠️ Sauvegardes automatiques chaque jour, RESTAURER.bat, rappels programmés du 26 décembre au 3 janvier pour les points liés au futur serveur. Choix des sauvegardes sur Discord plutôt que GitHub (pas de jeton en écriture à confier au bot).

16 h 32 · 🛠️ Alertes Dependabot et Malware activées, mais pas les mises à jour automatiques, qui auraient bloqué mes envois.

16 h 39 → 18 h 06 · Cloudflare Access, la partie la plus laborieuse de la journée :

  • ⚠️ Je demande si on peut ajouter une application d'authentification. 💡 Oui : MFA TOTP en plus du code par mail.
  • ⚠️ Connexion en boucle : « That account does not have access ». La page proposait de se connecter avec mon compte Cloudflare (une autre adresse mail) alors que seule mon adresse autorisée a accès. 💡 Activer la méthode One-time PIN seule.
  • ⚠️ Arrivée sur une page « Welcome » au lieu du panel. 💡 C'est l'App Launcher, désactivé par défaut. C'est lui qui permet d'enregistrer l'application d'authentification : il faut lui donner la même règle.
  • ✅ Bitwarden enregistré. Je renomme l'équipe générée au hasard (« royal-cake-… ») en cyberbot-team.
  • ✅ Test : mail, code et Bitwarden passent, puis erreur 1033… normale, car le bot est éteint. 🧠 La sécurité « zero trust » se configure par couches, et chaque couche a son propre écran. Il faut tester après chaque changement.

18 h 15 → 18 h 40 · Régénération de tous les secrets et nouveau .env (rempli par moi, jamais montré). ✅ « Tout est fait. »

En parallèle : où héberger Cyber pour de bon ?

16 h 19 → 21 h · Je me demande si un Raspberry Pi 5 est le bon choix. ⚠️ Problème humain : je précise que le Pi 2 Go était pour mon père et que moi je visais le 8 Go, il faut donc refaire la comparaison. ⚠️ Les premiers prix annoncés étaient trop bas : en 2026, la RAM a beaucoup augmenté. La correction est faite honnêtement, avec de vrais liens. ⚠️ Contrainte de budget : le neuf est trop cher pour un étudiant, et un PC format SFF trop encombrant. 💡 Un mini PC reconditionné « 1 litre » (EliteDesk Mini, ThinkCentre Tiny, OptiPlex Micro). Je compare des annonces d'occasion, et pour chacune je reçois un avis et un message prêt à envoyer au vendeur. Achat prévu à Noël, sans écran.

Soirée : identité visuelle

19 h 43 · 🛠️ Pack de 57 prompts pour générer tous les visuels avec une charte stricte (palette, polices, masque de démon). 21 h 35 · ⚠️ ChatGPT s'arrête à l'image 7 (quota gratuit). Gemini prend le relais, puis s'arrête aussi. 💡 Décision : générer un peu chaque jour, à chaque recharge des quotas. Les images sont recadrées aux bonnes tailles au fur et à mesure. 22 h 09 · 🛠️ Avatar, bannière et description du bot posés dans le portail. Application transférée dans une équipe Discord (la 2FA est obligatoire pour ça). 23 h 06 · ⚠️ La bannière rend mal en petite vue : du rose apparaît et le texte est coupé. 💡 L'image générée était semi-transparente et Discord mettait sa couleur derrière. Version opaque, texte centré.

Soirée : vérification Discord et RGPD

22 h 28 → 22 h 49 · 🛠️ /mesdonnees, effacement automatique 30 jours après le retrait d'un serveur, pages légales réécrites et mentions légales. J'ouvre et je fusionne moi-même la PR #2. ✅ « Tout est testé. » 22 h 49 · Je découvre deux champs mystérieux dans le portail. 💡 Les laisser vides : l'un d'eux aurait coupé toutes les commandes.

Soirée : le tunnel renaît depuis mon PC

22 h 53 · « On continue sans serveur ? » 💡 Oui : le tunnel peut partir de mon PC. 22 h 57 · ⚠️ Rien ne se passe. 💡 La ligne TUNNEL_TOKEN était encore en commentaire (#) dans mon .env. Bon point quand même : j'avais masqué mes secrets avant d'envoyer la capture. 22 h 59 · ⚠️ Le tunnel refuse de démarrer. 💡 J'avais mis l'empreinte de la version Linux de cloudflared alors que le PC télécharge la version Windows. La sécurité a fait exactement son travail. 23 h 01 · ⚠️ « Bad gateway ». 💡 La route pointait encore sur l'ancien port, et localhost partait en IPv6 (::1). Correction : 127.0.0.1:3000. 23 h 03 · ⚠️ Malentendu : « J'ai rien changé du tout, tu racontes quoi ? » Claude avait supposé que j'avais déjà modifié la route. 💡 Excuses et explication pas à pas. 🧠 Ne jamais supposer qu'une étape est faite : vérifier sur la capture avant d'affirmer. 23 h 05 · ✅ https://panel.cyberbot.fr fonctionne : code par mail, code Bitwarden, connexion Discord, puis le panel.

Fin de soirée : finitions

23 h 07 · ⚠️ « Je n'ai toujours pas de sauvegarde dans mon salon, c'est normal ? » 💡 Non, c'était un bug : la sauvegarde du jour avait été créée avant que le salon soit configuré, et elle n'était plus jamais renvoyée. Corrigé. 23 h 14 → 23 h 23 · 🛠️ Deuxième audit complet (« je veux que tout soit nickel ») : 15 petits trous corrigés, dont la triche possible au quiz. 23 h 17 · 🛠️ Statut permanent « 🌐 cyberbot.fr · /aide ». 23 h 21 · 🛠️ Bio automatique avec les vrais chiffres. J'explique ma vision des modules sur mesure (« les cassettes de Baymax »), annoncée comme « Bientôt » puisqu'elle n'est pas encore codée. 23 h 29 · 🛠️ Modèle complet du serveur Discord de support : 12 catégories, 35 salons, 15 rôles. 23 h 48 · Je passe chaque réglage du panel en revue et je liste 7 améliorations. Je précise en cours de route que les classements du défi doivent rester dans le salon. 00 h 17 · ✅ Panel v1.7 installé : brouillon et Réinitialiser, 123 modèles de tickets, vocaux Join to Create, défi du jour privé, Components V2. 60 commandes valides. 00 h 19 · Je confirme que Cyber a la permission Administrateur sur mon serveur, donc rien à changer pour les vocaux.

00 h 24 · Je lance cette documentation. 📘

Jeudi 29 octobre : Cyber s'ouvre au monde

Cette nuit-là : la vérification des nouveaux membres

00 h 37 · 🛠️ Le règlement du serveur de support reçoit son bouton : il donne le rôle « Membre » et retire « Non vérifié ». 00 h 43 · ⚠️ Je vérifie : « Tu as bien fait en sorte que le rôle Non vérifié soit attribué à chaque nouveau membre, puis enlevé après vérification ? » 💡 Pas encore automatiquement : il fallait passer par le rôle automatique. Le panel le fait maintenant tout seul. 00 h 53 · 🛠️ Onglet Vérification du panel : choix ou création des deux rôles, 17 modèles de règlement avec aperçu, option pour cacher les salons aux non-vérifiés. Dans la même demi-heure, la nouvelle icône du site et cette documentation sont mises en ligne.

Matin : préparer le homelab

10 h 29 · Question : « Proxmox et mon bot peuvent tenir ensemble sur le même PC ? » 💡 Oui, c'est le principe : Proxmox est la base, et chaque projet vit dans sa propre machine virtuelle, isolée des autres. Avec 16 Go de RAM, le bot, un bloqueur de pub et des labos BTS (pfSense, Windows Server) tiennent ensemble.

Début d'après-midi : trois chantiers en parallèle

13 h 44 · 💡 « Est-ce qu'on pourrait intégrer un peu d'IA dans l'automod, qui peut être contourné avec deux ou trois changements de texte ? » 13 h 46 · ⚠️ Problème humain : « Combien ça me coûte ? Je ne veux pas dépenser mes tokens facilement. » 💡 L'IA du bot utiliserait une clé API séparée de mon abonnement, environ 5 centimes pour 1 000 messages. 13 h 48 · « Restons normal pour l'instant. » 🛠️ Seule la couche gratuite est faite : l'automod démasque maintenant les lettres déguisées (alphabets étrangers, caractères invisibles, lettres stylisées, mots coupés par un symbole). 🧠 Une bonne protection gratuite d'abord, l'option payante seulement quand le besoin est prouvé.

13 h 49 · Je demande ce qu'on pourrait améliorer sur le site. Claude propose 10 idées classées par priorité, je réponds « tout ». 13 h 59 · 🛠️ Site amélioré (PR #6, fusionnée à 14 h 06) : page 404, plan du site pour Google (sitemap.xml et robots.txt), images en WebP (logo 26 fois plus léger), aperçu des liens partagés, section « Cyber en images », 3 nouvelles questions dans la FAQ, compteur des membres du support en direct, lien vers la documentation, accueil en anglais et page « Modules sur mesure » (annoncée comme « Bientôt »).

14 h 03 · 💡 « C'est possible d'avoir un bot français / anglais ? Que les utilisateurs choisissent la langue, dans toutes les commandes, et n'oublie pas d'actualiser les prochaines commandes. » ⚠️ Problème d'organisation : la demande part d'abord dans un nouveau fil, puis revient dans le fil du panel, comme le voulait ma règle « gros changement du bot = fil du panel ». Deux messages contradictoires en une minute. 💡 Corrigé tout de suite, et la règle est maintenant appliquée sans exception. 14 h 21 · 🛠️ v1.8 bilingue prête : 860 textes traduits, /langue pour chaque membre, /config langue pour le serveur, noms des commandes en anglais. ⚠️ Mais mon PC est hors ligne : impossible de l'installer. 14 h 25 · 🧠 « Une PR, c'est quoi ? Et ça sert à quoi ? » Explication : une proposition de changements, relue puis fusionnée en un clic, et annulable. Conclusion : PR quand mon PC est éteint ou pour un gros changement, PUBLIER.bat le reste du temps. 14 h 32 · Côté homelab, mon père achètera le mini PC choisi samedi, avec la transaction sécurisée de leboncoin. 14 h 48 · ⚠️ Sur la page anglaise, il manque des onglets dans la barre du haut. 💡 Menu aligné sur la version française (PR #7, fusionnée à 15 h 03).

Milieu d'après-midi : ouvrir le panel à tout le monde

16 h 10 · Je cherche un hébergement pas cher jusqu'en janvier. 💡 Conseil : Hetzner (environ 4 € par mois, sans engagement), pas les offres « gratuites » qui m'ont déjà coûté un serveur. 16 h 21 · Le vrai besoin apparaît : « je veux que les gens aient accès au panel de config, sécurisé, sans interruption ». 16 h 22 · « On peut déjà créer le chemin sécurisé vers le panel pour tout le monde, sans le serveur ? » 💡 Oui : le chemin existe déjà (le tunnel). Seul le cadenas Cloudflare Access, réglé pour moi seul, bloque les autres. 16 h 35 · « Entre le site et le panel, c'est sécurisé ? » La question part au fil d'audit, comme prévu par ma règle. 16 h 36 · 🛠️ Audit n°5 : un seul trou (un modérateur pouvait déplacer le salon des logs depuis le panel), et la « connexion token bizarre » de l'ancien panel d'aperçu est remplacée par un renvoi vers le vrai panel. 16 h 38 · 💡 Décision : l'hébergeur attendra quelques jours, je veux finir l'ouverture du panel « aujourd'hui et demain ». 16 h 39 · ⚠️ Mon PC ne répond plus (en veille). Tout est prêt mais rien ne peut être installé. 16 h 45 · « À quoi pourrait servir une base de données ? » 💡 Solidité en cas de coupure, rapidité avec beaucoup de serveurs, sessions qui survivent aux redémarrages. 16 h 46 · « Je peux utiliser SQLite maintenant ? » 💡 Oui, avec le SQLite intégré à Node.js, donc aucun module de plus à surveiller.

Fin d'après-midi : tout s'installe

17 h 14 · Mon PC est de retour : « installe maintenant ». ⚠️ Problème d'organisation : trois fils avaient des changements prêts pour les mêmes fichiers (automod, version bilingue, audit), et le dossier du site sur mon PC était en retard sur GitHub. 💡 Un ordre d'installation précis : l'automod (un seul fichier), puis la v1.8, puis l'audit par-dessus. Chaque fois avec une sauvegarde et une comparaison avant d'écrire. Et un nouveau script, SYNCHRONISER-SITE.bat, remet le dossier du site à jour sans rien perdre, pour que PUBLIER.bat ne tombe pas sur un conflit. 17 h 16 · ✅ Automod renforcé installé. 17 h 21 · ✅ Bot bilingue installé. Site mis à jour (PR #8). 17 h 28 · ✅ SQLite et panel public installés, testés avec la v1.8 : 61 commandes valides, données importées toutes seules. 17 h 30 · 🛠️ Le serveur de support devient bilingue : un salon pour choisir sa langue, un règlement français et un anglais, des salons pour chaque langue. 17 h 36 · Je fais ma part : Cloudflare Access supprimé, ancienne redirection Discord retirée, .env modifié. J'envoie un extrait du .env avec les secrets remplacés par « CACHE ». 🧠 Le bon réflexe, cette fois du premier coup. 17 h 45 · « Quand les gens ouvrent, ça ne met pas cette page, si ? Et tu pourrais ajouter un jeu du dino comme Google, avec nos couleurs, au cas où ça prend du temps ? » 💡 Pas de copie du jeu de Google (il est protégé) : un jeu original où le robot Cyber saute par-dessus des bugs. 17 h 46 · « Des cookies pour garder la connexion Discord et le classement ? » 💡 La connexion est maintenant gardée 7 jours, même après un redémarrage. Le classement mondial est déconseillé : les scores seraient trop faciles à truquer. Le record reste dans le navigateur. 17 h 55 · ✅ Page d'attente en ligne (PR #11). 18 h 03 · ✅ « Ça marche bien, j'ai demandé à un pote ! » Le panel est ouvert à tous, testé par quelqu'un d'autre que moi. 18 h 06 · Le mini PC est choisi définitivement : un HP EliteDesk 800 G5 Mini avec 16 Go de RAM, pour 220 €. 18 h 12 · Je demande de continuer à alimenter cette documentation avec les nouveautés. 📘

🧠 La leçon du jour : quand plusieurs chantiers avancent en même temps, le plus important n'est pas d'aller vite, c'est l'ordre dans lequel on installe, avec une sauvegarde à chaque étape.


Vendredi 30 octobre : la v1.9, plus claire pour tout le monde

Une longue liste d'un coup, avec un mot d'ordre : « vérifie aussi toute la cohérence affichée sur le dashboard ainsi que sur le site ».

  • 🧩 L'Académie devient un module en plus, « fait par passion », et n'est plus proposée à l'arrivée. Communauté + Sécurité sont actifs tout de suite. Le site gagne une visite guidée animée (Communauté → Sécurité → Modules) et une section Modules.
  • 🌐 Commandes en anglais pour tout le monde (/help, /learn…), c'est plus standard. Et la langue par salon : un serveur peut parler français dans certains salons et anglais dans d'autres.
  • 🗂️ Panel : les sous-rubriques de chaque onglet s'affichent dans le menu pour y aller directement, les modules sont rangés tout en haut dans un menu déroulant, et Modules publics sépare les modules installés de la recherche (les plus installés, les mieux notés, par nom ou par identifiant).
  • 📊 Page « Choisir un serveur » plus détaillée et boosts dans l'aperçu.
  • 📜 Règlement : un mode avancé façon Discohook avec plusieurs cartes colorées, titres, séparateurs et images.

Le lendemain matin, une deuxième vague :

  • 🎓 « Il faut arrêter de parler du module Académie comme un module du bot par défaut. » Elle devient un petit module optionnel, fait par passion pour l'infra réseau : plus dans la bio ni dans l'accueil, et ses commandes n'apparaissent même plus dans le menu « / » des serveurs qui ne l'ont pas installée.
  • 🌐 Salons bilingues : un bouton 🇬🇧 English / 🇫🇷 Français sous les messages de Cyber, qui change la langue du message sur place.

⚠️ Problème : en passant les noms de commandes en anglais, un texte qui citait plusieurs commandes sur la même ligne ne traduisait que la première. 💡 Corrigé et vérifié sur tous les textes du bot, du panel et du site.


Bilan du carnet

Indicateur Valeur
Durée 6 jours, dont une journée de plus de 15 heures
Versions v1.0 → v1.9
Commandes 20 → 61
Langues Français et anglais
Audits de sécurité 5 (plus de 45 points corrigés)
Pull requests sur le site Plus de 10
Incidents majeurs 1 (serveur supprimé par l'hébergeur)
Données perdues Celles du serveur hébergé (les sauvegardes automatiques existent depuis)
↑ Haut de page

Chapitre 3

Choix techniques

Architecture générale
Architecture générale

Les briques du projet

Brique Technologie Pourquoi ce choix
Bot Node.js 24 LTS (20 au départ) et discord.js 14 Bibliothèque la plus utilisée pour Discord, très documentée, gère les commandes slash, boutons, menus et Components V2
Panel Express (serveur web Node) + HTML/CSS/JS sans framework Léger, tout dans le même processus que le bot, aucune dépendance lourde
Données Fichiers JSON au départ, puis SQLite (data/cyber.db) depuis le 29 octobre Les JSON suffisaient pour quelques serveurs. SQLite résiste mieux à une coupure en pleine écriture, ne réécrit que les lignes modifiées et garde les sessions du panel. Celui qui est intégré à Node.js n'ajoute aucune dépendance à surveiller.
Langues Dictionnaire maison src/i18n/ (français → anglais) Traduction au moment de l'envoi : les commandes existantes n'ont presque pas changé, et check.js vérifie qu'aucune traduction ne manque
Site HTML/CSS/JS statique généré par un script Python (build.py) Hébergement gratuit et en HTTPS sur GitHub Pages
Domaine cyberbot.fr acheté chez OVH Un .fr pour un bot francophone, prix bas, coordonnées masquées dans le Whois pour un particulier
DNS, HTTPS, accès Cloudflare (offre gratuite) DNS rapide, tunnel sortant, Access (connexion par code + 2FA, utilisé pendant la phase de test)
Code source GitHub : dépôt public pour le site, dépôt privé pour le bot Le site n'a aucun secret ; le code du bot reste privé
IA (option) API Anthropic (commande /ia) Activée seulement si une clé API est présente, avec des limites d'usage

Organisation des dossiers

Sur le PC d'Enzo, tout est regroupé dans un dossier Cyber :

Dossier Contenu Public ?
bot-cyber Le bot, le panel, les outils (générateurs de l'Académie et du site) Privé (contient le .env)
cyber-site Le site vitrine et le panel de démonstration Public : ce dépôt, publié sur https://cyberbot.fr

Structure du bot :

src/index.js              démarrage (instance unique, événements, arrêt propre)
src/deploy-commands.js    enregistre les commandes sur tous les serveurs
src/loader.js             charge src/commands/<catégorie>/*.js
src/commands/             une commande = un fichier
src/events/               interactions, messages (automod, XP, AFK), arrivée/départ de serveur…
src/utils/                store (JSON), modules, planificateur, sécurité, sauvegardes, tunnel, bio…
src/academie/             contenu de l'Académie (fiches, quiz, glossaire) + moteur du défi du jour
src/dashboard/            serveur Express du panel (OAuth2, CSRF, CSP) + interface
src/check.js              vérifie toutes les commandes avant chaque livraison
outils/academie/          sources des textes de l'Académie + générateur
outils/site/              sources du site (*.main.html) + build.py

Les scripts « un double-clic »

Enzo ne code pas : chaque opération courante tient dans un fichier .bat Windows.

Script Rôle
DEMARRER.bat Vérifie Node, installe les dépendances, lance npm audit, enregistre les commandes, ferme les anciennes copies et démarre le bot
PUBLIER.bat Envoie le site sur GitHub (commit, récupération des changements faits en ligne, puis push)
ENVOYER-GITHUB.bat Envoie le code du bot sur le dépôt privé, après avoir vérifié qu'aucun secret ni donnée ne part
RESTAURER.bat Restaure une sauvegarde : il suffit de glisser le fichier .json.gz dessus
DEMARRER.bat (illustration)
DEMARRER.bat (illustration)

Choix structurants et leurs raisons

  • Commandes enregistrées par serveur plutôt qu'en global : elles apparaissent instantanément pendant le développement. Une option « commandes globales » est prévue pour la production.
  • Instance unique : le bot réserve un port local. Une nouvelle copie demande à l'ancienne de s'arrêter. Ce choix corrige un vrai bug rencontré : plusieurs copies tournaient en même temps et chaque commande répondait deux fois.
  • Permissions minimales à l'invitation : au lieu de demander « Administrateur », l'invitation liste uniquement les permissions utiles.
  • Pas de mot de passe dans le panel : la connexion passe par Discord (OAuth2). Il n'y a donc ni mot de passe à stocker, ni base SQL à protéger.
  • Un seul panel : au début, le site avait un panel de démonstration (le même app.js avec un « adaptateur » qui simulait l'API). Depuis le 29/10/2026, cyberbot.fr/panel/ est une page d'attente qui renvoie vers le vrai panel du bot (panel.cyberbot.fr) ; la copie de démonstration a été retirée.
↑ Haut de page

Chapitre 4

Le bot et ses commandes

Évolution version par version

Version Date (2026) Contenu principal
v1.0 25 octobre 20 premières commandes : modération, informations, rôles, sondages, embeds. Bienvenue, rôle automatique, salon de logs. /pingip refuse les adresses privées.
v1.1 25 octobre « De quoi remplacer tous les autres bots » : niveaux et XP, automod, tickets, giveaways, vérification anti-raid, suggestions, tags, vocaux temporaires, /rappel, /afk, /snipe, outils réseau, menu /aide.
v1.2 26 octobre Tableau de bord façon MEE6 avec connexion Discord, nouveau logo, /userinfo complet, /blague, lancement du site.
v1.3 26 octobre Les deux modules (Communauté, Académie) ; 47 fiches CCNA, /quiz, /glossaire, défi du jour, /ia.
v1.4 26 octobre Choix des modules à l'arrivée sur un serveur, aperçus fidèles à Discord dans le panel, simulateur d'automod, serveur de support.
v1.5 26 octobre Académie enrichie : 498 questions, séries de 5 par sujet, fiches réécrites, 92 termes de glossaire ; correction des réponses en double.
v1.6 27-28 octobre Hébergement via GitHub privé, audit de sécurité, /mesdonnees, effacement automatique 30 jours après le retrait, sauvegardes quotidiennes, pages légales.
v1.7 28 octobre Panel refait (brouillon + Réinitialiser, onglets Sécurité et Modules publics), bibliothèque automod, 123 modèles de tickets, vocaux « Join to Create », défi du jour privé avec classement, messages en Components V2.
v1.7+ 29 octobre (nuit) Vérification avec rôles « Non vérifié » / « Membre » donnés et retirés automatiquement, éditeur de règlement avec 17 modèles dans le panel.
v1.8 29 octobre Bot bilingue français / anglais (/langue, /config langue, 860 textes traduits, noms anglais des commandes), automod qui démasque les lettres déguisées, panel ouvert à tous, stockage SQLite, page d'attente avec mini-jeu.
v1.9 30 octobre Noms de commandes en anglais pour tous (/help, /learn…), langue par salon (français, anglais ou les deux), Académie devenue module optionnel (Communauté + Sécurité d'office), Modules publics avec notes et recherche, sous-rubriques dans le menu du panel, boosts dans l'aperçu, règlement avancé façon Discohook.

Les modules

Depuis la v1.9, Communauté + Sécurité est la base, active dès l'arrivée. Les autres modules s'installent depuis l'onglet Modules publics du panel.

Communauté + Sécurité : modération, automod, niveaux et XP, tickets, giveaways, vérification anti-raid, suggestions, tags, rôles à boutons, vocaux temporaires, fun et utilitaires.

Académie, module optionnel fait par passion (niveau CCNA, cursus ITN / SRWE / ENSA) :

  • /apprendre : 47 fiches de cours détaillées, avec exemples et commandes Cisco ;
  • /quiz : 498 questions, séries de 5 par sujet, points, séries de victoires et classement ;
  • /defi : un quiz chaque jour dans un salon dédié, joué en privé, avec un classement publié tous les jours ;
  • /glossaire (92 termes), /osi, /port, /cisco ;
  • /ia : questions d'informatique à l'IA d'Anthropic, limitée à 5 par heure et par membre et 50 par jour et par serveur ;
  • outils réseau : /sousreseau, /dns, /convertir, /pingip.

Jusqu'à la v1.8, Cyber demandait à l'arrivée de choisir Communauté, Académie ou les deux (image ci-dessous). Depuis la v1.9, ce choix a disparu : Communauté + Sécurité est actif tout de suite, et le message d'accueil donne seulement les liens du tableau de bord, du site et du support.

Ancien choix des modules dans le panel (jusqu'à la v1.8)
Ancien choix des modules dans le panel (jusqu'à la v1.8)

Cyber parle français et anglais (v1.8)

Demande du 29 octobre : « que les utilisateurs choisissent la langue du bot, dans toutes les commandes, et n'oublie pas d'actualiser les prochaines commandes en anglais / français ».

  • Langue du serveur : /config langue ou l'onglet Général du panel. Elle sert aux messages publics (bienvenue, logs, tickets…).
  • Langue de chaque membre : /langue. Les réponses, boutons et formulaires qu'il reçoit suivent son choix.
  • Noms anglais dans le menu « / » quand Discord est en anglais (/help, /learn…).
  • Fonctionnement : un dossier src/i18n/ associe chaque texte français à sa traduction (860 textes). La traduction se fait au moment de l'envoi, juste avant la conversion en Components V2. Le code des commandes n'a donc presque pas changé.
  • Règle pour la suite : toute nouvelle commande doit être traduite, et check.js bloque la livraison s'il manque un nom ou une description en anglais.
  • Les cours de l'Académie restent en français pour l'instant.

Depuis la v1.9 (30 octobre) :

  • Les commandes s'appellent en anglais pour tout le monde (/help, /learn, /config language…), avec leur description en français si Discord est en français. C'est plus standard, et un même nom marche partout. Le code, lui, garde les noms français : le bot les renomme à la réception.
  • Langue par salon : un serveur peut être en français, en anglais, ou les deux ; dans ce dernier cas, l'admin choisit les salons ou catégories où Cyber écrit en anglais (/config language ou panel). Le choix personnel /language d'un membre reste prioritaire.

Fonctionnement interne

  • Une commande = un fichier dans src/commands/<catégorie>/. Chaque fichier exporte sa définition (data), son exécution (execute) et, si besoin, la gestion de ses boutons et de son autocomplétion.
  • Routage des boutons par préfixe : un bouton dont l'identifiant commence par ticket: est envoyé au fichier de la commande /ticket.
  • Planificateur (scheduler.js) : rappels, fin des giveaways, défi du jour, sauvegardes. Un verrou empêche deux exécutions simultanées.
  • Components V2 : depuis la v1.7, un module convertit automatiquement chaque embed envoyé en conteneur Components V2, le format le plus récent de Discord, avec un repli en embed classique si le message est trop long.
  • Stockage SQLite (depuis le 29 octobre) : les données passent de fichiers JSON réécrits en entier toutes les 2 secondes à une base cyber.db qui ne modifie que les lignes changées. Elle utilise le SQLite intégré à Node.js (aucun module à télécharger), importe toute seule les anciens JSON au premier démarrage et retombe sur l'ancien stockage si Node.js est trop ancien.
  • Vérification automatique : node src/check.js contrôle toutes les commandes (noms, options, limites de Discord) avant chaque livraison.

Statut et bio automatiques

  • Statut fixe « 🌐 cyberbot.fr · /help », réappliqué toutes les 10 minutes et après chaque reconnexion (il remplace une rotation de 5 statuts).
  • Bio « À propos de moi » vivante : toutes les 30 minutes, si les chiffres ont changé, le bot met à jour sa propre description avec le nombre de serveurs, de membres et de commandes (400 caractères maximum).
Profil Discord du bot (illustration)
Profil Discord du bot (illustration)

Liste complète des 61 commandes

Noms en anglais depuis la v1.9 (le nom français d'origine reste dans le code).

🧰 Utilitaires (17)

Commande Description Réservée au staff
/afk Indique que tu es absent (Cyber répond quand on te mentionne)
/help Liste de toutes les commandes de Cyber
/avatar Affiche l'avatar d'un membre en grand
/banner Affiche la bannière de profil d'un membre
/botinfo Informations sur le bot
/calc Calculatrice (+ - * / ^ %, sqrt, sin, cos, log, pi…)
/emoji Agrandit un émoji personnalisé
/language Choisis la langue dans laquelle Cyber te répond
/members Statistiques des membres du serveur
/mydata (voir, effacer) Voir ou effacer les données que Cyber garde sur toi
/ping Latence du bot
/remind Cyber te rappelle quelque chose plus tard (en MP)
/roleinfo Informations sur un rôle
/server Informations sur le serveur
/snipe Affiche le dernier message supprimé du salon oui
/poll Crée un sondage avec réactions
/userinfo Informations détaillées sur un compte

🎓 Académie (8)

Commande Description Réservée au staff
/learn Fiche de cours réseau / cybersécurité (niveau CCNA)
/cisco Mémo des commandes Cisco IOS
/challenge (activer, desactiver, maintenant) Défi du jour : un quiz réseau / cyber chaque jour, avec classement oui
/glossary Définition détaillée d'un terme réseau / cybersécurité
/ai Pose une question d'informatique à l'IA de Cyber
/osi Le modèle OSI, couche par couche
/port Quel service utilise ce port ? (ou l'inverse)
/quiz (jouer, classement, stats) Quiz réseau / cybersécurité niveau CCNA

🌐 Outils réseau (4)

Commande Description Réservée au staff
/convert Convertit un nombre (décimal, binaire, hexa, octal)
/dns Interroge le DNS d'un nom de domaine public
/pingip Ping une adresse IP publique ou un nom de domaine
/subnet Calculateur de sous-réseau IPv4

📈 Niveaux (4)

Commande Description Réservée au staff
/leaderboard Top 10 des membres les plus actifs
/rank Ton niveau et ton XP
/reward (ajouter, retirer, liste) Rôles donnés automatiquement à un niveau oui
/xp (ajouter, retirer, reset) Gérer l'XP des membres oui

⚙️ Systèmes (7)

Commande Description Réservée au staff
/automod (activer, filtre, mot, autoriser, exempter, sanction, voir) Modération automatique oui
/giveaway (lancer, terminer, reroll) Concours avec tirage au sort oui
/suggest Propose une idée pour le serveur
/tag (voir, creer, supprimer, liste) Réponses enregistrées (règles, liens, FAQ…)
/ticket (panel, fermer, ajouter, retirer) Système de tickets de support
/verification Panneau de vérification anti-bots (bouton qui donne un rôle) oui
/voice (renommer, limite, statut, panneau) Règle ton salon vocal temporaire

🛡️ Modération (9)

Commande Description Réservée au staff
/ban Bannit un utilisateur oui
/clear Supprime des messages dans ce salon oui
/kick Expulse un membre oui
/mute Rend un membre muet temporairement (timeout) oui
/nickname Change le pseudo d'un membre sur le serveur oui
/channel (verrouiller, deverrouiller, slowmode) Gestion du salon actuel oui
/unban Débannit un utilisateur via son ID oui
/unmute Retire le mute d'un membre oui
/warn (ajouter, liste, effacer) Gestion des avertissements oui

🎭 Rôles (2)

Commande Description Réservée au staff
/rolepanel Crée un panneau où les membres choisissent leurs rôles avec des boutons oui
/role (donner, retirer) Donner ou retirer un rôle oui

🎲 Fun (7)

Commande Description Réservée au staff
/joke Une blague ou une devinette au hasard
/choose Choisit au hasard parmi plusieurs options
/compatibility Taux de compatibilité entre deux membres
/dice Lance un ou plusieurs dés
/rate Cyber note n'importe quoi sur 10
/rps Pierre, feuille, ciseaux contre Cyber
/coinflip Lance une pièce

🔧 Admin (3)

Commande Description Réservée au staff
/config (bienvenue, logs, autorole, niveaux, vocal, suggestions, giveaways, langue, voir) Configuration du bot sur ce serveur oui
/embed Crée un message embed personnalisé (annonce, règlement…) oui
/modules Activer ou désactiver les modules de Cyber sur ce serveur oui
↑ Haut de page

Chapitre 5

Le panel d'administration

Le panel est un site web intégré au bot qui permet de tout régler sans taper de commande. On s'y connecte avec son compte Discord, puis on choisit un serveur dont on a la permission « Gérer le serveur ».

Le vrai panel est en ligne sur https://panel.cyberbot.fr, ouvert à tous depuis le 29 octobre. Avant cette date, le site proposait une version de démonstration (bouton « Essayer sans compte »), avec le même code mais des réglages gardés dans le navigateur. Toutes les captures de ce chapitre viennent de ce mode démo, donc sans aucune donnée réelle.

Liste des serveurs
Liste des serveurs

Étape 1 · Premier panel (v1.2 à v1.4)

  • Connexion Discord OAuth2, réglages en quelques clics, aperçu des messages en direct.
  • Onglets par fonction : bienvenue, niveaux, tickets, automod, vérification, Académie…
  • Aperçus fidèles à Discord : on voit le message de bienvenue, le passage de niveau ou le panneau de tickets exactement comme il apparaîtra.
  • Simulateur d'automod : on teste un message avant d'enregistrer ses règles.

Étape 2 · Refonte « Console cyber » (28 octobre)

Trois styles ont été proposés à Enzo : « Console cyber », « Moderne épuré » ou « Garder et polir ». Il a choisi Console cyber, qui colle à l'identité du bot (rouge, masque de démon, univers réseau).

Ce qui a changé :

  • barre latérale pleine hauteur, rangée en groupes (Serveur, Communauté, Sécurité, Académie, Modules), avec des icônes et un point vert sur ce qui est déjà configuré ;
  • page d'aperçu avec une grande carte Membres et des modules cliquables ;
  • version mobile : les onglets deviennent une barre qui défile ;
  • la refonte a d'abord été proposée sur une branche du site (pull request #1), testée en mode démo sur ordinateur et téléphone, puis fusionnée.
Aperçu du serveur
Aperçu du serveur
Version mobile
Version mobile

Étape 3 · Panel v1.7 : les 7 lots demandés par Enzo

Après avoir parcouru chaque réglage, Enzo a listé ce qui manquait. Tout a été livré en une soirée, en 7 lots :

Lot Demande d'Enzo Résultat
1 Pouvoir changer d'onglet sans enregistrer, et un bouton Réinitialiser « comme sur Discord » Les onglets modifient un brouillon. Une barre fixe « Réinitialiser / Enregistrer les modifications » apparaît dès qu'on change quelque chose. Quitter avec des modifications fait trembler la barre. Seuls les réglages modifiés sont envoyés.
2 Séparer tickets et vérification, créer des onglets Communauté / Sécurité / Modules publics Nouvelle navigation : Serveur, Communauté, Sécurité, Académie, Modules publics.
3 Une bibliothèque de mots interdits avec leurs variantes, et des mots autorisés Environ 250 mots classés (insultes, haine, harcèlement, arnaques…) détectés même déguisés (c0nn4rd, c.o.n.n.a.r.d), plus une liste blanche.
4 Des centaines de modèles de tickets prêts à l'emploi 123 modèles en 12 catégories (recrutement, plainte, partenariat, boutique, jeux, roleplay…), modifiables, avec jusqu'à 5 questions posées à l'ouverture et un bouton « Prendre en charge ».
5 Des vocaux temporaires automatisés Système « Join to Create » : salon créateur installé en un clic, options par défaut, panneau /vocal pour renommer, limiter, verrouiller, masquer, définir un statut…
6 Un défi du jour dans un salon créé automatiquement, joué en privé, avec un top 5 ou 10 Le salon est créé à l'enregistrement. Chaque membre répond en messages éphémères (visibles par lui seul). À l'heure choisie, le classement est publié et reste dans le salon, puis un nouveau quiz commence.
7 Tous les messages au format « Embeds V2 » Conversion automatique de tous les messages en Components V2.
Tickets : 123 modèles
Tickets : 123 modèles
Automod avec bibliothèque de mots
Automod avec bibliothèque de mots
Vocaux temporaires
Vocaux temporaires
Défi du jour
Défi du jour
Vérification anti-raid
Vérification anti-raid
Modules publics (les modules sur mesure arrivent « Bientôt »)
Modules publics (les modules sur mesure arrivent « Bientôt »)

Étape 4 · Vérification et règlement (nuit du 28 au 29 octobre)

  • L'onglet Vérification permet de choisir ou créer les rôles « Non vérifié » et « Membre ».
  • Chaque nouveau membre reçoit automatiquement « Non vérifié », sans dépendre du rôle automatique. Le bouton du règlement lui donne « Membre » et retire « Non vérifié ».
  • Un éditeur de règlement propose 17 modèles prêts à l'emploi (le premier est celui du serveur de support), avec aperçu et publication en un clic.
  • Option pour cacher tous les autres salons aux non-vérifiés.

Étape 5 · Le panel ouvert à tous (29 octobre)

Jusque-là, Cloudflare Access ne laissait entrer que moi. Le 29 octobre, je veux que tout le monde puisse configurer Cyber, « sans faille de sécurité ni connexion token bizarre ».

  1. Vérification avant ouverture (audit n°5, chapitre 8) : un seul trou trouvé et corrigé.
  2. Fin de la « connexion bizarre » : l'ancien panel d'aperçu de cyberbot.fr/panel/ mettait un jeton Discord dans l'adresse (flux OAuth « implicite »). Il est remplacé par un simple renvoi vers panel.cyberbot.fr, qui utilise la vraie connexion Discord du bot.
  3. Retrait de Cloudflare Access et de l'ancienne adresse de redirection dans le portail Discord.
  4. Sessions durables : elles sont enregistrées dans SQLite (seulement l'identifiant et le pseudo Discord, la clé de session stockée sous forme d'empreinte). Un redémarrage du bot ne déconnecte plus personne, et la connexion dure 7 jours.
  5. Page d'attente avec mini-jeu : si le panel met plus d'une seconde à répondre ou si mon PC est éteint, cyberbot.fr/panel/ affiche un petit jeu original (le robot Cyber saute par-dessus des bugs) et réessaie toutes les 15 secondes.
  6. Test final : un ami s'est connecté avec son propre compte. « Ça marche bien ! »
Page d'attente du panel avec le mini-jeu
Page d'attente du panel avec le mini-jeu

Étape 6 · Panel v1.9 : plus rapide à parcourir (30 octobre)

  • Menu avec sous-rubriques : l'onglet ouvert affiche ses parties (par exemple Vérification → Rôles, Message du règlement, Salon et publication) pour y sauter directement.
  • Modules tout en haut : Modules publics, puis chaque module (Académie) dans son propre menu déroulant, séparé des réglages de base.
  • Modules publics en deux parties : « Installés sur ce serveur » et « Trouver un module » (les plus installés, les mieux notés, nouveautés, recherche par nom ou par identifiant, lien vers le support). Chaque serveur peut noter un module de 1 à 5 étoiles. Le code de module sur mesure tient dans un petit bouton en haut.
  • Choisir un serveur : chaque carte montre les membres, les membres en ligne, les boosts, les salons, la langue, les modules et depuis quand Cyber est là.
  • Aperçu : nombre de boosts et niveau, émojis.
  • Langue : français, anglais, ou les deux avec la liste des salons en anglais.
  • Règlement avancé façon Discohook : plusieurs cartes, chacune avec sa couleur, et des blocs titre, texte, petit texte, séparateur ou image, avec l'aperçu en direct.

Sécurité du panel

Le panel n'a ni mot de passe ni base SQL : aucune injection SQL n'est possible. Les protections en place :

  • connexion Discord OAuth2 avec paramètre state contre les attaques CSRF ;
  • cookie de session HttpOnly, SameSite=Lax, et Secure en HTTPS ;
  • textes affichés avec textContent ou échappés (contre le XSS) et politique CSP script-src 'self' ;
  • en-tête personnalisé et contrôle de l'origine sur toutes les requêtes qui modifient quelque chose ;
  • permission « Gérer le serveur » revérifiée en direct à chaque requête ;
  • limite de requêtes par adresse IP (la vraie IP est lue derrière le tunnel Cloudflare) ;
  • HSTS dès que le panel est en HTTPS ;
  • le panel n'écoute que sur 127.0.0.1 : il n'est jamais exposé en HTTP simple sur Internet.

Depuis le 29 octobre s'ajoutent les sessions enregistrées sous forme d'empreinte et le salon des logs modifiable seulement par un administrateur (audit n°5). Le détail de l'accès par tunnel est au chapitre 7.

↑ Haut de page

Chapitre 6

Le site et le domaine cyberbot.fr

Le site vitrine

Le site présente Cyber, liste ses commandes, explique comment démarrer et publie l'historique des versions. Il est hébergé gratuitement par GitHub Pages, en HTTPS.

Page d'accueil
Page d'accueil
Page Contenu
Accueil Présentation, fonctions, liste des commandes avec recherche, FAQ
Bien démarrer Guide pas à pas après l'invitation du bot
Nouveautés Statut et historique des versions
Conditions, Confidentialité, Mentions légales Pages légales (voir chapitre 9)
Panel Renvoi vers le vrai panel panel.cyberbot.fr, avec une page d'attente et un mini-jeu s'il ne répond pas (depuis le 29 octobre ; avant, une démonstration sans compte)
English Accueil en anglais (29 octobre)
Modules sur mesure Présentation des futures « cassettes », annoncées « Bientôt »
404 Page d'erreur aux couleurs de Cyber
Liste des commandes
Liste des commandes

Comment le site est fabriqué

  1. Les pages sont écrites dans le dossier du bot, sous outils/site/<page>.main.html.
  2. Le script build.py ajoute l'en-tête, le pied de page et des numéros de version « anti-cache », puis écrit les pages dans le dossier du site. Il réécrit aussi le fichier CNAME. Depuis le 1er novembre, il écrit des adresses propres, sans « .html » : cyberbot.fr/demarrer au lieu de cyberbot.fr/demarrer.html, et cyberbot.fr/ au lieu de cyberbot.fr/index.html. GitHub Pages trouve tout seul le fichier demarrer.html, et un petit script enlève le « .html » de la barre d'adresse si quelqu'un tape l'ancienne adresse (les anciens liens marchent donc toujours).

  3. commandes.js est généré à partir du code du bot : la liste du site est donc toujours à jour.

  4. PUBLIER.bat envoie le tout sur GitHub. Le site est en ligne 1 à 2 minutes plus tard.

Les polices (Orbitron, Inter) sont hébergées sur le site lui-même pour ne rien envoyer à Google.

Bien démarrer
Bien démarrer
Nouveautés
Nouveautés

Les 10 améliorations du 29 octobre

À ma question « qu'est-ce qu'on pourrait modifier sur le site ? », Claude a proposé 10 idées classées par priorité. J'ai répondu « tout » :

  1. Page 404 personnalisée, à la place de la page grise de GitHub.
  2. robots.txt et sitemap.xml pour que Google trouve toutes les pages, documentation comprise.
  3. Images en WebP : le logo, affiché en 38 pixels, pesait 207 Ko. Il est maintenant environ 26 fois plus léger.
  4. Aperçu des liens partagés sur Discord ou X, avec une image dédiée.
  5. Section « Cyber en images » avec des captures du panel.
  6. 3 questions de plus dans la FAQ : gratuit ? permissions ? données ?
  7. Compteur en direct des membres du serveur de support.
  8. Lien « Docs » vers cette documentation dans le menu.
  9. Accueil en anglais, mis à jour le soir même quand le bot est devenu bilingue.
  10. Page « Modules sur mesure » avec un bouton « Demander un module ».
Accueil en anglais
Accueil en anglais
Page Modules sur mesure
Page Modules sur mesure
Page 404
Page 404

Le même jour, l'ancien panel de démonstration a laissé la place à un renvoi vers le vrai panel (chapitre 5).

Achat du nom de domaine (28 octobre)

Les noms cyber.com ou cyberbot.com étant presque sûrement pris ou très chers, le choix s'est porté sur cyberbot.fr :

  • acheté chez OVH pour environ 6 € la première année ;
  • sans option payante (pas d'e-mail, pas de DNS Anycast) ;
  • DNSSEC retiré à l'achat pour éviter une panne au moment du transfert des DNS vers Cloudflare (il pourra être réactivé côté Cloudflare) ;
  • renouvellement automatique activé ;
  • pour un particulier, le .fr masque le nom et l'adresse dans l'annuaire public (Whois).

Passage des DNS sur Cloudflare

  1. Ajout du domaine dans Cloudflare (offre Free), avec le blocage des robots d'entraînement d'IA activé.
  2. Chez OVH : « Utiliser mes propres DNS », avec les deux serveurs de noms fournis par Cloudflare.
  3. Ajout de deux enregistrements anti-usurpation, puisque aucun e-mail n'est envoyé avec @cyberbot.fr :
    • TXT @ "v=spf1 -all" : aucun serveur n'a le droit d'envoyer de mail pour ce domaine ;
    • TXT _dmarc "v=DMARC1; p=reject;" : les faux mails doivent être rejetés.
  4. Activation du domaine en moins d'une heure.

Le site passe de github.io à cyberbot.fr

  1. Quatre enregistrements A vers les serveurs de GitHub Pages et un CNAME www vers enzocerejo.github.io, tous en DNS only (nuage gris) : sinon GitHub ne peut pas créer le certificat HTTPS.
  2. Vérification du domaine dans GitHub (enregistrement TXT _github-pages-challenge-…).
  3. Domaine personnalisé ajouté au dépôt, puis Enforce HTTPS coché une fois le certificat créé.
  4. Côté code : fichier CNAME ajouté et protégé (réécrit à chaque build), tous les liens remplacés, PUBLIER.bat amélioré pour récupérer d'abord les modifications faites en ligne avant d'envoyer.
Enregistrements DNS (illustration)
Enregistrements DNS (illustration)
GitHub Pages avec domaine personnalisé (illustration)
GitHub Pages avec domaine personnalisé (illustration)

Protéger la branche principale

Un ruleset GitHub protège la branche main du site : suppression interdite et « force push » bloqué. Les pull requests ne sont pas obligatoires pour que PUBLIER.bat puisse continuer à publier directement.

Les pull requests du site

PR Contenu
#1 Nouvelle interface « Console cyber » du panel de démonstration
#2 Pages légales réécrites, mentions légales, /mesdonnees dans la liste des commandes
#3 Cette documentation
↑ Haut de page

Chapitre 7

Hébergement, GitHub privé et tunnel Cloudflare

Ce chapitre raconte le chemin le plus « réseau » du projet : faire tourner le bot 24 h/24, puis rendre son panel accessible en HTTPS sans ouvrir un seul port.

Étape 1 · Un hébergeur provisoire (26 octobre)

En attendant une machine personnelle, le bot est installé chez Teoheberg, un hébergeur gratuit à crédits basé sur Pterodactyl (chaque serveur est un conteneur Docker).

Adaptations faites dans le code :

  • un fichier index.js à la racine qui lance src/index.js (le panel de l'hébergeur lance index.js) ;
  • détection automatique de Pterodactyl : le panel écoute sur le port attribué et les commandes s'enregistrent au démarrage (il n'y a pas de DEMARRER.bat là-bas) ;
  • compatibilité Node 25 vérifiée ; sur le PC, rien ne change.

Règle importante découverte en route : ne jamais lancer le bot sur le PC et sur l'hébergeur en même temps, sinon chaque commande reçoit deux réponses.

Console de l'hébergeur au démarrage (illustration)
Console de l'hébergeur au démarrage (illustration)

Étape 2 · Mises à jour par un dépôt GitHub privé

Au lieu d'envoyer un zip à chaque modification :

  1. Enzo crée un dépôt privé sur GitHub.
  2. ENVOYER-GITHUB.bat envoie le code, en refusant de partir si un secret ou le dossier data/ risque d'être inclus. Le .gitignore exclut .env, data/, node_modules/ et les zips.
  3. L'hébergeur lit le dépôt avec un jeton GitHub « fine-grained » en lecture seule, limité à ce seul dépôt.
  4. Avec l'option « auto update », un simple Restart fait git pull, npm install puis relance le bot.

Le .env (token du bot, secrets) n'est jamais sur GitHub : il est créé à la main dans le gestionnaire de fichiers de l'hébergeur.

Les deux chemins de publication
Les deux chemins de publication

Étape 3 · Le panel injoignable

Le bot fonctionnait, mais l'adresse du panel donnait ERR_CONNECTION_TIMED_OUT. Diagnostic en deux temps :

  1. Le nom de l'hébergeur passait par Cloudflare, qui ne relaie que les ports web classiques (80, 443…), pas le port attribué.
  2. Le support a ensuite confirmé que la machine n'avait aucun port entrant ouvert.

Le bot, lui, marchait parce que c'est lui qui se connecte à Discord (connexion sortante). C'est cette idée qui donne la solution.

Étape 4 · Le tunnel Cloudflare

Un tunnel Cloudflare inverse le sens de la connexion : c'est le serveur qui appelle Cloudflare, et Cloudflare renvoie ensuite les visiteurs de panel.cyberbot.fr vers lui. Résultat : HTTPS, adresse IP cachée, et aucun port à ouvrir.

Ce qui a été codé (src/utils/tunnel.js) :

  • si TUNNEL_TOKEN est présent dans le .env, le bot télécharge le programme officiel cloudflared et le lance ;
  • connexion en http2 sur le port TCP 7844 sortant ;
  • cloudflared reçoit un environnement minimal : il ne voit pas le token Discord ;
  • il est relancé automatiquement s'il tombe ;
  • son empreinte SHA-256 est retenue au premier téléchargement et vérifiée à chaque lancement (et peut être fixée sur la valeur officielle publiée par Cloudflare) ;
  • le panel n'écoute alors plus que sur 127.0.0.1.

Côté Cloudflare : création du tunnel cyber-teoheberg, puis d'une route publique panel.cyberbot.fr vers le service local du panel.

Tunnel Cloudflare en bonne santé (illustration, identifiants masqués)
Tunnel Cloudflare en bonne santé (illustration, identifiants masqués)

Deux pièges rencontrés et résolus

  • Mauvaise empreinte : le .env du PC contenait l'empreinte de la version Linux de cloudflared alors que le PC télécharge la version Windows. La sécurité a bloqué le lancement, exactement comme prévu. Il a suffi de mettre l'empreinte officielle de la version Windows.
  • localhost vers IPv6 : sur Windows, localhost a été traduit en ::1 (IPv6) alors que le panel n'écoute qu'en IPv4. La route a été corrigée en http://127.0.0.1:3000, et l'erreur « Bad gateway » a disparu.

Étape 5 · Cloudflare Access : un cadenas devant le panel

Même en HTTPS, une adresse publique peut être visitée par n'importe qui. Cloudflare Access (gratuit) ajoute une vérification avant même d'afficher le panel :

  1. application « Panel Cyber » sur panel.cyberbot.fr, session de 24 h ;
  2. règle « Moi » : Allow uniquement pour l'adresse e-mail d'Enzo ;
  3. méthode de connexion One-time PIN seule (code reçu par mail), avec « instant authentication » ;
  4. MFA : un code TOTP à 6 chiffres depuis une application d'authentification (Bitwarden), en plus du code par mail ;
  5. nom d'équipe personnalisé pour la page de connexion.

Cloudflare répond de la même façon que l'adresse tapée soit autorisée ou non : personne ne peut deviner laquelle est sur la liste.

29 octobre : ce cadenas a joué son rôle pendant la phase de test. Pour que tout le monde puisse configurer Cyber, l'application Access a été supprimée après un audit du panel (chapitre 8, audit n°5). La sécurité repose désormais sur la connexion Discord du panel et sur la permission « Gérer le serveur », revérifiée à chaque requête. L'application peut être recréée en deux minutes si besoin.

Les cinq verrous du panel
Les cinq verrous du panel

Étape 6 · Le tunnel depuis le PC

Après la suppression du serveur de l'hébergeur (voir chapitre 11), le même tunnel a été relancé depuis le PC d'Enzo, simplement en modifiant la route vers 127.0.0.1:3000. Le panel est accessible sur https://panel.cyberbot.fr tant que le PC et le bot sont allumés. Pour un futur serveur, il suffira de copier le .env avec l'empreinte adaptée et de pointer la route sur 127.0.0.1:<port>.

Le futur hébergement : un mini PC « homelab »

Comparaison faite pour un hébergement à la maison :

Critère Raspberry Pi 5 (8 Go) Mini PC reconditionné (format 1 litre)
Prix observé fin 2026 ≈ 230 € en kit ≈ 150-220 € d'occasion, ≈ 300-350 € en reconditionné pro
Processeur ARM x86 (i5 8ᵉ/9ᵉ génération)
Stockage microSD ou SSD avec carte en plus SSD NVMe inclus
Virtualisation Très limitée Proxmox, plusieurs VM (pfSense, Windows Server, labos)
Compatibilité Docker La plupart des images Toutes

Conclusion retenue : un mini PC reconditionné (HP EliteDesk 800 G4/G5 Mini, Lenovo ThinkCentre M720q/M920q, Dell OptiPlex 7070 Micro) avec Proxmox ou Debian, Docker et le tunnel Cloudflare déjà prêt. Il servira aussi de laboratoire pour le BTS CIEL et le CCNA. Choix final (29 octobre) : un HP EliteDesk 800 G5 Mini d'occasion (i5-9500 6 cœurs, 16 Go de RAM, SSD 500 Go, Wi-Fi) à 220 €, préféré à un modèle à 200 € qui n'avait que 12 Go. Mon père l'achète le samedi 31 octobre avec la transaction sécurisée de leboncoin. Prévu ensuite : Proxmox, une VM Debian avec Docker pour le bot, le panel et le tunnel, puis des VM de labo (pfSense, Windows Server, Linux) allumées seulement pour réviser.

Et en attendant ?

Le 29 octobre, j'ai aussi étudié un hébergement payant pour que le panel reste disponible même quand mon PC est éteint :

Option Prix Avis
Hetzner Cloud CX23 (2 vCPU, 4 Go) ≈ 4 €/mois, facturé à l'heure Recommandé : fiable, sans engagement, bots et tunnels autorisés
Oracle Cloud « Always Free » Gratuit Offre réduite en 2026, carte bancaire, serveur arrêté sans prévenir s'il travaille peu
OVHcloud VPS-1 ≈ 7,79 €/mois Plus confortable mais plus cher pour 2 ou 3 mois
Hébergeurs « gratuits spécial bots » « Gratuit » Écartés : c'est le genre qui a supprimé mon serveur

Décision : rester sur le PC pour l'instant (le panel est disponible quand il est allumé) et décider dans quelques jours. Le tunnel ne changera pas : il suffira de le lancer depuis la nouvelle machine.

↑ Haut de page

Chapitre 8

Sécurité et audits

La sécurité a été traitée comme un fil rouge : cinq audits en quatre jours, chaque fois avec un rapport classé par priorité, une explication simple de chaque faille, puis les corrections testées.

Bilan des audits
Bilan des audits

Les règles de base

  • Le .env ne quitte jamais la machine : il contient le token du bot, le secret OAuth2, le token du tunnel et la clé d'API. Il est exclu par .gitignore et les scripts d'envoi bloquent tout ce qui ressemble à un secret.
  • Dépôt du bot privé, dépôt du site public mais sans aucun secret.
  • Moindre privilège partout : invitation sans « Administrateur », jeton GitHub en lecture seule sur un seul dépôt, panel limité à 127.0.0.1, cloudflared lancé sans accès au token Discord.
  • Pas de contact personnel sur le site : le contact passe par le serveur Discord de support.

Audit n°1 · Sécurité du code et de la configuration (26 octobre)

Point de départ : npm audit signalait 4 vulnérabilités dans Express. Elles ont été corrigées (Express 4.22.3, 0 vulnérabilité), puis tout le code a été passé en revue. 12 failles corrigées :

Faille Risque concret Correction
Dépendances Express vulnérables Une requête piégée pouvait faire planter le bot (déni de service) Mise à jour, npm audit à 0
Rôles donnés automatiquement sans contrôle (la plus grave) Un rôle Admin placé dans la vérification, l'autorôle, une récompense ou un panneau de rôles rendait n'importe quel membre administrateur Un rôle avec des permissions de modération ou d'admin n'est jamais distribué automatiquement, et la personne qui le configure doit pouvoir le donner elle-même
Mentions @everyone / @here Faire pinger tout le serveur par Cyber via un tag ou un rappel Par défaut, Cyber ne mentionne que des membres
Invitation en Administrateur Si le token fuitait, contrôle total de chaque serveur Lien d'invitation avec les seules permissions utiles
Fixation de session Réutiliser un cookie connu après la connexion de la victime Nouveau cookie à chaque connexion, vérification stricte du state
Panel sans limite de requêtes Saturer la mémoire de sessions Limites par IP, sessions inactives effacées, plafond global
Publication dans n'importe quel salon Faire poster un panneau dans un salon invisible pour l'admin Droits de lecture et d'écriture vérifiés
Clés spéciales (__proto__, constructor) Écrire n'importe quoi dans la configuration (pollution de prototype) Liste blanche des réglages, en-têtes de sécurité renforcés
/pingip Une IPv6 cachant une adresse privée (::ffff:7f00:1) permettait de sonder le réseau de l'hébergeur (SSRF) Détection complète des adresses privées, limite globale de 20 pings par minute
/dns Révéler des adresses internes Adresses privées masquées
/embed Publier là où le modérateur n'a pas le droit d'écrire Droits revérifiés au moment de publier
Spam (tickets, vocaux, boutons, tags) Créer des dizaines de salons ou cliquer en boucle Limites de fréquence et plafonds

Vérifié sans problème : /calcul (aucun eval), expressions régulières de l'automod, affichage du panel (texte toujours échappé).

Audit n°2 · Le panel face aux attaques web (28 octobre)

Question d'Enzo : « Les injections SQL sont-elles possibles sur le login admin ? »

Réponse : non, car il n'y a ni base SQL ni mot de passe. Le reste a été vérifié (XSS, CSRF, cookies, vol de session, force brute, permissions) et 3 améliorations ont été faites :

  • derrière le tunnel, toutes les requêtes semblaient venir de la même IP : un seul abuseur pouvait bloquer tout le monde. Le panel lit désormais la vraie IP transmise par Cloudflare (seulement si la requête vient bien du tunnel local) ;
  • un cookie mal formé ne provoque plus d'erreur, et un robot ne peut plus déconnecter les vrais utilisateurs en saturant les sessions ;
  • HSTS activé dès que le panel est en HTTPS.

Audit n°3 · Audit global (28 octobre après-midi)

Bot, panel, site et dépôts. Aucune fuite de secret trouvée (site, historique Git, archives). Points traités :

Critique

  1. Le serveur de l'hébergeur ayant été supprimé sans explication, tous les secrets qui s'y trouvaient ont été régénérés (token du bot, secret OAuth2, token du tunnel, jeton GitHub).

Importants

  1. Aucune sauvegarde de data/, et un fichier JSON abîmé était remplacé par un fichier vide → sauvegardes quotidiennes automatiques (7 jours), envoi possible dans un salon Discord privé, fichier corrompu mis de côté au lieu d'être écrasé, RESTAURER.bat.
  2. Défi du jour qui pouvait boucler à l'infini si son salon disparaissait → désactivation après 3 échecs et message dans les logs.
  3. cloudflared téléchargé sans vérification → version fixée et empreinte SHA-256 contrôlée.
  4. Cloudflare Access devant le panel → mis en place avec code par mail et application 2FA (voir chapitre 7).

Mineurs (tous corrigés) : membres du serveur mis en cache 5 minutes, petites fuites de mémoire nettoyées toutes les 10 minutes, automod optimisé, verrou sur le planificateur, giveaways terminés supprimés N jours après leur fin (réglable avec /config giveaways jours:, idée d'Enzo pour les giveaways qui durent plus de 30 jours), .gitignore ajouté au site, panel jamais servi en HTTP public sans tunnel, npm audit lancé à chaque démarrage, alertes Dependabot et Malware alerts activées sur le dépôt privé.

Choix de sauvegarde discuté avec Enzo : GitHub ou Discord ? Discord a été retenu, car GitHub aurait demandé de donner au bot un jeton en écriture (un secret de plus à protéger), alors que les données ne pèsent que quelques Ko.

Audit n°4 · « Je veux que tout soit nickel » (28 octobre soir)

Aucune faille grave, et les anciennes failles des commandes restent bouchées. 15 petits trous corrigés :

  1. Triche au quiz : la bonne réponse se devinait dans l'identifiant des boutons (lisible avec un Discord modifié). Elle est maintenant protégée par une signature HMAC avec une clé secrète.
  2. Automod contournable en envoyant un message propre puis en le modifiant : les messages modifiés sont maintenant vérifiés.
  3. /userinfo montrait à tous le nombre d'avertissements : réservé aux modérateurs.
  4. /suggestion et /rappel pouvaient faire écrire Cyber dans un salon en lecture seule : bloqué.
  5. /dns et /pingip acceptaient des noms du réseau local (.lan, .home, .local) : refusés.
  6. Faux positifs de l'automod à cause des accents (mot interdit trouvé à l'intérieur d'un mot normal) : recherche de mots en Unicode.
  7. Avertissement si le salon de logs est public ; @everyone refusé pour le défi ; double fermeture de ticket ; doublons dans /panelroles ; numérotation de /warn ; salons vocaux et tickets orphelins nettoyés au démarrage ; bot qui ne plante plus si le disque est plein ; sauvegardes conservées avec Docker.

Un bug de sauvegarde a aussi été trouvé grâce à un retour d'Enzo : la sauvegarde du jour n'était envoyée sur Discord qu'au moment de sa création. Si elle avait été créée avant la configuration du salon, elle n'était jamais envoyée. Désormais, le bot la renvoie tant qu'elle n'est pas bien arrivée.

Audit n°5 · Ouvrir le panel à tout le monde (29 octobre)

Question posée : « Entre le site et le panel, c'est sécurisé ? » Avant de retirer Cloudflare Access, le chemin complet a été revérifié point par point :

Point vérifié Résultat
Connexion Discord OAuth2 Paramètre state anti-falsification, retour accepté seulement vers panel.cyberbot.fr/callback, nouveau cookie après connexion
Cookies HttpOnly, Secure, SameSite
Droits « Gérer le serveur » et présence du bot revérifiés en direct sur Discord à chaque requête
CSRF et XSS En-tête spécial + origine vérifiée, CSP stricte, textes échappés
Abus Limite de requêtes par personne (vraie IP lue derrière Cloudflare), sessions limitées
Exposition Le panel n'écoute que sur la machine elle-même : seul le tunnel peut l'atteindre

Un seul trou trouvé : dans le panel, un modérateur avec « Gérer le serveur » pouvait changer le salon des logs, alors que la commande /config logs le réserve aux administrateurs. Il aurait pu rediriger les messages supprimés et les tickets vers un salon qu'il voit. Corrigé : réservé aux administrateurs et au propriétaire.

Dans la foulée :

  • la « connexion token bizarre » de l'ancien panel d'aperçu (jeton Discord dans l'adresse) a été supprimée au profit d'un renvoi vers le vrai panel ;
  • les sessions ont été rangées dans SQLite sous forme d'empreinte (jamais le cookie lui-même), exclues des sauvegardes et effacées par /mesdonnees ;
  • un classement mondial du mini-jeu a été déconseillé : n'importe qui pourrait envoyer un faux score en deux secondes.

Test final avec un autre compte Discord : validé.

L'automod contre les lettres déguisées (29 octobre)

Ma question : « On pourrait intégrer un peu d'IA dans l'automod, qui peut être contourné avec deux ou trois changements de texte ? » Deux couches ont été proposées :

  1. Gratuite (installée) : avant de chercher les mots interdits, le texte est « aplati ». Les caractères invisibles sont retirés, les lettres stylisées (𝐜𝐨𝐧, ⓒⓞⓝ), les lettres russes ou grecques qui ressemblent aux nôtres et les lettres-drapeaux sont ramenées à des lettres normales, et les mots coupés par un symbole (« con-nard », « con🤡nard ») sont recollés. Testé sans faux positif sur des phrases normales comme « la mer de glace ».
  2. IA (Claude Haiku, environ 5 centimes pour 1 000 messages, avec une clé API séparée de mon abonnement) : elle comprendrait aussi les insultes reformulées. J'ai préféré ne rien dépenser pour l'instant. Le code est gardé de côté.

Protections du compte et de l'infrastructure

  • Double authentification sur les comptes Discord, GitHub et Cloudflare.
  • Ruleset GitHub sur main (pas de suppression, pas de force push).
  • Enregistrements SPF et DMARC qui empêchent d'usurper @cyberbot.fr.
  • Redirections OAuth2 obsolètes supprimées du portail Discord (une ancienne adresse d'hébergeur aurait pu être récupérée par quelqu'un d'autre).
↑ Haut de page

Chapitre 9

Données personnelles et vérification Discord

Un bot présent sur plus de 75 serveurs doit demander la vérification de Discord. Enzo voulait que tout soit en ordre avant : code, pages légales et réglages du portail.

Ce que le bot a dû changer

Avant Après
Les données d'un serveur restaient pour toujours après le retrait du bot Effacement automatique 30 jours après le retrait (annulé si le bot est réinvité). Vérifié aussi au démarrage, au cas où le bot était éteint au moment du retrait.
Aucun moyen pour un membre de voir ou d'effacer ses données /mesdonnees voir : le membre reçoit en privé un fichier JSON avec tout ce que Cyber garde sur lui. /mesdonnees effacer : XP, scores de l'Académie, AFK, rappels et participations aux giveaways sont effacés sur tous les serveurs. Les avertissements restent aux modérateurs.
Nouvelles données du 29 octobre La langue choisie avec /langue et les sessions du panel (identifiant et pseudo Discord, clé de session gardée sous forme d'empreinte) sont incluses dans /mesdonnees, effacées par /mesdonnees effacer et décrites dans la politique de confidentialité. Les sessions sont exclues des sauvegardes.
Sauvegardes du salon Discord sans limite Seules les 7 dernières sont gardées

Règle de maintenance notée pour la suite : toute nouvelle donnée stockée doit être ajoutée au module donnees.js (export et effacement) et à la politique de confidentialité.

Les pages légales du site

Réécrites après recherche sur le RGPD, la loi française (LCEN) et les règles de Discord :

  • Conditions d'utilisation : service gratuit, règles d'usage, responsabilités, contact.
  • Politique de confidentialité : liste précise des données, finalités, bases légales, durées de conservation, droits RGPD et comment les exercer (/mesdonnees), transferts hors UE (commande /ia traitée par Anthropic aux États-Unis, données gardées 30 jours chez eux), sous-traitants.
  • Mentions légales (nouvelle page) : obligatoires en France (LCEN, article 1-1 II pour un éditeur non professionnel), avec l'hébergeur du site (GitHub).
Page Mentions légales
Page Mentions légales

Ces pages sont aussi déclarées dans le portail développeur Discord (Terms of Service URL et Privacy Policy URL), ce qui les affiche sur le profil du bot et dans la fenêtre d'invitation.

Checklist de la vérification

Étape État au 28/10/2026
Code conforme (/mesdonnees, purge 30 j) ✅ fait et testé
Pages légales en ligne ✅ (pull request #2 fusionnée)
Textes de justification des « intents » privilégiés ✅ rédigés en anglais, prêts à copier
Application transférée dans une équipe Discord ✅ (2FA obligatoire)
Double authentification sur le compte à faire par Enzo
Vérification d'identité (Stripe, 16 ans minimum) à faire par Enzo
Désactiver l'intent « Presence » s'il n'est pas utilisé à faire par Enzo
Atteindre 75 serveurs pour pouvoir demander en cours

Deux champs du portail ont été laissés volontairement vides après explication : l'URL de vérification des rôles liés (Linked Roles, inutile ici) et l'URL du point de terminaison des interactions (si on la remplit sans serveur prévu pour, toutes les commandes cessent de répondre, car Cyber utilise la Gateway).

↑ Haut de page

Chapitre 10

Identité visuelle et communauté

La direction artistique

Le logo de Cyber est un masque de démon cyberpunk rouge, avec un petit tracé de circuit imprimé sur le front. Toute l'identité découle de ce masque.

Logo horizontal
Logo horizontal
Élément Valeur
Fond #08090D (noir bleuté), surfaces #12131A
Rouge du bot #FF5A6E (clair #FF8A95, profond #FF3D5A)
Accents rares vert #3DDC84, bleu #6C8CFF, or #FFC457
Titres Orbitron
Texte Inter
Code JetBrains Mono
Ambiance « Console cyber » : grille fine de 32 px, halos rouges, circuits, léger glitch

Le pack de 57 prompts

Pour produire tous les visuels avec des IA d'images, un fichier de 57 prompts a été rédigé : un « prompt 0 » qui fixe la charte (à coller en premier), puis un prompt par visuel avec sa taille finale :

  • identité du bot : avatar, bannière de profil, logo horizontal ;
  • serveur Discord : icône, bannière, fond d'invitation ;
  • bandeaux d'embed par module (bienvenue, modération, niveaux, tickets, giveaways…) ;
  • site et panel : image de partage (og:image), favicon, écran de connexion, page 404 ;
  • pour plus tard : badges de niveau, icônes de rôles, bandeaux d'événements (maintenance, Noël, Halloween), widget de statut, réseaux sociaux, stickers.

Les générateurs gratuits sortent des images en 1024 ou 1536 px : chaque image est ensuite recadrée et redimensionnée aux tailles exactes demandées par Discord ou le site.

Bannière de profil
Bannière de profil

Quelques bandeaux d'embed déjà produits (1200 × 400) :

Bandeau Bienvenue
Bandeau Bienvenue
Bandeau Modération
Bandeau Modération
Bandeau Tickets
Bandeau Tickets
Bandeau Giveaway
Bandeau Giveaway

Le profil du bot sur Discord

  • Avatar et bannière chargés dans le portail développeur (la bannière a été refaite en version opaque, avec le texte centré, pour bien s'afficher en petite vue).
  • Statut permanent : « 🌐 cyberbot.fr · /aide ».
  • Bio automatique avec le nombre de serveurs, de membres et de commandes, mise à jour par le bot lui-même.
  • Liens vers les conditions d'utilisation et la politique de confidentialité.
  • Application transférée dans une équipe Discord.
Profil du bot (illustration)
Profil du bot (illustration)

Le serveur Discord de support

Un modèle complet a été conçu pour le serveur officiel, dans le style « emoji + ・ » :

  • 12 catégories, 35 salons, 15 rôles, avec pour chaque salon qui le voit, qui peut y écrire et quelle commande de Cyber le fait fonctionner (tickets, bienvenue, giveaways, suggestions, défi du jour, niveaux, vocaux temporaires, logs, sauvegardes privées) ;
  • @everyone ne voit que l'accueil tant qu'il n'a pas cliqué sur le bouton de /verification, qui donne le rôle Membre ;
  • catégories Académie, Staff et Bêta (pour tester les futurs modules sur mesure), forum pour les bugs ;
  • pas de catégorie « Sanction » : /mute utilise déjà le timeout natif de Discord.

Le 29 octobre, le serveur devient bilingue. Un nouveau venu arrive avec le rôle « Non vérifié » et ne voit qu'un salon langue-language. Il choisit 🇫🇷 ou 🇬🇧, lit le règlement de sa langue, l'accepte et reçoit « Membre » ou « Member ». Il voit alors les salons de sa langue et les salons communs. Le règlement anglais se publie avec un script dédié, comme le français.

↑ Haut de page

Chapitre 11

Problèmes rencontrés et leçons apprises

Le carnet de bord (chapitre 2) raconte les problèmes dans l'ordre où ils sont arrivés. Ce chapitre les regroupe par type pour en tirer des leçons.

Problèmes techniques

Problème Cause Solution Leçon
Commande /panelroles refusée par Discord Option obligatoire placée après une option facultative Ordre corrigé, règle vérifiée par check.js Automatiser les vérifications qu'on a déjà ratées une fois
Commandes visibles sur un seul serveur Enregistrement sur un identifiant de serveur fixe Enregistrement automatique sur tous les serveurs du bot Ce qui marche en test ne passe pas forcément à l'échelle
Images du site absentes en ligne Dossier assets jamais envoyé sur GitHub PUBLIER.bat publie tout le dossier avec Git Publier avec un outil, pas à la main
Nouveau HTML avec l'ancien CSS Cache du navigateur Versions « anti-cache » ajoutées automatiquement Penser au cache dès qu'une mise à jour « ne marche pas »
redirect_uri OAuth2 non valide index.html dans l'adresse et « Cyber » contre « cyber » Adresse normalisée Une URL de redirection doit correspondre au caractère près
Page anglaise sans tous les onglets Menu de la version anglaise écrit à part Menu aligné sur la version française Une traduction se vérifie page par page
Changements bloqués pendant des heures PC éteint ou en veille, donc rien à installer Paquets prêts et testés à l'avance, PR pour le site Préparer pendant l'absence, installer en une fois au retour
Dossier du site en retard sur GitHub Des PR fusionnées en ligne pendant que le PC était éteint SYNCHRONISER-SITE.bat (met de côté puis aligne sur GitHub) Deux façons de publier = penser à se resynchroniser
Chaque commande répondait deux fois Plusieurs copies du bot tournaient (PC + hébergeur, ou anciennes fenêtres) Instance unique par port local, fermeture des anciennes copies au démarrage Un service doit savoir qu'il est seul
Panel injoignable chez l'hébergeur Nom passant par Cloudflare, puis aucun port entrant sur la machine Tunnel Cloudflare sortant Une connexion sortante passe là où l'entrante est bloquée
Mélange HTTPS / HTTP Site en HTTPS, panel en HTTP Domaine + tunnel = panel en HTTPS Le navigateur bloque le « contenu mixte »
Erreur DNS sur le sous-domaine Route pas encore créée, domaine en attente, cache DNS de Windows Créer la route, attendre l'activation, ipconfig /flushdns La propagation DNS et les caches font perdre du temps : vérifier dans l'ordre
Erreur 1033 Aucun cloudflared connecté (serveur supprimé ou bot éteint) Relancer le tunnel depuis une machine allumée Lire le code d'erreur avant de paniquer
Tunnel bloqué au démarrage Empreinte SHA-256 de la version Linux utilisée sur Windows Empreinte de la bonne version La vérification d'intégrité fonctionne, et elle dépend de l'OS
« Bad gateway » Ancien port + localhost traduit en IPv6 ::1 http://127.0.0.1:3000 Toujours préciser IPv4 quand le service n'écoute qu'en IPv4
Données perdues Serveur supprimé, aucune sauvegarde Sauvegardes quotidiennes, copie dans un salon Discord privé, RESTAURER.bat Une donnée qui n'existe qu'à un endroit n'existe pas
Sauvegarde jamais envoyée Envoi seulement à la création, avant que le salon soit configuré Renvoi tant que la sauvegarde n'est pas arrivée Tester le cas « configuré après coup »
Bannière rose en petite vue Image générée semi-transparente Version opaque, texte dans la zone sûre Vérifier les images dans tous les affichages
Quotas des IA d'images Limites gratuites quotidiennes Production étalée dans le temps Planifier avec les contraintes de ses outils
Python absent du PC Script de build en Python Build reproduit à la main, puis installation conseillée Lister les prérequis d'un projet

Problèmes humains et d'organisation

Ce projet a aussi été une découverte : je ne code pas, et j'ai dû apprendre à piloter un projet technique, comprendre ce qu'on me proposait et faire moi-même toute la configuration (Discord, GitHub, OVH, Cloudflare, hébergeur).

Situation Ce qui s'est passé Ce que j'en retiens
Images et IA Je demandais un logo à une IA qui ne génère pas d'images Lui faire écrire un prompt pour une IA d'images : chaque outil a sa spécialité
Token collé dans la conversation « Personne n'aura la conversation », donc je ne l'ai pas changé Un secret qui a circulé est compromis : tout a été régénéré le 28 octobre
Idée reçue sur GitHub Je pensais héberger le bot sur GitHub comme mon portfolio GitHub Pages ne sert que des pages statiques : le bot a besoin d'une machine allumée
Conversation trop longue Je voulais l'exporter pour aller plus vite Un résumé à jour (CONTEXTE-CLAUDE.md) vaut mieux que tout l'historique
Plusieurs chantiers sur les mêmes fichiers Automod, version bilingue et audit prêts en même temps pour le même bot Un ordre d'installation clair, une sauvegarde et une comparaison à chaque étape
Un fil pour chaque chose La demande « bot bilingue » a hésité entre deux fils Une règle de routage écrite et appliquée sans exception
Peur de la facture « Je ne veux pas dépenser mes tokens » pour une IA dans l'automod Toujours demander le coût réel et commencer par la solution gratuite
Copier un jeu connu Je voulais le jeu du dino de Google aux couleurs de Cyber On ne copie pas une création protégée : un jeu original fait aussi bien l'affaire
Vocabulaire nouveau Token du bot ou jeton GitHub ? PR, merge, branche, ruleset, CNAME, TOTP… Demander sans gêne « c'est quoi ? » : chaque réponse m'a fait progresser
Où mettre les secrets J'ai demandé où mettre le token sur GitHub Un secret ne va jamais dans un dépôt, même privé
Trop de validations Me demander « ok » à chaque étape ralentissait tout Fixer une règle claire : réversible = on fait, irréversible = on me demande
Interfaces qui changent Menus Cloudflare réorganisés, onglets introuvables Une capture d'écran vaut mieux qu'une longue description
Outil de connexion au PC Je ne trouvais pas « Remote Control » Donner un accès simple et ciblé (un seul dossier, Cyber)
Malentendu « J'ai rien changé, tu racontes quoi ? » Vérifier l'état réel avant d'affirmer qu'une étape est faite, et le dire franchement en cas d'erreur
Informations à corriger Prix des mini PC d'abord sous-estimés, besoin réel (Pi pour mon père, 8 Go pour moi) précisé en cours de route Donner tout le contexte dès le début, et accepter qu'un conseil soit corrigé
Budget étudiant Le neuf est trop cher Le reconditionné et l'occasion offrent un excellent rapport qualité-prix, avec les bonnes questions à poser au vendeur
Hébergeur gratuit Serveur supprimé sans explication, attente d'une réponse du support Ne pas dépendre d'un service gratuit pour quelque chose d'important : prévoir un plan B
Garder le fil Beaucoup de sujets en parallèle (panel, site, audit, visuels, matériel) Un fil par sujet, un fil unique pour les audits, et un fichier de contexte toujours à jour
Journée très longue Plus de 15 heures de travail le 28 octobre Découper en lots et noter où on s'arrête (ex. « reprise au prompt 19 »)

Ce que je referais pareil

  • Tester chaque version sur mes propres serveurs avant d'aller plus loin.
  • Faire un audit de sécurité avant chaque étape importante (hébergement, mise en ligne, vérification).
  • Garder une sauvegarde de chaque fichier modifié.
  • Ne jamais montrer un secret, même dans une capture (je masquais les valeurs avant d'envoyer).

Ce que je ferais différemment

  • Mettre en place les sauvegardes dès le premier jour d'hébergement.
  • Choisir un hébergement dont je comprends les règles (ports, tunnels autorisés) avant d'y installer quoi que ce soit.
  • Installer les prérequis (Python, Git) au début du projet.
  • Prévoir dès le départ un document de suivi comme celui-ci, plutôt que de le reconstituer après.
↑ Haut de page

Chapitre 12

La suite du projet

Court terme

  • Terminer les visuels (reprise au prompt 19) et les installer dans le bot et sur le site.
  • Construire le serveur Discord de support à partir du modèle.
  • Faire la double authentification et la vérification d'identité pour préparer la vérification Discord.
  • Faire connaître Cyber pour atteindre les 75 serveurs nécessaires à la demande de vérification.
  • Traduire l'Académie (fiches, quiz, glossaire) en anglais.
  • Décider d'un hébergement en continu (Hetzner, environ 4 € par mois) en attendant le homelab.

Le homelab (achat le 31 octobre)

  • Achat d'un HP EliteDesk 800 G5 Mini d'occasion (i5-9500, 16 Go de RAM, SSD 500 Go) pour 220 €, plus tôt que prévu.
  • Installation de Proxmox ou Debian, puis Docker.
  • Bot dans un conteneur, sans aucun port exposé, avec le tunnel Cloudflare déjà prêt (route vers 127.0.0.1:<port>, empreinte cloudflared de la bonne architecture).
  • Rappels programmés du 26 décembre au 3 janvier pour ne rien oublier.
  • La même machine servira de laboratoire pour le BTS CIEL et le CCNA (VM pfSense, Windows Server, Linux).

Les modules sur mesure (« cassettes »)

Le grand projet : permettre à un serveur de recevoir un module développé pour lui.

  1. Le serveur demande un module.
  2. Enzo le développe.
  3. Il génère un identifiant secret lié à ce serveur (inutilisable ailleurs).
  4. L'administrateur le saisit dans l'onglet « Modules publics » du panel (« Ajouter un module »).
  5. Cyber reconnaît le module et l'installe.

Points de conception déjà identifiés : identifiants non devinables et liés à un seul serveur, modules isolés du reste du bot, données déclarées dans la politique de confidentialité.

Quand le bot grandira

  • Couche IA de l'automod (Claude Haiku), déjà écrite et mise de côté, si le besoin se confirme.
  • Option COMMANDES=global pour enregistrer les commandes une seule fois pour tous les serveurs.
  • Widget de statut sur le site.
  • Sharding obligatoire à partir de 2 500 serveurs.
  • Intents privilégiés justifiés auprès de Discord.
↑ Haut de page

Annexe

Glossaire

Terme Explication simple
API Porte d'entrée d'un service pour les programmes (ici, celle de Discord ou d'Anthropic)
Branche / Pull request / Merge Copie de travail d'un dépôt Git / proposition de modification / acceptation de cette proposition
CNAME Enregistrement DNS qui dit « ce nom est un alias de cet autre nom » ; aussi le fichier qui donne son domaine à GitHub Pages
Cloudflare Access Contrôle d'accès devant un site : il faut prouver son identité (code par mail, application 2FA) avant de voir la page
Components V2 Format de message récent de Discord, plus riche que les « embeds » classiques
CSP Politique de sécurité du contenu : le navigateur n'exécute que les scripts autorisés (contre le XSS)
CSRF Attaque qui fait exécuter une action à un utilisateur connecté sans qu'il le sache
DMARC / SPF Enregistrements DNS qui empêchent d'envoyer de faux mails au nom d'un domaine
DNS / enregistrement A Annuaire d'Internet / ligne qui associe un nom à une adresse IPv4
DNSSEC Signature des réponses DNS ; doit être désactivée avant de changer de fournisseur DNS
.env Fichier local qui contient les secrets (token, clés) ; jamais publié
Gateway Connexion permanente (WebSocket) entre le bot et Discord
HMAC Signature calculée avec une clé secrète : impossible de la fabriquer sans la clé (utilisée contre la triche au quiz)
HSTS En-tête qui oblige le navigateur à toujours utiliser HTTPS
Intent Type d'événements que le bot demande à recevoir de Discord (certains sont « privilégiés »)
Moindre privilège Ne donner que les droits strictement nécessaires
OAuth2 Connexion « avec Discord » sans donner son mot de passe au site
Proxmox Système installé sur une machine pour y faire tourner plusieurs machines virtuelles isolées
Pterodactyl Panneau d'hébergement qui fait tourner chaque serveur dans un conteneur Docker
RGPD Règlement européen sur la protection des données personnelles
SHA-256 (empreinte) « Empreinte digitale » d'un fichier : si un seul octet change, l'empreinte change
SQLite Base de données contenue dans un seul fichier, sans serveur à installer
SSRF Faire envoyer par un serveur des requêtes vers son propre réseau interne
TOTP Code à 6 chiffres qui change toutes les 30 secondes dans une application d'authentification
Tunnel Cloudflare Connexion sortante chiffrée qui permet d'exposer un service sans ouvrir de port
WebP Format d'image moderne, beaucoup plus léger que PNG ou JPEG à qualité égale
XSS Injection de code dans une page web affichée à d'autres utilisateurs
Zero Trust Approche où chaque accès est vérifié, même s'il vient d'un réseau « de confiance »
↑ Haut de page