# Console centrale Vie Asso (dashboard.vie-asso.fr)

Petit site autonome, réservé à l'équipe Vie Asso, qui affiche l'état de tous les sites d'école :
version, migrations manquantes, e-mails, maintenance, activité, éléments à traiter, alertes.

- **Aucune base de données**, aucune dépendance : PHP 8.2+ avec cURL.
- **Connexion** : les comptes hyperadmin (même section que dans le `config.php` des écoles) : e-mail,
  mot de passe, puis code de l'application d'authentification.
- **Suivi en lecture** ; création et mise à jour des écoles en option (voir plus bas), toujours
  confirmées par votre code. La console ne peut jamais ouvrir de session sur une école : le bouton
  « Administration » ouvre la page de connexion Vie Asso de l'école.
- **Échanges sécurisés** : chaque école a son propre secret. Les requêtes sont signées (horodatage à
  ±5 minutes, code à usage unique) et les réponses aussi ; sans signature valide, l'école répond 404.
  Les écoles ne renvoient que des indicateurs et des compteurs, jamais de données personnelles.

## Installation chez OVH

1. **Sous-domaine** : OVH → Hébergement → *Multisite* → ajouter `dashboard.vie-asso.fr`, dossier racine
   `dashboard/public` (le site doit pointer sur **public**, pas sur `dashboard`). Activer le certificat SSL.
2. **Envoyer le dossier `dashboard/`** par FTP (tout le dossier, avec ses fichiers `.htaccess`).
3. **Configuration** : copier `config/config.example.php` en `config/config.php`, puis :
   - coller dans `'hyperadmin'` la section des comptes Vie Asso (la même que dans les écoles) ;
   - vérifier `'base_url'`.
4. **Relier chaque école** (sur votre ordinateur, depuis le dossier `dashboard/`) :
   ```
   php bin/new-site.php
   ```
   Le script affiche deux sections :
   - la section `'dashboard'` à coller dans le `config/config.php` **de l'école** ;
   - la ligne à ajouter dans la liste `'sites'` du `config/config.php` **de la console**.
   Sur l'école, la page *Système* doit alors afficher « Console centrale Vie Asso : reliée ».
5. **Dossier `storage/`** : il doit être accessible en écriture par PHP (sessions, états, journal).
6. *(Facultatif)* **Tâche planifiée** toutes les 15 minutes : `dashboard/bin/refresh.php` (PHP 8.x).
   Sans elle, l'état est lu à l'ouverture de la console (gardé 2 minutes) et par le bouton « Actualiser ».

## Créer des écoles et les mettre à jour depuis la console

Possible quand la console et les écoles sont sur **le même hébergement OVH** et que la zone DNS
`vie-asso.fr` est chez OVH.

### Arborescence de l'hébergement

```
/homez.XXX/COMPTE/          ← racine FTP (« home » dans config.php)
├── dashboard/              ← la console (Multisite : dashboard.vie-asso.fr → dashboard/public)
├── releases/               ← une version du site par sous-dossier, envoyée par FTP
│   └── 20261013-1800-console/   (paquet complet : app/, public/, vendor/, database/, VERSION…)
└── ecoles/                 ← sites créés par la console (ecoles/isg-lille/…)
```

### Mise en place (une seule fois)

1. **Clé API OVH limitée** : créez une application sur https://eu.api.ovh.com/createApp/, puis
   `php bin/ovh-credentials.php` (sur votre ordinateur) et validez le lien affiché. La clé ne peut que
   lire l'hébergement, créer des bases, rattacher des domaines, demander des certificats et créer des
   enregistrements DNS : **aucune suppression ni modification possible** (et la console le vérifie aussi).
2. Dans `config/config.php` de la console, complétez `hosting` (nom de l'hébergement, chemin de la
   racine FTP, zone), `ovh` (les trois clés) et `school_defaults` (boîte d'envoi des e-mails).
3. Pour qu'une école **existante** (ex. ISG Paris) puisse être mise à jour, ajoutez son dossier à sa
   ligne dans `sites` : `'path' => '/homez.XXX/COMPTE/isgva'`.

### Publier une nouvelle version

Envoyez le paquet complet du site (avec `vendor/`) dans `releases/<version>/`, où `<version>` est le
contenu de son fichier `VERSION` (format `AAAAMMJJ-HHMM-libellé`). Ne mettez jamais de `config.php`
ni de données dans ce dossier : ils ne sont pas copiés.

### Nouvelle école (bouton « + Nouvelle école »)

Nom, identifiant, sous-domaine, version, et — facultatif — l'application Microsoft de l'école et
l'adresse du premier administrateur ; confirmation par votre code. La console enchaîne :
vérifications → base de données (OVH) → copie des fichiers et `config.php` (secrets générés, droits
restreints) → création des tables et invitation du premier administrateur → sous-domaine (Multisite)
→ DNS → certificat HTTPS → liaison à la console → vérification. La page de suivi avance seule ;
une étape en erreur peut être corrigée puis relancée. Sans les informations Microsoft, seul l'accès
Vie Asso fonctionne : complétez-les plus tard (page de l'école → « Connexion Microsoft »).

**Conseil** : faites une première création d'essai (ex. `essai.vie-asso.fr`) pour valider l'ensemble
chez OVH — notamment l'import de toutes les migrations sur une base neuve.

### Mises à jour (bouton « Mises à jour »)

Choisissez la version et les écoles (celles en retard sont cochées), confirmez par votre code. Pour
chaque école, l'une après l'autre : copie de la nouvelle version **à côté** du site (encore en ligne),
bascule instantanée (le site affiche « Mise à jour en cours » quelques secondes), import des
migrations, remise en ligne, vérification. L'ancienne version est conservée : si une migration
échoue, la tâche s'arrête, le site reste en maintenance et la console propose de **revenir à la
version précédente** (ou de remettre en ligne).

## Utilisation

- **Écoles** : une carte par école (OK / À vérifier / En erreur), totaux en haut, écoles en erreur en premier.
- **Détails** : technique (version, PHP, migrations, maintenance, e-mails, disque), éléments à traiter,
  activité, fonctionnalités activées, situation associative des étudiants.
- **Alertes** : école injoignable ou secret refusé, migrations à importer, version plus ancienne que la
  plus récente déployée, maintenance non exécutée depuis 26 h, e-mails en échec, envoi sans SMTP,
  disque presque plein, compte Vie Asso absent, paiements en mode test, éléments en attente.
- **Version** : chaque école envoie le contenu de son fichier `VERSION`. Mettez-le à jour à chaque
  déploiement (format `AAAAMMJJ-HHMM-libellé`, ex. `20261013-1800-console`) pour repérer les écoles en retard.

## Sécurité

- HTTPS obligatoire (redirection automatique), en-têtes stricts (CSP, HSTS, anti-iframe), session de
  30 minutes d'inactivité et 12 h maximum, cookie `__Host-` sécurisé, jetons CSRF sur tous les formulaires.
- Tentatives limitées (10 par IP et 5 par compte en 15 min ; code verrouillé 15 min après 5 erreurs),
  anti-rejeu des codes, restriction facultative par adresse IP (`allowed_ips`).
- Journal des connexions : `storage/logs/acces-AAAA-MM.log`.
- Retirer un compte de `config.php` coupe immédiatement ses sessions.
- `config/`, `src/`, `storage/`, `templates/` et `bin/` ne sont jamais servis par le web.
