# 🚀 Guide de Déploiement BNAR sur OVH

Ce guide vous accompagne pour déployer l'application BNAR sur un serveur OVH et la rendre accessible sur Internet.

## 📋 Prérequis

- Un serveur OVH (VPS ou serveur dédié) avec accès SSH
- Node.js 18+ installé sur le serveur
- MySQL/MariaDB installé et configuré
- Un nom de domaine pointant vers votre serveur (optionnel mais recommandé)
- Accès root ou utilisateur avec privilèges sudo

## 🔧 Étape 1 : Préparation du Serveur

### 1.1 Connexion SSH au serveur

```bash
ssh utilisateur@votre-serveur-ovh.com
```

### 1.2 Mise à jour du système

```bash
sudo apt update && sudo apt upgrade -y
```

### 1.3 Installation de Node.js (si non installé)

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

# Vérifier l'installation
node --version
npm --version
```

### 1.4 Installation de MySQL (si non installé)

```bash
sudo apt install -y mysql-server

# Sécuriser l'installation
sudo mysql_secure_installation

# Créer un utilisateur pour l'application
sudo mysql -u root -p
```

Dans MySQL :

```sql
CREATE DATABASE bnar_aibd_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'bnar_user'@'localhost' IDENTIFIED BY 'VotreMotDePasseSecurise';
GRANT ALL PRIVILEGES ON bnar_aibd_db.* TO 'bnar_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

### 1.5 Installation de Nginx (pour reverse proxy)

```bash
sudo apt install -y nginx

# Activer Nginx au démarrage
sudo systemctl enable nginx
sudo systemctl start nginx
```

### 1.6 Installation de PM2 (gestionnaire de processus Node.js)

```bash
sudo npm install -g pm2

# Activer PM2 au démarrage
pm2 startup systemd
# Suivre les instructions affichées
```

## 📦 Étape 2 : Déploiement de l'Application

### 2.1 Créer un répertoire pour l'application

```bash
sudo mkdir -p /var/www/bnar
sudo chown -R $USER:$USER /var/www/bnar
cd /var/www/bnar
```

### 2.2 Télécharger votre code sur le serveur

**Option A : Via Git (recommandé)**

```bash
# Si vous avez un dépôt Git
git clone https://votre-repo.git .

# Ou transférer via SCP depuis votre machine locale
# scp -r /chemin/vers/BNAR_BACK/* utilisateur@serveur:/var/www/bnar/
```

**Option B : Via SCP (depuis votre machine locale)**

```bash
# Depuis votre Mac, dans le terminal local
scp -r /Users/macbook/Documents/BNAR\ V1/BNAR/BNAR_BACK/* utilisateur@votre-serveur:/var/www/bnar/
```

### 2.3 Installation des dépendances

```bash
cd /var/www/bnar
npm install --production
```

### 2.4 Configuration de l'environnement

```bash
nano .env
```

Configurer le fichier `.env` :

```env
# Configuration du serveur
PORT=3000

# Configuration de la base de données MySQL
DB_HOST=localhost
DB_USER=bnar_user
DB_PASSWORD=VotreMotDePasseSecurise
DB_NAME=bnar_aibd_db
DB_PORT=3306

# JWT Secret (changez par une clé sécurisée)
JWT_SECRET=votre_secret_jwt_super_securise_en_production_2025

# Environnement
NODE_ENV=production
```

**⚠️ Important :** Changez `JWT_SECRET` par une chaîne aléatoire sécurisée !

### 2.5 Initialisation de la base de données

```bash
# Si vous avez un script SQL d'initialisation
mysql -u bnar_user -p bnar_aibd_db < init-db.sql

# Ou créer manuellement la structure via Sequelize
node -e "require('./config/database').sync({ alter: true })"
```

### 2.6 Créer un utilisateur administrateur

```bash
node create-admin.js
# Suivre les instructions pour créer un admin
```

## ⚙️ Étape 3 : Configuration de PM2

### 3.1 Créer un fichier de configuration PM2

```bash
nano ecosystem.config.js
```

Contenu :

```javascript
module.exports = {
  apps: [{
    name: 'bnar-backend',
    script: './server.js',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z'
  }]
};
```

### 3.2 Créer le répertoire de logs

```bash
mkdir -p logs
```

### 3.3 Démarrer l'application avec PM2

