# Déploiement sur serveur Apache

## Prérequis

- Serveur Ubuntu/Debian avec Apache2
- Node.js 18+ installé
- MongoDB installé et configuré
- Accès SSH au serveur
- Nom de domaine configuré

## Étape 1: Préparation du serveur

```bash
# Mise à jour du système
sudo apt update && sudo apt upgrade -y

# Installation des dépendances
sudo apt install -y curl git nginx certbot python3-certbot-apache

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

# Installation de MongoDB
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

# Démarrer et activer MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod
```

## Étape 2: Configuration du projet

```bash
# Cloner le projet sur le serveur
cd /var/www
sudo git clone <votre-repo-git> rdv-planner
cd rdv-planner

# Installer les dépendances
sudo npm ci --production

# Créer le fichier d'environnement
sudo cp .env.example .env
sudo nano .env
```

## Étape 3: Configuration Apache

```bash
# Créer le fichier de configuration Apache
sudo nano /etc/apache2/sites-available/rdv-planner.conf
```

Contenu du fichier Apache:

```apache
<VirtualHost *:80>
    ServerName votre-domaine.com
    ServerAlias www.votre-domaine.com
    
    # Proxy vers Node.js
    ProxyPreserveHost On
    ProxyRequests Off
    
    ProxyPass /api http://localhost:3000/api
    ProxyPassReverse /api http://localhost:3000/api
    
    ProxyPass /socket.io http://localhost:3000/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/socket.io
    
    # Servir les fichiers statiques directement
    DocumentRoot /var/www/rdv-planner/public
    
    <Directory /var/www/rdv-planner/public>
        AllowOverride All
        Require all granted
    </Directory>
    
    # Rediriger toutes les autres requêtes vers index.html
    <Location "/">
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.html [L]
    </Location>
    
    # Headers de sécurité
    Header always set X-Content-Type-Options nosniff
    Header always set X-Frame-Options DENY
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    
    # Log files
    ErrorLog ${APACHE_LOG_DIR}/rdv-planner-error.log
    CustomLog ${APACHE_LOG_DIR}/rdv-planner-access.log combined
</VirtualHost>
```

## Étape 4: Activer les modules Apache

```bash
# Activer les modules nécessaires
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod ssl

# Activer le site
sudo a2ensite rdv-planner.conf
sudo a2dissite 000-default.conf

# Redémarrer Apache
sudo systemctl restart apache2
```

## Étape 5: Configuration SSL avec Let's Encrypt

```bash
# Obtenir un certificat SSL
sudo certbot --apache -d votre-domaine.com -d www.votre-domaine.com

# Configurer le renouvellement automatique
sudo crontab -e
# Ajouter cette ligne:
# 0 12 * * * /usr/bin/certbot renew --quiet
```

## Étape 6: Configuration du service Node.js

```bash
# Créer le fichier de service systemd
sudo nano /etc/systemd/system/rdv-planner.service
```

Contenu du fichier de service:

```ini
[Unit]
Description=RDV Planner Pro
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/rdv-planner
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
Environment=NODE_ENV=production

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

```bash
# Activer et démarrer le service
sudo systemctl daemon-reload
sudo systemctl enable rdv-planner
sudo systemctl start rdv-planner

# Vérifier le statut
sudo systemctl status rdv-planner
```

## Étape 7: Configuration du firewall

```bash
# Configurer UFW
sudo ufw allow ssh
sudo ufw allow 'Apache Full'
sudo ufw enable
```

## Étape 8: Finalisation

```bash
# Configurer les permissions
sudo chown -R www-data:www-data /var/www/rdv-planner
sudo chmod -R 755 /var/www/rdv-planner

# Créer les répertoires de logs
sudo mkdir -p /var/log/rdv-planner
sudo chown www-data:www-data /var/log/rdv-planner

# Redémarrer tous les services
sudo systemctl restart rdv-planner
sudo systemctl restart apache2
sudo systemctl restart mongod
```

## Étape 9: Monitoring et maintenance

```bash
# Installer PM2 pour la gestion des processus
sudo npm install -g pm2

# Créer le fichier de configuration PM2
sudo nano /var/www/rdv-planner/ecosystem.config.js
```

Contenu du fichier PM2:

```javascript
module.exports = {
  apps: [{
    name: 'rdv-planner',
    script: 'server.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: '/var/log/rdv-planner/error.log',
    out_file: '/var/log/rdv-planner/out.log',
    log_file: '/var/log/rdv-planner/combined.log',
    time: true
  }]
};
```

```bash
# Démarrer avec PM2
sudo pm2 start ecosystem.config.js
sudo pm2 save
sudo pm2 startup
```

## Vérification du déploiement

1. **Test de l'application**: Visitez `https://votre-domaine.com`
2. **Test de l'API**: `curl https://votre-domaine.com/api/polls`
3. **Vérification des logs**: `sudo journalctl -u rdv-planner -f`

## Maintenance régulière

```bash
# Mettre à jour l'application
cd /var/www/rdv-planner
sudo git pull origin main
sudo npm ci --production
sudo pm2 restart rdv-planner

# Sauvegarde de la base de données
sudo mongodump --db rdv-planner --out /backup/$(date +%Y%m%d)

# Nettoyage des logs
sudo find /var/log/rdv-planner -name "*.log" -mtime +30 -delete
```

## Dépannage

- **Erreurs 502**: Vérifiez que le service Node.js fonctionne
- **Erreurs 404**: Vérifiez la configuration du proxy Apache
- **Connexion MongoDB**: Vérifiez que MongoDB est en cours d'exécution
- **Permissions**: Assurez-vous que www-data a les droits nécessaires
