Paillasse/docs/runbooks/webdav.md
Adam Belkacemi e549f03e1b ajoute le dossier WebDAV de l'élève (bloc C)
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>
2026-10-14 13:04:40 +02:00

2.9 KiB
Raw Blame History

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 rewrite pour injecter une variable posée par auth_request_set dans le chemin proxié — rewrite s'exécute avant que la variable existe. Utiliser une location à regex nommée + proxy_pass avec la variable dans l'URL.
  • --vfs-cache-mode off ne 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-time très bas (1 s ici, le volume est faible).
  • SCRIPT_NAME/REQUEST_URI ne sont pas fiables dans une sous-requête auth_request qui fait son propre appel FastCGI : les écrire en dur quand l'URI de la location est fixe.