Paillasse/docs/runbooks/stockage-s3.md

84 lines
3 KiB
Markdown
Raw Normal View History

# Runbook — Stockage S3 des devoirs maison
Les fichiers que les élèves joignent à leurs devoirs maison sont stockés sur
Hetzner Object Storage (S3-compatible), jamais sur le disque du serveur
(`app/Services/Stockage/StockageTravauxEleves.php`). Tant que le bucket n'est
pas configuré, le bouton de dépôt de fichier reste simplement masqué côté
élève (texte libre toujours disponible) — rien ne casse.
Claude ne peut ni créer le bucket ni générer les clés (CLAUDE.md : commandes
et dépenses jamais par Claude). Cette étape est entièrement à faire par Adam.
## 1. Créer le bucket (console Hetzner)
Dans le **projet Hetzner dédié à Paillasse** (jamais `tripoli-cloud`) :
1. Object Storage → créer un bucket, région au choix (ex. `fsn1`).
2. Activer le versioning sur le bucket (un fichier écrasé reste récupérable
quelques temps).
3. Générer une paire de clés d'accès **scopée à ce bucket seulement** (pas
une clé avec accès à tout le compte).
Vérifier les noms exacts des options dans la console/doc Hetzner au moment de
le faire : l'interface peut avoir changé depuis l'écriture de ce runbook.
## 2. Créer le fichier de secrets sur le serveur
Sur `163.172.4.195`, jamais dans Git, jamais collé dans une conversation avec
Claude :
```
ssh paillasse
sudo mkdir -p /etc/syllabus
sudo tee /etc/syllabus/s3-paillasse.yaml > /dev/null <<'EOF'
access_key: "COLLER_LA_CLE_ICI"
secret_key: "COLLER_LE_SECRET_ICI"
bucket: "nom-du-bucket"
region: "fsn1"
endpoint: "https://fsn1.your-objectstorage.com"
EOF
sudo chmod 600 /etc/syllabus/s3-paillasse.yaml
sudo chown root:root /etc/syllabus/s3-paillasse.yaml
```
Adapter `region`/`endpoint` à ce que la console Hetzner affiche pour le
bucket créé.
## 3. Déployer
Depuis le Mac :
```
cd ansible && script -q /dev/null ansible-playbook portail.yml -i inventory.ini
```
Le rôle `portail` (`roles/portail/tasks/03-code.yml`) lit ce fichier s'il
existe, écrit `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`/`AWS_BUCKET`/
`AWS_DEFAULT_REGION`/`AWS_ENDPOINT` dans `.env` et redémarre Horizon. S'il
n'existe pas encore, ce bloc ne fait rien.
## 4. Vérifier
```
cd /var/www/portail
sudo -u www-data HOME=/tmp php8.3 artisan tinker \
--execute="echo App\Services\Stockage\StockageTravauxEleves::disponible() ? 'ok' : 'non configure';"
```
Puis, en élève de test, ouvrir un devoir : le champ « Joindre un fichier »
doit apparaître. Déposer un petit fichier, vérifier côté prof qu'il apparaît
et se télécharge. Supprimer le compte de test ensuite.
## RGPD
Un fichier déposé est supprimé d'Object Storage dès que la classe qui le
contient est purgée (`classes:purger-archivees`, 90 jours après archivage) —
voir `app/Console/Commands/PurgerClassesArchivees.php`.
## Rotation des clés
Même logique que pour le compte de service OpenStack
([runbook dédié](compte-service-openstack.md)) : régénérer les clés dans la
console Hetzner, remplacer `access_key`/`secret_key` dans
`/etc/syllabus/s3-paillasse.yaml`, redéployer (étape 3).