142 lines
3.7 KiB
Markdown
142 lines
3.7 KiB
Markdown
# Enuxia Quiz
|
|
|
|
Application de quiz pédagogique **souveraine et auto-hébergée**, construite en Rust full-stack.
|
|
|
|
Conçue pour un usage en présentiel (cours, examens) — les étudiants passent le quiz depuis leur navigateur, le professeur consulte les résultats et les statistiques depuis une interface d'administration protégée.
|
|
|
|
## Stack technique
|
|
|
|
| Composant | Technologie |
|
|
|-----------|-------------|
|
|
| Frontend + Backend | Leptos 0.8 SSR + Axum |
|
|
| Base de données | SQLite via SQLx |
|
|
| CSS | Tailwind v4 |
|
|
| Compilation WASM | wasm-bindgen |
|
|
| Déploiement cible | Raspberry Pi 5 (ARM64) |
|
|
| Reverse proxy | Traefik |
|
|
|
|
## Fonctionnalités
|
|
|
|
### Côté étudiant
|
|
- Accès protégé par un code de session distribué le jour J
|
|
- Sélection du quiz, saisie du prénom et nom
|
|
- Navigation avant/arrière entre les questions
|
|
- Minuteur optionnel avec soumission automatique
|
|
- Correction détaillée avec les bonnes réponses après soumission
|
|
|
|
### Côté administration
|
|
- Création et édition de quiz (questions, réponses, options)
|
|
- Ordre aléatoire des questions et/ou des réponses par quiz
|
|
- Blocage anti-doublon — un étudiant ne peut pas repasser sans autorisation
|
|
- Reset individuel — le professeur autorise une nouvelle tentative
|
|
- Statistiques — moyenne, distribution des scores, taux de réussite par question
|
|
- Export CSV des résultats
|
|
- Configuration des codes d'accès en live sans recompilation
|
|
|
|
### Sécurité
|
|
- Interface admin accessible uniquement via VPN (conseillé)
|
|
- Cookies de session httponly
|
|
- Normalisation des noms (lowercase + trim) pour l'anti-doublon
|
|
|
|
## Architecture de déploiement
|
|
|
|
```
|
|
Internet
|
|
│
|
|
▼
|
|
Traefik Gateway (VM OVH)
|
|
├── quiz.enuxia.fr → étudiants (public)
|
|
└── admin-quiz.enuxia.fr → professeur (VPN uniquement)
|
|
│
|
|
▼
|
|
Raspberry Pi 5
|
|
└── enuxia-quiz (binaire Rust, systemd)
|
|
└── quiz.db (SQLite local)
|
|
```
|
|
|
|
## Installation
|
|
|
|
### Prérequis
|
|
|
|
```bash
|
|
rustup target add wasm32-unknown-unknown
|
|
cargo install cargo-leptos
|
|
# node et npm installés
|
|
```
|
|
|
|
### Développement
|
|
|
|
```bash
|
|
git clone https://git.enuxia.fr/Enuxia-Public/enuxia-quiz
|
|
cd enuxia-quiz
|
|
cp .env.example .env
|
|
# Éditez .env avec vos valeurs
|
|
touch quiz.db
|
|
cargo leptos serve
|
|
```
|
|
|
|
### Production (binaire)
|
|
|
|
```bash
|
|
cargo leptos build --release
|
|
# Le binaire est dans target/release/enuxia-quiz
|
|
# Les assets sont dans target/site/
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Créez un fichier `.env` :
|
|
|
|
```env
|
|
DATABASE_URL=sqlite:///chemin/absolu/vers/quiz.db
|
|
SESSION_PASSWORD=code_distribué_aux_étudiants
|
|
ADMIN_PASSWORD=mot_de_passe_admin
|
|
LEPTOS_SITE_ROOT=/opt/enuxia-quiz/site
|
|
LEPTOS_SITE_ADDR=0.0.0.0:3010
|
|
LEPTOS_TAILWIND_VERSION=v4.1.13
|
|
```
|
|
|
|
Les mots de passe sont également modifiables en live depuis `/admin/config` sans redémarrer l'application.
|
|
|
|
## Gestion du service (systemd)
|
|
|
|
```bash
|
|
# Démarrer
|
|
systemctl start enuxia-quiz
|
|
|
|
# Arrêter
|
|
systemctl stop enuxia-quiz
|
|
|
|
# Redémarrer
|
|
systemctl restart enuxia-quiz
|
|
|
|
# Voir l'état
|
|
systemctl status enuxia-quiz
|
|
|
|
# Logs en temps réel
|
|
journalctl -u enuxia-quiz -f
|
|
|
|
# Activer/désactiver le démarrage automatique
|
|
systemctl enable enuxia-quiz
|
|
systemctl disable enuxia-quiz
|
|
```
|
|
|
|
## CI/CD
|
|
|
|
Pipeline Gitea Actions (`.gitea/workflows/build-deploy.yml`) :
|
|
|
|
- **Runner ARM64 natif sur le Pi** — build natif, tous les cores utilisés
|
|
- **Cache Cargo** — premier build ~15min, suivants ~3min
|
|
- **Deploy automatique** — `cargo leptos build --release` + `systemctl restart`
|
|
|
|
```
|
|
push main → runner Pi → cargo leptos build → cp binaire → systemctl restart
|
|
```
|
|
|
|
## Licence
|
|
|
|
MIT — libre d'utilisation, de modification et de déploiement.
|
|
|
|
---
|
|
|
|
Construit par [Enuxia](https://enuxia.com) — systèmes intelligents souverains sur mesure. |