# Guide de Déploiement - Gestion des Formations Manager Itinova

## Table des matières

1. [Prérequis](#prérequis)
2. [Installation locale](#installation-locale)
3. [Configuration](#configuration)
4. [Déploiement en production](#déploiement-en-production)
5. [Migration de base de données](#migration-de-base-de-données)
6. [Maintenance](#maintenance)
7. [Dépannage](#dépannage)

---

## Prérequis

### Environnement de développement

- **Node.js** : version 22.13.0 ou supérieure
- **pnpm** : gestionnaire de paquets (installé avec Node.js)
- **Base de données** : MySQL 8.0+ ou TiDB (compatible MySQL)
- **Git** : pour le contrôle de version

### Services externes (optionnels)

- **Resend** : pour l'envoi d'emails (clé API requise)
- **Plateforme Manus** : pour l'authentification OAuth (déjà configuré)

---

## Installation locale

### 1. Cloner le projet

```bash
# Si vous avez accès au dépôt Git
git clone <url-du-depot>
cd formation-manager-itinova

# Sinon, extraire l'archive
unzip formation-manager-itinova.zip
cd formation-manager-itinova
```

### 2. Installer les dépendances

```bash
pnpm install
```

### 3. Configurer les variables d'environnement

Créer un fichier `.env` à la racine du projet :

```env
# Base de données
DATABASE_URL=mysql://user:password@localhost:3306/formation_manager

# JWT Secret (générer une clé aléatoire sécurisée)
JWT_SECRET=votre_cle_secrete_tres_longue_et_aleatoire

# OAuth Manus (déjà configuré sur la plateforme)
OAUTH_SERVER_URL=https://api.manus.im
VITE_OAUTH_PORTAL_URL=https://login.manus.im
VITE_APP_ID=votre_app_id

# Propriétaire
OWNER_OPEN_ID=votre_open_id
OWNER_NAME=Nom du propriétaire

# Application
VITE_APP_TITLE=Gestion des Formations Manager Itinova
VITE_APP_LOGO=/logo.svg

# APIs Manus (optionnel)
BUILT_IN_FORGE_API_URL=https://forge.manus.im
BUILT_IN_FORGE_API_KEY=votre_cle_api
VITE_FRONTEND_FORGE_API_KEY=votre_cle_frontend
VITE_FRONTEND_FORGE_API_URL=https://forge.manus.im

# Analytics (optionnel)
VITE_ANALYTICS_ENDPOINT=https://analytics.manus.im
VITE_ANALYTICS_WEBSITE_ID=votre_website_id
```

### 4. Initialiser la base de données

```bash
# Créer la base de données
mysql -u root -p -e "CREATE DATABASE formation_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# Appliquer les migrations
pnpm db:push
```

### 5. Créer l'utilisateur administrateur

L'utilisateur administrateur est créé automatiquement au premier lancement :

- **Identifiant** : `adminServFormation`
- **Mot de passe** : `Itinova69!`
- **Email** : `admin@formation.local` (modifiable)

### 6. Lancer l'application en développement

```bash
pnpm dev
```

L'application sera accessible à l'adresse : `http://localhost:3000`

---

## Configuration

### Configuration SMTP (Resend)

1. Créer un compte sur [Resend](https://resend.com)
2. Générer une clé API
3. Se connecter à l'application avec l'utilisateur admin
4. Aller dans **Configuration SMTP**
5. Saisir :
   - **Clé API Resend** : votre clé API
   - **Email expéditeur** : votre email vérifié sur Resend
   - **Nom de l'expéditeur** : Itinova Formation
6. Activer le mode **Production**
7. Tester l'envoi

### Personnalisation des templates d'emails

1. Se connecter en tant qu'administrateur
2. Aller dans **Templates d'emails**
3. Modifier les templates selon vos besoins :
   - Email de confirmation d'inscription
   - Email teaser
   - Email de rappel J-7

### Gestion des utilisateurs

1. Se connecter en tant qu'administrateur
2. Aller dans **Utilisateurs**
3. Créer de nouveaux utilisateurs avec identifiant et mot de passe
4. Attribuer le rôle **admin** ou **user**

**Note** : L'utilisateur `adminServFormation` ne peut pas être supprimé et garantit un accès permanent à l'administration.

---

## Déploiement en production

### Option 1 : Déploiement sur la plateforme Manus (recommandé)

L'application est déjà configurée pour la plateforme Manus. Pour déployer :

1. Se connecter à l'interface de gestion Manus
2. Créer un checkpoint via le bouton **Save Checkpoint**
3. Cliquer sur le bouton **Publish** dans l'en-tête
4. Configurer le domaine personnalisé si nécessaire
5. Publier l'application

**Avantages** :
- Déploiement automatique
- SSL/TLS automatique
- Scaling automatique
- Base de données TiDB incluse
- Pas de configuration serveur nécessaire

### Option 2 : Déploiement manuel sur serveur VPS

#### Prérequis serveur

- Ubuntu 22.04 LTS ou supérieur
- 2 CPU, 4 GB RAM minimum
- Node.js 22.13.0+
- MySQL 8.0+ ou MariaDB 10.6+
- Nginx (reverse proxy)
- Certbot (SSL/TLS)

#### Étapes de déploiement

1. **Préparer le serveur**

```bash
# Mettre à jour le système
sudo apt update && sudo apt upgrade -y

# Installer Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs

# Installer pnpm
npm install -g pnpm

# Installer MySQL
sudo apt install -y mysql-server

# Installer Nginx
sudo apt install -y nginx

# Installer Certbot
sudo apt install -y certbot python3-certbot-nginx
```

2. **Déployer l'application**

```bash
# Créer un utilisateur dédié
sudo useradd -m -s /bin/bash formation
sudo su - formation

# Cloner ou copier le projet
cd /home/formation
# Copier les fichiers du projet ici

# Installer les dépendances
pnpm install

# Configurer les variables d'environnement
cp .env.example .env
nano .env

# Build de production
pnpm build
```

3. **Configurer le service systemd**

Créer le fichier `/etc/systemd/system/formation-manager.service` :

```ini
[Unit]
Description=Formation Manager Itinova
After=network.target mysql.service

[Service]
Type=simple
User=formation
WorkingDirectory=/home/formation/formation-manager-itinova
ExecStart=/usr/bin/pnpm start
Restart=on-failure
RestartSec=10
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
```

Activer et démarrer le service :

```bash
sudo systemctl daemon-reload
sudo systemctl enable formation-manager
sudo systemctl start formation-manager
sudo systemctl status formation-manager
```

4. **Configurer Nginx**

Créer le fichier `/etc/nginx/sites-available/formation-manager` :

```nginx
server {
    listen 80;
    server_name votre-domaine.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }

    client_max_body_size 10M;
}
```

Activer le site :

```bash
sudo ln -s /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

5. **Configurer SSL/TLS avec Let's Encrypt**

```bash
sudo certbot --nginx -d votre-domaine.com
```

---

## Migration de base de données

### Appliquer les migrations

```bash
# En développement
pnpm db:push

# En production (avec sauvegarde)
# 1. Sauvegarder la base de données
mysqldump -u root -p formation_manager > backup_$(date +%Y%m%d_%H%M%S).sql

# 2. Appliquer les migrations
pnpm db:push
```

### Restaurer une sauvegarde

```bash
mysql -u root -p formation_manager < backup_20250123_120000.sql
```

---

## Maintenance

### Logs de l'application

```bash
# Logs systemd
sudo journalctl -u formation-manager -f

# Logs Nginx
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
```

### Mise à jour de l'application

```bash
# Arrêter le service
sudo systemctl stop formation-manager

# Mettre à jour le code
cd /home/formation/formation-manager-itinova
git pull origin main

# Installer les nouvelles dépendances
pnpm install

# Appliquer les migrations
pnpm db:push

# Rebuild
pnpm build

# Redémarrer le service
sudo systemctl start formation-manager
```

### Sauvegarde automatique

Créer un script de sauvegarde `/home/formation/backup.sh` :

```bash
#!/bin/bash
BACKUP_DIR="/home/formation/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# Créer le répertoire de sauvegarde
mkdir -p $BACKUP_DIR

# Sauvegarder la base de données
mysqldump -u root -p formation_manager > $BACKUP_DIR/db_$DATE.sql

# Compresser
gzip $BACKUP_DIR/db_$DATE.sql

# Supprimer les sauvegardes de plus de 30 jours
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +30 -delete

echo "Sauvegarde terminée : $BACKUP_DIR/db_$DATE.sql.gz"
```

Ajouter une tâche cron :

```bash
crontab -e

# Sauvegarde quotidienne à 2h du matin
0 2 * * * /home/formation/backup.sh
```

---

## Dépannage

### L'application ne démarre pas

1. Vérifier les logs :
   ```bash
   sudo journalctl -u formation-manager -n 50
   ```

2. Vérifier la connexion à la base de données :
   ```bash
   mysql -u root -p -e "SHOW DATABASES;"
   ```

3. Vérifier les variables d'environnement dans `.env`

### Erreur de connexion à la base de données

1. Vérifier que MySQL est démarré :
   ```bash
   sudo systemctl status mysql
   ```

2. Tester la connexion :
   ```bash
   mysql -u user -p formation_manager
   ```

3. Vérifier l'URL de connexion dans `.env`

### Les emails ne sont pas envoyés

1. Vérifier la configuration SMTP dans l'interface admin
2. Vérifier que la clé API Resend est valide
3. Vérifier que l'email expéditeur est vérifié sur Resend
4. Consulter les logs de l'application

### Problème de permissions

```bash
# Corriger les permissions
sudo chown -R formation:formation /home/formation/formation-manager-itinova
sudo chmod -R 755 /home/formation/formation-manager-itinova
```

### L'authentification locale ne fonctionne pas

1. Vérifier que `JWT_SECRET` est défini dans `.env`
2. Vérifier que l'utilisateur `adminServFormation` existe dans la base de données
3. Réinitialiser le mot de passe si nécessaire via SQL :

```sql
-- Le mot de passe hashé pour "Itinova69!"
UPDATE users 
SET password = '$2a$10$...' 
WHERE username = 'adminServFormation';
```

---

## Support

Pour toute question ou problème :

1. Consulter la documentation complète dans le dossier `/docs`
2. Vérifier les logs de l'application
3. Contacter l'équipe de développement

---

**Version** : 1.0.0  
**Dernière mise à jour** : 23 novembre 2025
