Paillasse/docs/runbooks/rgpd.md
Adam Belkacemi e4a6aaebb1 ajoute les pages légales, la purge RGPD et sert polices et scripts depuis le portail
Pages /legal et /confidentialite réécrites d'après le système réel, purge
des classes archivées depuis 90 jours (prouvée par Pest), archivage côté
prof. Polices, xterm.js et CodeMirror ne sont plus chargés depuis Google
ni jsDelivr. Pages d'aperçu signalées, sans vrais établissements ni faux
chiffres. Journaux Laravel gardés 14 jours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:07:25 +02:00

3.1 KiB

Runbook — Données personnelles (RGPD)

Politique publique : https://syllabuslab.fr/confidentialite (portail/resources/views/confidentialite.blade.php). Toute nouvelle donnée collectée, tout nouveau service tiers ou toute nouvelle durée de conservation doit d'abord y être décrit. La page affirme seulement ce qui a été vérifié.

Où sont les données

Donnée Où Durée
Comptes profs, classes, élèves, séances, sessions, corrections MariaDB du portail (portail_mariadb) jusqu'à 90 jours après l'archivage de la classe
VM des élèves (disques) OpenStack, une stack par session fin de session (45 min par défaut)
Journaux Nginx (IP, pages) /var/log/nginx/ 14 jours (logrotate)
Journaux Laravel storage/logs/laravel-AAAA-MM-JJ.log 14 jours (LOG_STACK=daily, LOG_DAILY_DAYS=14)
Sauvegardes chiffrées Dedibackup (Scaleway, France) 7 quotidiennes + 4 hebdomadaires (≤ 5 semaines)

Purge automatique

  • Le prof archive sa classe (page de la classe, « Archiver la classe ») : plus de séance possible ; la date de suppression est affichée.
  • classes:purger-archivees (chaque nuit à 02:30 UTC) supprime les classes archivées depuis 90 jours, et en cascade leurs élèves, séances, sessions, machines et corrections. Le compte du prof reste. Le journal ne garde que l'identifiant de la classe et le nombre d'élèves.
  • Une classe avec un lab encore en cours est reportée (anomalie : un lab expire en 45 min) et signalée dans le journal.
  • Preuve : portail/tests/Feature/PurgeRgpdTest.php.
ssh paillasse "cd /var/www/portail && sudo -u www-data HOME=/tmp php8.3 artisan classes:purger-archivees"

Répondre à une demande d'exercice des droits

Contact public : adam@belkacemi.me. Pour un élève, la demande passe normalement par son établissement (responsable du traitement).

  • Accès / portabilité (élève) : prénom, nom, identifiant, classe, sessions et corrections ; extraire avec artisan tinker (App\Models\Eleve::with('labSessions.corrections')->where('identifiant', '…')->first()->toArray()), sans le code secret (haché, inutile).
  • Effacement d'un élève : App\Models\Eleve::where('identifiant', '…')->first()->delete() — cascade sur ses sessions et corrections.
  • Effacement d'un compte prof : supprimer d'abord ses classes (ou les archiver), puis App\Models\User::where('email', '…')->first()->delete().
  • Noter la demande et sa date de traitement (hors du dépôt : le registre contient des données personnelles).
  • Rappeler que les sauvegardes chiffrées contenant la donnée expirent d'elles-mêmes sous 5 semaines.

Interdits sur le site (prompt de déploiement, étape 14)

Pas de logo Marianne ou ministère, de drapeau de l'UE, de faux « logo RGPD », de chiffres inventés ni de faux clients. Formulations autorisées : « Hébergé en France », « Conforme au RGPD » avec un lien vers /confidentialite. Les pages d'aperçu (fonctions pas encore construites) portent le bandeau partials/apercu et n'affichent que des noms fictifs (PagesLegalesTest).