# ODETOOL — Sauvegarde locale automatique

Protection des données tant que l'application vit sur ton Mac (MAMP), en
attente d'un hébergement. Le code est déjà protégé par Git (local + GitHub) ;
ce dispositif protège les **données** : bases MySQL et dossier `saves/`.

## Ce que ça fait

Chaque jour à **12 h 00** (créneau choisi parce que le Mac est allumé et
MAMP démarré pendant la journée), le script `tools/sauvegarde-odetool.sh` :

1. sauvegarde la base centrale `odetool_clipboard` (comptes, sessions, TAGS) ;
2. sauvegarde **toutes** les bases `workspace_*` (une par espace de travail) ;
3. archive le dossier `saves/` (exports locaux) ;
4. écrit un manifeste (`MANIFEST.txt`) et un journal (`sauvegarde.log`) ;
5. supprime les sauvegardes de plus de 30 jours.

Chaque exécution crée un dossier horodaté dans **iCloud Drive** (destination
par défaut — les sauvegardes sont conservées localement ET dans le cloud,
donc protégées d'une panne du disque du Mac) :

```
iCloud Drive/ODETOOL-sauvegardes/
  ├── sauvegarde.log                      ← journal de toutes les exécutions
  └── 2026-10-07_120000/                  ← une sauvegarde par jour
      ├── MANIFEST.txt
      ├── odetool_clipboard.sql.gz
      ├── workspace_antoine.sql.gz
      ├── workspace_essai2.sql.gz
      ├── …
      └── saves.tar.gz
```

Les identifiants MySQL sont lus dans `api/Config/db_credentials.php`
(source unique de vérité) — rien à configurer.

## Emploi manuel

Lancer une sauvegarde immédiate (destination par défaut = iCloud Drive) :

```bash
/Applications/MAMP/htdocs/odetool/tools/sauvegarde-odetool.sh
```

Sauvegarder vers un dossier de son choix (ex. dossier local pur, ou
Dropbox/autre cloud) :

```bash
/Applications/MAMP/htdocs/odetool/tools/sauvegarde-odetool.sh "/chemin/vers/dossier"
```

## Restaurer

```bash
# Tout (toutes les bases + saves/)
/Applications/MAMP/htdocs/odetool/tools/restaure-odetool.sh "$HOME/Library/Mobile Documents/com~apple~CloudDocs/ODETOOL-sauvegardes/<dossier>"

# Une seule base (un seul espace de travail)
/Applications/MAMP/htdocs/odetool/tools/restaure-odetool.sh "$HOME/Library/Mobile Documents/com~apple~CloudDocs/ODETOOL-sauvegardes/<dossier>" workspace_essai2
```

Si la sauvegarde n'est plus présente localement (icône de téléchargement
dans le Finder), macOS la récupère automatiquement à l'ouverture du dossier
— prévoir quelques instants.

Une confirmation est demandée avant tout écrasement. La procédure a été
testée de bout en bout (restauration complète de `workspace_essai2`).
Conseil : **retester la restauration après chaque grosse évolution** de
l'application (nouvelles tables) — une sauvegarde non restaurable n'est
pas une sauvegarde.

## Points d'attention

- **Le Mac doit être allumé et MAMP démarré à 12 h 00** : cron n'exécute rien
  sur une machine éteinte et **ne se rattrape pas** — si l'ordinateur est
  fermé à midi, la sauvegarde du jour est simplement sautée (la suivante a
  lieu le lendemain). En cas de doute, lancer un emploi manuel (ci-dessus).
- La sauvegarde se fait **pendant l'usage de l'application** sans verrouiller
  les tables (option `--single-transaction`) : aucun impact perceptible.
- **Envoi vers le cloud** : macOS synchronise iCloud Drive en arrière-plan
  (quelques minutes après l'écriture ; l'état est visible dans le Finder).
  En cas d'interruption, la reprise est automatique dès la reconnexion.
- **Quota iCloud** : environ 21 Mo par sauvegarde, 30 jours de rétention
  ≈ 650 Mo — confortable dans l'offre gratuite (5 Go). Si besoin, réduire
  `RETENTION_DAYS` en tête du script.
- Si « Optimiser le stockage Mac » est activé, macOS peut libérer l'espace
  local des anciennes sauvegardes (elles restent dans le cloud, visibles
  dans le Finder avec l'icône de téléchargement).
- Consulter périodiquement `sauvegarde.log` : chaque exécution doit se
  terminer par « Terminé sans erreur ».
- Les sauvegardes contiennent des données personnelles : ne pas les
  versionner dans Git (elles sont hors du dépôt), et ne pas les déposer
  dans un dossier servi par Apache.
- Supprimer l'automatisme : `crontab -r` (retire tout le crontab) ou
  `crontab -e` et supprimer la ligne ODETOOL.

## À l'hébergement

Le runbook `docs/DEPLOIEMENT.md` prévoit le même dispositif côté serveur
(`mysqldump` quotidien + test de restauration) : cette mécanique locale
restera utile comme sauvegarde de secours et pour rapatrier des données
de test sur MAMP.
