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