# AMA EDU — Système de synchronisation LOCAL → VPS

## Vue d'ensemble

```
[Utilisateur]
     │
     ▼
Double-clic  ──ou──  Bouton Symfony Admin
     │
     ▼
sync_amaedu.bat / SyncController
     │
     ▼ scripts/sync.sh  (local)
  ┌──────────────────────────────────────┐
  │ 1. Vérifications (réseau, SSH, mysql)│
  │ 2. Maintenance ON                    │
  │ 3. mysqldump local                   │
  │ 4. gzip                              │
  │ 5. scp → VPS /tmp/                   │
  │ 6. ssh → sync_import.sh              │
  │ 7. Maintenance OFF                   │
  └──────────────────────────────────────┘
     │
     ▼ vps/sync_import.sh  (VPS)
  ┌──────────────────────────────────────┐
  │ 1. Backup DB existante               │
  │ 2. Vérification archive              │
  │ 3. Maintenance ON                    │
  │ 4. Import MySQL                      │
  │ 5. Migrations Symfony                │
  │ 6. Maintenance OFF                   │
  │ 7. Test HTTP (200/302)               │
  │ 8. Rollback automatique si erreur    │
  │ 9. Nettoyage                         │
  └──────────────────────────────────────┘
     │
     ▼
  ✔ OK  ou  ✖ ERREUR (avec rollback)
```

---

## Structure des fichiers

```
amaedu-sync/
├── sync_amaedu.bat          ← Double-clic Windows
├── install.sh               ← Installation initiale (une fois)
├── scripts/
│   └── sync.sh              ← Script principal côté local
├── vps/
│   └── sync_import.sh       ← Script côté VPS
│       (à déployer dans /opt/amaedu/)
├── symfony/
│   ├── SyncController.php   ← Controller Symfony
│   ├── MaintenanceListener.php
│   ├── sync_index.html.twig ← Page admin synchronisation
│   └── maintenance.html.twig← Page maintenance utilisateurs
├── logs/                    ← Journaux (auto-créé)
└── dumps/                   ← Archives temporaires (auto-créé)
```

---

## Installation

### 1. Sur le poste local (Windows + Git Bash ou WSL)

```bash
# Copier le dossier amaedu-sync/ dans C:\amaedu\
# Ouvrir Git Bash dans ce dossier

bash install.sh
```

Le script va :
- Générer la clé SSH dédiée `~/.ssh/amaedu_sync_key`
- Afficher la clé publique à copier sur le VPS
- Tester la connexion SSH (optionnel)
- Créer les répertoires logs/ et dumps/

### 2. Sur le VPS

```bash
# Créer l'utilisateur sync
useradd -m -s /bin/bash sync

# Ajouter la clé SSH publique (coller depuis install.sh)
mkdir -p /home/sync/.ssh
echo 'VOTRE_CLE_PUBLIQUE' >> /home/sync/.ssh/authorized_keys
chmod 700 /home/sync/.ssh && chmod 600 /home/sync/.ssh/authorized_keys
chown -R sync:sync /home/sync/.ssh

# Déployer le script d'import
mkdir -p /opt/amaedu
cp vps/sync_import.sh /opt/amaedu/
chmod +x /opt/amaedu/sync_import.sh

# Créer le répertoire de backups et logs
mkdir -p /opt/amaedu/backups /var/log/amaedu
chown sync:sync /opt/amaedu/backups /var/log/amaedu

# Autoriser l'utilisateur sync à exécuter mysql et le script
# (ajouter dans /etc/sudoers si nécessaire)
```

### 3. Intégration Symfony

```bash
# Copier les fichiers dans le projet Symfony
cp symfony/SyncController.php      src/Controller/Admin/
cp symfony/MaintenanceListener.php src/EventListener/
cp symfony/sync_index.html.twig    templates/admin/sync/index.html.twig
cp symfony/maintenance.html.twig   templates/maintenance/index.html.twig
```

Dans `config/services.yaml`, injecter `%kernel.project_dir%` :

```yaml
App\Controller\Admin\SyncController:
    arguments:
        $projectDir: '%kernel.project_dir%'

App\EventListener\MaintenanceListener:
    arguments:
        $projectDir: '%kernel.project_dir%'
```

---

## Configuration

### scripts/sync.sh

| Variable      | Description                        | Exemple                    |
|---------------|------------------------------------|----------------------------|
| `LOCAL_URL`   | URL application locale             | `http://localhost`         |
| `VPS_HOST`    | IP ou domaine du VPS               | `161.97.128.28`            |
| `VPS_USER`    | Utilisateur SSH VPS                | `sync`                     |
| `VPS_SSH_KEY` | Chemin clé SSH privée              | `~/.ssh/amaedu_sync_key`   |
| `DB_USER`     | Utilisateur MySQL local            | `amaedu_user`              |
| `DB_PASS`     | Mot de passe MySQL local           | `***`                      |
| `DB_NAME`     | Nom base de données locale         | `amaedu`                   |

### vps/sync_import.sh

| Variable     | Description                        | Exemple                              |
|--------------|------------------------------------|--------------------------------------|
| `APP_URL`    | URL de l'application VPS           | `https://amaedu.servicesproviders.org` |
| `APP_DIR`    | Répertoire Symfony sur le VPS      | `/var/www/amaedu`                    |
| `DB_USER`    | Utilisateur MySQL VPS              | `amaedu_user`                        |
| `DB_PASS`    | Mot de passe MySQL VPS             | `***`                                |
| `DB_NAME`    | Nom base de données VPS            | `amaedu`                             |
| `BACKUP_DIR` | Répertoire backups automatiques    | `/opt/amaedu/backups`                |

---

## Sécurité

- **Clé SSH dédiée** : l'utilisateur `sync` n'a accès qu'à ce qui est nécessaire
- **Pas de mot de passe SSH** : uniquement authentification par clé
- **Backup automatique avant chaque import** : rollback possible en cas d'échec
- **Rollback automatique** : si le test HTTP échoue après import, la base est restaurée
- **Routes Symfony protégées** : `ROLE_ADMIN` requis + token CSRF sur le bouton

---

## Utilisation quotidienne

### Option A — Double-clic Windows
```
Double-clic sur sync_amaedu.bat
→ Fenêtre noire avec progression
→ Message SUCCÈS ou ERREUR
```

### Option B — Interface Symfony
```
Administration → Synchroniser avec le serveur
→ Barre de progression dans le navigateur
→ Journal en temps réel
```

---

## Logs

```
logs/sync.log          ← côté local
/var/log/amaedu/sync_import.log  ← côté VPS
```

Format :
```
[2026-03-12 10:00:01] Démarrage synchronisation
[2026-03-12 10:00:02] ✔ Connexion internet OK
[2026-03-12 10:00:03] ✔ Connexion VPS OK
[2026-03-12 10:00:04] STEP 3 - Export base de données locale
[2026-03-12 10:00:08] ✔ Dump créé : dump_20260312_100001.sql (4.2M)
...
[2026-03-12 10:01:12] ✔ Synchronisation terminée avec succès
```
