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

67 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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](../adr/0008-webdav-eleve-auth-request.md).
## 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.