# ODETOOL — Fiche de déploiement

Guide de mise en ligne de la plateforme (issue du chantier « comptes + sessions », phases A à D).
Environnement de développement actuel : MAMP (macOS), MySQL local, accès root.

## 1. Prérequis serveur

- PHP ≥ 8.1 (développé et testé sous PHP 8.3) avec PDO MySQL, sessions activées.
- MySQL ≥ 8.0 (ou MariaDB ≥ 10.4).
- Serveur web avec HTTPS **obligatoire** (Let's Encrypt ou équivalent).
- Une base de données par workspace est créée automatiquement au premier accès
  (préfixe `workspace_`), plus la base centrale `odetool_clipboard`.

## 2. Compte MySQL applicatif

Ne jamais utiliser root en production. Créer un compte dédié :

```sql
CREATE DATABASE odetool_clipboard CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'odetool_app'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE_FORT';
GRANT ALL PRIVILEGES ON `workspace\_%`.* TO 'odetool_app'@'localhost';
GRANT ALL PRIVILEGES ON odetool_clipboard.* TO 'odetool_app'@'localhost';
FLUSH PRIVILEGES;
```

Le compte doit pouvoir créer des bases (`workspace_*`) : garder le `GRANT` sur le
motif `workspace\_%` même si l'on souhaite restreindre le reste.

## 3. Configuration des accès

1. Copier `api/Config/db_credentials.example.php` en `api/Config/db_credentials.php`.
2. Renseigner `host`, `user`, `password` du compte applicatif.
3. Vérifier que `.gitignore` exclut bien ce fichier (déjà fait).

## 4. HTTPS et cookie de session

Dans `api/Config/auth_guard.php` (fonction `auth_guard_session`), activer :

```php
'secure' => true,
```

C'est le seul réglage à inverser pour la production. Le cookie de session est
déjà `HttpOnly` + `SameSite=Lax`.

## 5. php.ini recommandé (production)

```ini
display_errors = Off
log_errors = On
error_log = /var/log/php/odetool.log
session.cookie_httponly = 1
session.cookie_samesite = Lax
session.use_strict_mode = 1
expose_php = Off
```

Le dossier `saves/` est bloqué par `.htaccess` (`Require all denied`). Si le
serveur n'est pas Apache, appliquer l'équivalent (nginx : `location /saves/ { deny all; }`).

## 6. Sécurité intégrée (rappel)

- Comptes : bcrypt (`password_hash`), 8 caractères minimum.
- Verrouillage : 5 échecs de connexion / 15 minutes par IP (table `login_attempts`).
- Sessions : régénération d'ID à la connexion, mode strict, HttpOnly, SameSite.
- API : 401 sans session, 403 sans appartenance au workspace ; écritures réservées
  aux rôles `owner`/`editor` ; `reader` en lecture seule (IA incluse).
- La clé API IA (Mistral/OpenAI) ne quitte jamais le serveur (indicateur
  `ai_api_key_set` uniquement).

## 7. Sauvegardes

Sauvegarde quotidienne de toutes les bases (cron, exemple 3 h) :

```bash
mysqldump --databases odetool_clipboard $(mysql -N -e "SHOW DATABASES LIKE 'workspace\\_%'" | tr '\n' ' ') \
  | gzip > /var/backups/odetool/odetool_$(date +\%F).sql.gz
find /var/backups/odetool -mtime +30 -delete
```

Tester la restauration au moins une fois.

## 8. Mise en service

1. Déployer le code (hors `api/Config/db_credentials.php`, créé sur le serveur).
2. Ouvrir `Page-ODETOOL.php` : la modale « Connexion » propose de créer le
   **compte administrateur** (premier compte créé).
3. Créer les comptes utilisateurs et les rattacher aux workspaces avec leur rôle.
4. Vérifier : accès anonyme à `api/load.php` → 401 ; `saves/` → 403.

## 9. Points d'attention connus

- Les fichiers de `saves/` présents dans l'historique Git contiennent des
  données personnelles : à sortir du dépôt (`git rm -r --cached saves/`) et,
  idéalement, réécrire l'historique avant toute divulgation du dépôt.
- Les journaux MAMP (`error_log`) contiennent des messages applicatifs
  verbeux : à réduire en production si nécessaire.
- « Créer un workspace » (liste centrale) est une action d'administrateur.
