passe le portail en HTTPS sur syllabuslab.fr, avec en-têtes de sécurité et CSP
Certificat Let's Encrypt obtenu et renouvelé par certbot (authentificateur nginx), expiration surveillée par Prometheus. TLS selon Mozilla v6.0 intermediate, HSTS, CSP stricte avec nonce sur l'application et adaptée sur la vitrine, xterm.js servi par le portail. Page de statut prévue sur status.syllabuslab.fr, administration de Grafana et Kuma par tunnel seul. Corrige aussi une faille XSS dans la page de classe, la page /cours en erreur depuis l'étape 8, et NodeSource relancé à chaque déploiement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
aa004c0736
commit
618cd7efbe
30 changed files with 987 additions and 24 deletions
264
portail/config/cours.php
Normal file
264
portail/config/cours.php
Normal file
|
|
@ -0,0 +1,264 @@
|
|||
<?php
|
||||
|
||||
// Catalogue des cours gratuits, inspiré des référentiels de l'Éducation nationale.
|
||||
// types : CM (cours magistral), TD (travaux dirigés), TP (travaux pratiques sur VM), QCM.
|
||||
|
||||
return [
|
||||
[
|
||||
'id' => 'nsi',
|
||||
'nom' => 'Lycée NSI',
|
||||
'sous_titre' => 'Première et Terminale · spécialité NSI',
|
||||
'couleur' => 'bg-[#FFD23F]',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'Première · Représentation des données',
|
||||
'cours' => [
|
||||
['titre' => 'Entiers naturels : binaire et hexadécimal', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Entiers relatifs et complément à deux', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Nombres flottants et leurs pièges', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Codage des caractères : ASCII, Unicode, UTF-8', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 2],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Première · Architectures et systèmes',
|
||||
'cours' => [
|
||||
['titre' => 'Modèle de von Neumann', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Système d’exploitation et commandes Linux', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Droits et permissions des fichiers', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Réseau : TCP/IP et protocole du bit alterné', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Première · Web et données',
|
||||
'cours' => [
|
||||
['titre' => 'HTTP, formulaires GET et POST', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Traitement de données en tables CSV', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Terminale · Architectures, réseaux, sécurité',
|
||||
'cours' => [
|
||||
['titre' => 'Processus et ordonnancement', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Routage : protocoles RIP et OSPF', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Chiffrement symétrique, asymétrique et HTTPS', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Terminale · Données et structures',
|
||||
'cours' => [
|
||||
['titre' => 'Bases de données relationnelles et SQL', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Piles, files et listes chaînées', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Arbres binaires et graphes', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => 'sio',
|
||||
'nom' => 'BTS SIO SISR',
|
||||
'sous_titre' => 'Services informatiques aux organisations · option SISR',
|
||||
'couleur' => 'bg-[#7CF2C0]',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'Bloc 1 · Support et mise à disposition de services',
|
||||
'cours' => [
|
||||
['titre' => 'Gérer le parc avec GLPI', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Traiter un incident : ticket, diagnostic, résolution', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Installer et configurer un poste Debian', 'types' => ['TP', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Présence en ligne : nom de domaine et DNS public', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Bloc 2 · Administration des systèmes et des réseaux',
|
||||
'cours' => [
|
||||
['titre' => 'Adressage IPv4 et sous-réseaux', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'VLAN et commutation', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Routage inter-VLAN', 'types' => ['TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Serveur DHCP sous Debian', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Serveur DNS avec BIND 9', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Annuaire Samba AD et stratégies de groupe', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Supervision avec Zabbix', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Sauvegarde et restauration', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Virtualisation et conteneurs', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Bloc 3 · Cybersécurité des services',
|
||||
'cours' => [
|
||||
['titre' => 'RGPD et protection des données', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Authentification et mots de passe', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Pare-feu avec nftables', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'VPN avec WireGuard', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Journalisation et détection d’intrusion', 'types' => ['TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => 'ciel',
|
||||
'nom' => 'BTS CIEL',
|
||||
'sous_titre' => 'Cybersécurité, informatique et réseaux, électronique · option IR',
|
||||
'couleur' => 'bg-[#C4B5FD]',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'Réseaux',
|
||||
'cours' => [
|
||||
['titre' => 'Numération et codage de l’information', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Modèle OSI et encapsulation', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Ethernet, câblage et commutation', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Adressage IPv4 et IPv6', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Services réseau : SSH, HTTP, FTP', 'types' => ['TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Capturer et analyser des trames avec tcpdump', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Informatique',
|
||||
'cours' => [
|
||||
['titre' => 'Scripts Bash', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Python pour l’administration système', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Objets connectés et protocole MQTT', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Cybersécurité',
|
||||
'cours' => [
|
||||
['titre' => 'Analyse de risques', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Durcir un serveur Linux', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Détecter une attaque dans les journaux', 'types' => ['TP', 'QCM'], 'heures' => 2],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => 'but',
|
||||
'nom' => 'BUT R&T',
|
||||
'sous_titre' => 'Réseaux et télécommunications · parcours Cybersécurité et DevCloud',
|
||||
'couleur' => 'bg-[#FF6FB5]',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'Semestres 1 et 2',
|
||||
'cours' => [
|
||||
['titre' => 'Initiation aux réseaux informatiques', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Fondamentaux des systèmes Linux', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Architecture des systèmes numériques', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Transmission et supports physiques', 'types' => ['CM', 'TD', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Bases de la programmation', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Semestres 3 et 4',
|
||||
'cours' => [
|
||||
['titre' => 'Routage dynamique OSPF', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Services réseaux : DNS, mail, web', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Réseaux d’opérateurs : BGP et MPLS', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Supervision et métrologie', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Automatiser avec Ansible', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Parcours Cybersécurité et DevCloud',
|
||||
'cours' => [
|
||||
['titre' => 'Cryptographie appliquée : PKI et certificats', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Conteneurs Docker et orchestration', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Auditer la sécurité d’un réseau', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => 'tssr',
|
||||
'nom' => 'Titre pro TSSR',
|
||||
'sous_titre' => 'Technicien supérieur systèmes et réseaux · niveau 5',
|
||||
'couleur' => 'bg-white',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'CCP 1 · Assister les utilisateurs',
|
||||
'cours' => [
|
||||
['titre' => 'Mettre en service un poste client', 'types' => ['TP', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Diagnostiquer une panne réseau', 'types' => ['TD', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Rédiger une procédure utilisateur', 'types' => ['CM', 'TD'], 'heures' => 2],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'CCP 2 · Infrastructure centralisée',
|
||||
'cours' => [
|
||||
['titre' => 'Déployer un domaine Samba AD', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
['titre' => 'Partages de fichiers et ACL', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Sauvegardes avec restic', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 2],
|
||||
['titre' => 'Superviser une infrastructure', 'types' => ['TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'CCP 3 · Infrastructure distribuée',
|
||||
'cours' => [
|
||||
['titre' => 'Déployer des services dans le cloud', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Docker Compose en production', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Automatiser l’administration en Bash', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'VPN site à site', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
'id' => 'prog',
|
||||
'nom' => 'Programmation',
|
||||
'sous_titre' => 'Python, web, SQL, Bash, C · exercices dans l’IDE en ligne',
|
||||
'couleur' => 'bg-[#FF6FB5]',
|
||||
'blocs' => [
|
||||
[
|
||||
'titre' => 'Python · les bases',
|
||||
'cours' => [
|
||||
['titre' => 'Variables et types', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-pair'],
|
||||
['titre' => 'Conditions : if, elif, else', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-pair'],
|
||||
['titre' => 'Boucles for et while', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'py-somme'],
|
||||
['titre' => 'Fonctions et paramètres', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'py-pair'],
|
||||
['titre' => 'Listes et tuples', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'py-somme'],
|
||||
['titre' => 'Chaînes de caractères', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-voyelles'],
|
||||
['titre' => 'Dictionnaires', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-voyelles'],
|
||||
['titre' => 'Lire et écrire des fichiers CSV', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-somme'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Python · aller plus loin',
|
||||
'cours' => [
|
||||
['titre' => 'Récursivité', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'py-somme'],
|
||||
['titre' => 'Programmation orientée objet', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 4, 'exercice' => 'py-pair'],
|
||||
['titre' => 'Algorithmes de tri', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'py-somme'],
|
||||
['titre' => 'Recherche dichotomique', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-somme'],
|
||||
['titre' => 'Tester son code avec assert', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'py-pair'],
|
||||
['titre' => 'Sockets : un client réseau en Python', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Web',
|
||||
'cours' => [
|
||||
['titre' => 'HTML : structurer une page', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'web-bouton'],
|
||||
['titre' => 'CSS : flexbox et grid', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'web-bouton'],
|
||||
['titre' => 'JavaScript et le DOM', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'web-bouton'],
|
||||
['titre' => 'Formulaires et validation', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'web-bouton'],
|
||||
['titre' => 'API REST et JSON avec fetch', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'web-bouton'],
|
||||
['titre' => 'PHP côté serveur', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Bases de données',
|
||||
'cours' => [
|
||||
['titre' => 'SELECT, WHERE, ORDER BY', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'sql-select'],
|
||||
['titre' => 'Agrégats et GROUP BY', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'sql-group'],
|
||||
['titre' => 'Jointures', 'types' => ['CM', 'TD', 'IDE', 'QCM'], 'heures' => 3, 'exercice' => 'sql-select'],
|
||||
['titre' => 'Créer des tables et des contraintes', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'sql-select'],
|
||||
['titre' => 'Injection SQL : comprendre et s’en protéger', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'sql-select'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'titre' => 'Système et outils',
|
||||
'cours' => [
|
||||
['titre' => 'Scripts Bash avancés', 'types' => ['CM', 'IDE', 'TP', 'QCM'], 'heures' => 3, 'exercice' => 'bash-tp'],
|
||||
['titre' => 'Expressions régulières', 'types' => ['CM', 'IDE', 'QCM'], 'heures' => 2, 'exercice' => 'bash-tp'],
|
||||
['titre' => 'Git : versionner son code', 'types' => ['CM', 'TP', 'QCM'], 'heures' => 3],
|
||||
['titre' => 'Langage C : pointeurs et mémoire', 'types' => ['CM', 'TD', 'TP', 'QCM'], 'heures' => 4],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
Loading…
Add table
Add a link
Reference in a new issue