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>
This commit is contained in:
parent
cdf79d2823
commit
e549f03e1b
19 changed files with 553 additions and 8 deletions
67
docs/runbooks/webdav.md
Normal file
67
docs/runbooks/webdav.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue