transfer from private server/git server

This commit is contained in:
M1n-0
2026-08-21 09:12:02 +02:00
parent 45c8982178
commit 6ecb014238
75 changed files with 4344 additions and 274 deletions

View File

@@ -0,0 +1,185 @@
# Sections 1 à 20 — Cahier des charges GestHub
## Section 1 — Présentation du projet
GestHub est une application web intranet/extranet multi-services destinée à
centraliser les outils utilisés au quotidien pendant la formation à Ynov
Bordeaux Campus (spécialité Robotique & Systèmes Embarqués) : annonces,
partage de fichiers, planning, chat et Kanban, le tout derrière une
authentification unique (SSO). Projet personnel auto-initié, démarré pendant
les ydays de B2 (avril 2025) et poursuivi jusqu'à ce jour.
## Section 2 — Contexte et origine
Avant GestHub, la coordination reposait sur des outils disparates :
WhatsApp pour les annonces (aucune permanence de l'information), clés USB
ou liens temporaires pour les fichiers (aucun contrôle d'accès), agendas
séparés pour le planning (aucune vision collective). Ce constat personnel a
motivé la création d'un outil unique et centralisé.
## Section 3 — Objectifs du projet
- Centraliser les annonces, fichiers, planning et communication dans un seul
point d'entrée authentifié.
- Garantir la persistance et la traçabilité de l'information (contrairement
aux outils volatils utilisés auparavant).
- Construire une infrastructure reproductible (Infrastructure as Code) et
déployable en moins de 5 minutes sur une machine Linux vierge.
- Servir de support d'apprentissage et de preuve de compétence pour le titre
RNCP 36463 (CDAN).
## Section 4 — Analyse de l'existant
| Besoin | Outil utilisé avant GestHub | Limite constatée |
|---|---|---|
| Annonces | WhatsApp | Pas d'historique structuré, pas de droits |
| Fichiers | Clés USB / liens temporaires | Aucun contrôle d'accès, pas de traçabilité |
| Planning | Agendas personnels | Pas de vision collective |
| Chat | Discord / groupes épars | Fragmentation, pas de SSO |
| Authentification | Comptes séparés par outil | Pas d'identité unique |
## Section 5 — Parties prenantes et public visé
- **Utilisateur standard** : consulte les annonces, le planning, télécharge
ses fichiers, participe au chat.
- **Administrateur** (groupe Keycloak `/admin`) : publie/modifie/supprime
les annonces et événements, gère la disposition du tableau de bord,
supprime tout fichier.
- **Public secondaire** : intervenants et évaluateurs des revues de projet
ydays, jury de certification RNCP.
## Section 6 — Besoins par profil utilisateur
| Profil | Besoin principal |
|---|---|
| Standard | Voir les annonces et le planning, gérer ses propres fichiers, accéder au chat |
| Admin | Tout ce que fait un standard, + publier/gérer les annonces, événements et widgets |
| (Super-admin envisagé) | Administration Keycloak elle-même (hors périmètre applicatif GestHub) |
## Section 7 — Acteurs et rôles
Les rôles sont portés par les **groupes Keycloak**, propagés dans le token
OIDC (claim `groups`) et vérifiés à chaque requête sensible côté Flask
(`services/auth_service.py`) — aucune notion de rôle n'est stockée
localement en dehors de la session applicative.
## Section 8 — Périmètre fonctionnel (10 modules)
| # | Module | Statut | Technologies |
|---|---|---|---|
| 1 | Authentification SSO | Terminé | Keycloak, OIDC, Authlib |
| 2 | Tableau de bord / widgets | Terminé | Flask, PyMySQL, SortableJS |
| 3 | Annonces | Terminé | Flask, PyMySQL, MariaDB |
| 4 | Partage de fichiers | Terminé | Flask, python-magic, PyMySQL |
| 5 | Planning / événements | Terminé | Flask, PyMySQL |
| 6 | Chat | Terminé (réutilisation) | Mattermost (iframe, SSO partagé) |
| 7 | Kanban | Terminé (réutilisation) | Mattermost Boards (iframe) |
| 8 | Gestion des droits | Terminé | Groupes Keycloak, décorateurs Flask |
| 9 | Journalisation / audit | Terminé | Table `audit_log`, MariaDB |
| 10 | Infrastructure | Terminé | Docker Compose, Caddy, TLS auto |
## Section 9 — Exigences fonctionnelles (EXF)
| ID | Exigence | Priorité | Critère d'acceptation |
|---|---|---|---|
| EXF-01 | Authentification SSO Keycloak | HAUTE | Connexion redirige vers Keycloak et revient avec une session valide |
| EXF-02 | Rôles admin/standard | HAUTE | Une route admin renvoie 403 pour un utilisateur sans groupe `/admin` |
| EXF-03 | CRUD Annonces | HAUTE | Un admin peut créer/modifier/supprimer une annonce, visible par tous |
| EXF-04 | Épinglage des annonces | MOYENNE | Une annonce épinglée apparaît en tête de liste |
| EXF-05 | Upload de fichier validé | HAUTE | Un fichier hors liste blanche (type/extension/taille) est rejeté (400) |
| EXF-06 | Téléchargement sécurisé | HAUTE | Le téléchargement d'un fichier d'autrui par un non-admin renvoie 403 |
| EXF-07 | Suppression de fichier | MOYENNE | Le propriétaire ou un admin peut supprimer, les autres sont refusés |
| EXF-08 | Listing des fichiers | MOYENNE | La liste renvoie les métadonnées (nom, taille, date) sans exposer le chemin disque |
| EXF-09 | Création d'événements | MOYENNE | Un admin peut créer un événement avec dates de début/fin cohérentes |
| EXF-10 | Suppression d'événements | BASSE | Un admin peut supprimer un événement existant |
| EXF-11 | Tableau de bord personnalisable | MOYENNE | Un admin peut ajouter/déplacer/supprimer un widget, persisté en base |
| EXF-12 | Intégration Chat/Kanban | HAUTE | Les widgets iframe Mattermost s'affichent avec authentification partagée |
## Section 10 — Architecture générale (1/2 — logique)
Voir Bloc 1 — C3 (« Concevoir une architecture fiable ») pour le détail :
architecture en 5 couches (présentation, contrôleur, service, accès
données, infrastructure), séparation stricte des responsabilités.
## Section 11 — Contraintes de sécurité
Voir tableau OWASP Top 10 détaillé (Partie 4 — Grille de recette et
risques). Contraintes principales : secrets hors code source (.env),
requêtes paramétrées systématiques, réseau Docker interne, vérification de
rôle à chaque route sensible, aucune fuite d'information dans les réponses
d'erreur.
## Section 12 — Architecture générale (2/2 — infrastructure)
Architecture 3 tiers : **Caddy** (présentation/proxy, seul point
d'exposition publique), **Flask** (métier/applicatif), **MariaDB +
Keycloak** (données/identité). Chaque service est isolé dans un conteneur
Docker sur le réseau interne `gesthub-net`.
## Section 13 — Modèle de données
5 tables en 3ème forme normale (voir `web/init.sql`) : `annonces`,
`fichiers`, `evenements`, `blocks`, `audit_log`. Aucune duplication des
données d'identité — la référence utilisateur se fait uniquement via le
`sub` OIDC (chaîne opaque fournie par Keycloak).
## Section 14 — Exigences non fonctionnelles (EXNF)
| ID | Exigence | Vérification |
|---|---|---|
| EXNF-01 | Aucune injection SQL possible | Test TS-01 (requêtes paramétrées) |
| EXNF-02 | Secrets hors code source | `.env` + `.gitignore`, `config.py` lit `os.environ` |
| EXNF-03 | Disponibilité du service | `restart: unless-stopped`, healthcheck MariaDB |
| EXNF-04 | Tenue en charge | Gunicorn 4 workers (formule 2×CPU+1) |
| EXNF-05 | Accessibilité de base (RGAA) | Attributs alt/aria-label, HTML sémantique |
| EXNF-06 | Traçabilité des actions sensibles | Table `audit_log`, alimentée par tous les services |
| EXNF-07 | Portabilité | 100 % conteneurisé, `docker compose up -d` |
| EXNF-08 | Maintenabilité | Architecture en couches, Repository Pattern |
| EXNF-09 | Qualité du code | flake8 : 0 violation (preuve réelle, Annexe A1) |
| EXNF-10 | Testabilité | 34 tests automatisés exécutés avec succès (Annexe A1 / Partie 4) |
## Section 15 — Contraintes techniques et choix technologiques
Python/Flask (maîtrisé depuis B1/B2 Ynov), MariaDB (SGBDR open source,
compatible InnoDB/ACID), Keycloak (SSO open source, supporte OIDC standard),
Docker (portabilité), Caddy (TLS automatique sans configuration manuelle de
certificats — gain de temps pour un projet solo).
## Section 16 — Planning prévisionnel
Voir document dédié (Section 16 détaillée — Partie « Planning prévisionnel »).
## Section 17 — Gestion des risques projet
| Risque | Impact | Mitigation |
|---|---|---|
| Interruption longue du projet (indisponibilité) | Perte de contexte | Journal de bord, README à jour, code auto-documenté |
| Dépendance à un service externe (Mattermost) | Fonctionnalité chat/Kanban indisponible | Service isolé, redémarrage indépendant (Docker) |
| Erreur de configuration Keycloak | Blocage de l'authentification | Export de la configuration réalm (`export_keycloak/`) |
| Régression lors d'une évolution | Fonctionnalité cassée silencieusement | Suite de tests automatisés (34 cas), exécutée avant chaque livraison |
## Section 18 — Critères d'acceptation / recette
Voir Partie 4 — Grille de recette (15 critères).
## Section 19 — Glossaire
- **OIDC** : OpenID Connect, protocole d'authentification basé sur OAuth2.
- **SSO** : Single Sign-On, authentification unique pour plusieurs services.
- **sub** : identifiant unique et opaque d'un utilisateur dans un token OIDC.
- **3NF** : troisième forme normale (modélisation de bases de données
relationnelles).
- **Repository Pattern** : patron de conception isolant l'accès aux données
derrière une interface stable.
## Section 20 — Annexes
Voir Annexe A1 (Qualité du code), Annexe A2 (Estimation de charge),
Partie 3 (DevOps), Partie 4 (Plan de tests), Partie 5 (Rétro-documentation),
Partie 6 (Journal de bord).
## Illustrations — Schémas d'architecture (Sections 10, 12, 13)
![IMG:evidence/schema_infrastructure.png|Schéma d'architecture d'infrastructure Docker Compose (Section 12)]
![IMG:evidence/schema_couches_logiques.png|Schéma d'architecture logique en 5 couches (Section 10)]