```bash
pm2 start ecosystem.config.js
pm2 save

# Vérifier le statut
pm2 status
pm2 logs bnar-backend
```

## 🌐 Étape 4 : Configuration de Nginx

### 4.1 Créer la configuration Nginx

```bash
sudo nano /etc/nginx/sites-available/bnar
```

Contenu :

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

    # Taille max des uploads (100MB)
    client_max_body_size 100M;

    # Logs
    access_log /var/log/nginx/bnar_access.log;
    error_log /var/log/nginx/bnar_error.log;

    # Application Node.js
    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;
    }

    # Fichiers statiques (si nécessaire)
    location /uploads {
        alias /var/www/bnar/public/uploads;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}
```

### 4.2 Activer le site

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

## 🔒 Étape 5 : Configuration SSL/HTTPS (Recommandé)

### 5.1 Installation de Certbot

```bash
sudo apt install -y certbot python3-certbot-nginx
```

### 5.2 Obtenir un certificat SSL

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

Certbot configurera automatiquement Nginx pour HTTPS.

## 🔐 Étape 6 : Configuration du Firewall

```bash
# Autoriser SSH, HTTP, HTTPS
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

# Vérifier le statut
sudo ufw status
```

## ✅ Étape 7 : Vérification

### 7.1 Vérifier que l'application fonctionne

```bash
# Vérifier PM2
pm2 status

# Vérifier Nginx
sudo systemctl status nginx

# Vérifier MySQL
sudo systemctl status mysql

# Tester l'API
curl http://localhost:3000/health
```

### 7.2 Tester depuis le navigateur

- Accéder à : `http://votre-domaine.com` ou `https://votre-domaine.com`
- Vérifier que la page de connexion s'affiche
- Tester la connexion avec votre compte administrateur

## 🔄 Commandes Utiles

### Gestion de l'application

```bash
# Redémarrer l'application
pm2 restart bnar-backend

# Arrêter l'application
pm2 stop bnar-backend

# Voir les logs
pm2 logs bnar-backend

# Surveiller les ressources
pm2 monit

# Redémarrer après redémarrage du serveur
pm2 resurrect
```

### Gestion de Nginx

```bash
# Recharger la configuration
sudo systemctl reload nginx

# Redémarrer Nginx
sudo systemctl restart nginx

# Voir les logs
sudo tail -f /var/log/nginx/bnar_error.log
```

## 🔧 Dépannage

### L'application ne démarre pas

```bash
# Vérifier les logs PM2
pm2 logs bnar-backend --lines 50

# Vérifier les variables d'environnement
pm2 env bnar-backend

# Tester manuellement
cd /var/www/bnar
node server.js
```

### Erreurs de connexion MySQL

```bash
# Vérifier que MySQL fonctionne
sudo systemctl status mysql

# Tester la connexion
mysql -u bnar_user -p bnar_aibd_db

# Vérifier les permissions
sudo mysql -u root -p
SHOW GRANTS FOR 'bnar_user'@'localhost';
```

### Nginx renvoie une erreur 502

```bash
# Vérifier que l'application écoute sur le port 3000
netstat -tlnp | grep 3000

# Vérifier les logs Nginx
sudo tail -f /var/log/nginx/bnar_error.log
```

## 📝 Maintenance

### Mettre à jour l'application

```bash
cd /var/www/bnar

# Si vous utilisez Git
git pull origin main

# Installer les nouvelles dépendances
npm install --production

# Redémarrer l'application
pm2 restart bnar-backend
```

### Sauvegardes

Créez un script de sauvegarde :

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

mkdir -p $BACKUP_DIR

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

# Sauvegarder les fichiers uploadés
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz /var/www/bnar/public/uploads

# Garder seulement les 7 derniers jours
find $BACKUP_DIR -type f -mtime +7 -delete
```

## 🎯 Prochaines Étapes

1. ✅ Configuration de la surveillance (monitoring)
2. ✅ Configuration des sauvegardes automatiques
3. ✅ Optimisation des performances
4. ✅ Configuration d'un CDN pour les fichiers statiques

## 📞 Support

En cas de problème, consultez :
- Les logs PM2 : `pm2 logs bnar-backend`
- Les logs Nginx : `/var/log/nginx/bnar_error.log`
- La documentation OVH : https://docs.ovh.com/

