Dossier personnel de l'élève monté comme lecteur réseau : rclone sert le dossier local, l'authentification est déléguée au portail via auth_request Nginx (mêmes identifiants que la connexion), sans nouveau système de comptes. Nettoyé par la purge RGPD comme les autres données d'élève. Corrige au passage un vrai bug d'isolation trouvé en testant avec deux comptes jetables : rewrite injectait la variable posée par auth_request_set, mais rewrite s'exécute dans une phase Nginx antérieure à cette variable, donc toujours vide - un élève pouvait lire le fichier d'un autre en devinant son nom. Corrigé par une location à regex nommée + proxy_pass. Détails : ADR 0008. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.9 KiB
Runbook — WebDAV de l'élève
Dossier personnel de l'élève, monté comme lecteur réseau (bloc C du CLAUDE.md). Détail des choix et des bugs trouvés en vérifiant en réel : ADR 0008.
Où sont les choses
| Élément | Emplacement |
|---|---|
| Fichiers des élèves | /var/www/portail/storage/app/webdav/<id élève>/ (jamais versionné, jamais synchronisé par un déploiement) |
| Service WebDAV | rclone-webdav.service (systemd), écoute en local seulement sur 127.0.0.1:8765 |
| Authentification | App\Http\Controllers\WebdavAuthController, sous-requête Nginx /interne/webdav-auth (jamais appelable de l'extérieur) |
| Config Nginx | bloc /webdav/ dans ansible/roles/portail/templates/nginx-portail.conf.j2 |
Adresse pour l'élève : https://syllabuslab.fr/webdav/ (voir « Mes fichiers »
dans le menu du compte). Identifiants : les mêmes que la connexion.
Vérifier que ça fonctionne
systemctl is-active rclone-webdav
curl -s -o /dev/null -w "%{http_code}\n" https://syllabuslab.fr/webdav/ # 401 attendu sans identifiants
Avec un compte élève jetable (créé et supprimé ensuite via tinker, jamais un compte réel) :
curl -u IDENTIFIANT:CODE -X PROPFIND -H "Depth: 1" https://syllabuslab.fr/webdav/
curl -u IDENTIFIANT:CODE -T fichier.txt https://syllabuslab.fr/webdav/fichier.txt
Pourquoi RAM et disque sont serrés
Comme pour Ceph (voir docs/runbooks/ceph.md) : ce serveur a réellement
31 Go de RAM et 230 Go en RAID 1, pas 64 Go / 2×500 Go comme écrit dans le
CLAUDE.md. rclone utilise ~20 Mo, négligeable — mais chaque fichier déposé
par un élève prend de l'espace disque réel, partagé avec OpenStack et le
portail. Pas de quota par élève pour l'instant (voir docs/dette.md).
Nettoyer entièrement (si besoin)
ssh paillasse
sudo systemctl disable --now rclone-webdav.service
sudo rm /etc/systemd/system/rclone-webdav.service
sudo rm -rf /var/www/portail/storage/app/webdav
sudo systemctl daemon-reload
Puis retirer le bloc /webdav/ et /interne/webdav-auth du vhost (relancer
ansible-playbook portail.yml après avoir enlevé 09-webdav.yml du
main.yml du rôle).
Écueils rencontrés (pour ne pas les redécouvrir)
- Jamais
rewritepour injecter une variable posée parauth_request_setdans le chemin proxié —rewrites'exécute avant que la variable existe. Utiliser unelocationà regex nommée +proxy_passavec la variable dans l'URL. --vfs-cache-mode offne désactive pas le cache de répertoires de rclone (--dir-cache-time, 5 min par défaut) : un dossier créé par Laravel reste invisible de rclone jusqu'à l'expiration du cache, sauf à mettre--dir-cache-timetrès bas (1 s ici, le volume est faible).SCRIPT_NAME/REQUEST_URIne sont pas fiables dans une sous-requêteauth_requestqui fait son propre appel FastCGI : les écrire en dur quand l'URI de la location est fixe.