601 lines
12 KiB
Markdown
601 lines
12 KiB
Markdown
# Guide de déploiement - Formation Manager Itinova sur serveur Linux
|
|
|
|
## Vue d'ensemble
|
|
|
|
Ce guide vous accompagne dans le déploiement de l'application Formation Manager Itinova sur un serveur Linux (Ubuntu/Debian) avec authentification locale email/mot de passe (sans OAuth Manus).
|
|
|
|
**Durée estimée** : 1-2 heures
|
|
**Niveau** : Intermédiaire
|
|
|
|
---
|
|
|
|
## Prérequis
|
|
|
|
### Logiciels requis
|
|
|
|
- **Système** : Ubuntu 22.04 LTS ou Debian 11+
|
|
- **Node.js** : Version 22.x
|
|
- **pnpm** : Version 10.x
|
|
- **MySQL** : Version 8.0+ ou MariaDB 10.6+
|
|
- **Nginx** : Pour le reverse proxy (optionnel mais recommandé)
|
|
|
|
### Accès nécessaires
|
|
|
|
- Accès SSH au serveur
|
|
- Droits sudo
|
|
- Accès à la base de données MySQL
|
|
|
|
---
|
|
|
|
## Étape 1 : Préparation du serveur
|
|
|
|
### 1.1 Mise à jour du système
|
|
|
|
```bash
|
|
sudo apt update
|
|
sudo apt upgrade -y
|
|
```
|
|
|
|
### 1.2 Installation de Node.js 22.x
|
|
|
|
```bash
|
|
# Installer Node.js via NodeSource
|
|
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
|
|
sudo apt install -y nodejs
|
|
|
|
# Vérifier l'installation
|
|
node --version # Doit afficher v22.x.x
|
|
```
|
|
|
|
### 1.3 Installation de pnpm
|
|
|
|
```bash
|
|
npm install -g pnpm
|
|
pnpm --version # Doit afficher 10.x.x
|
|
```
|
|
|
|
### 1.4 Installation de MySQL
|
|
|
|
```bash
|
|
sudo apt install -y mysql-server
|
|
sudo mysql_secure_installation
|
|
```
|
|
|
|
---
|
|
|
|
## Étape 2 : Configuration de la base de données
|
|
|
|
### 2.1 Créer la base de données et l'utilisateur
|
|
|
|
```bash
|
|
sudo mysql
|
|
```
|
|
|
|
Dans MySQL :
|
|
|
|
```sql
|
|
CREATE DATABASE formation_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
CREATE USER 'formation_user'@'localhost' IDENTIFIED BY 'VOTRE_MOT_DE_PASSE_SECURISE';
|
|
GRANT ALL PRIVILEGES ON formation_manager.* TO 'formation_user'@'localhost';
|
|
FLUSH PRIVILEGES;
|
|
EXIT;
|
|
```
|
|
|
|
### 2.2 Tester la connexion
|
|
|
|
```bash
|
|
mysql -u formation_user -p formation_manager
|
|
# Entrez le mot de passe, puis EXIT
|
|
```
|
|
|
|
---
|
|
|
|
## Étape 3 : Déploiement de l'application
|
|
|
|
### 3.1 Créer le répertoire de l'application
|
|
|
|
```bash
|
|
sudo mkdir -p /var/www/formation-manager-itinova
|
|
sudo chown -R $USER:$USER /var/www/formation-manager-itinova
|
|
cd /var/www/formation-manager-itinova
|
|
```
|
|
|
|
### 3.2 Cloner ou copier les fichiers
|
|
|
|
**Option A : Via Git (recommandé)**
|
|
|
|
```bash
|
|
git clone https://github.com/votre-repo/formation-manager-itinova.git .
|
|
```
|
|
|
|
**Option B : Via upload manuel**
|
|
|
|
Transférez les fichiers via SCP/SFTP vers `/var/www/formation-manager-itinova/`
|
|
|
|
### 3.3 Installer les dépendances
|
|
|
|
```bash
|
|
cd /var/www/formation-manager-itinova
|
|
pnpm install
|
|
```
|
|
|
|
---
|
|
|
|
## Étape 4 : Configuration de l'application
|
|
|
|
### 4.1 Créer le fichier .env
|
|
|
|
```bash
|
|
nano /var/www/formation-manager-itinova/.env
|
|
```
|
|
|
|
**Contenu du fichier .env :**
|
|
|
|
```env
|
|
# Base de données
|
|
DATABASE_URL=mysql://formation_user:VOTRE_MOT_DE_PASSE@localhost:3306/formation_manager
|
|
|
|
# Sécurité JWT (générez une chaîne aléatoire longue)
|
|
JWT_SECRET=CHANGEZ_CECI_PAR_UNE_CHAINE_ALEATOIRE_TRES_LONGUE_ET_SECURISEE
|
|
|
|
# Configuration de l'application
|
|
NODE_ENV=production
|
|
VITE_APP_TITLE=Formation Manager Itinova
|
|
VITE_APP_LOGO=/logo.svg
|
|
|
|
# Email (optionnel - pour Resend)
|
|
RESEND_API_KEY=
|
|
RESEND_FROM_EMAIL=
|
|
|
|
# Port de l'application (par défaut 3000)
|
|
PORT=3000
|
|
```
|
|
|
|
**Générer un JWT_SECRET sécurisé :**
|
|
|
|
```bash
|
|
openssl rand -base64 64
|
|
```
|
|
|
|
Copiez le résultat dans `JWT_SECRET`.
|
|
|
|
### 4.2 Sécuriser le fichier .env
|
|
|
|
```bash
|
|
chmod 600 /var/www/formation-manager-itinova/.env
|
|
```
|
|
|
|
### 4.3 Initialiser la base de données
|
|
|
|
```bash
|
|
cd /var/www/formation-manager-itinova
|
|
pnpm db:push
|
|
```
|
|
|
|
Cette commande va créer toutes les tables nécessaires.
|
|
|
|
---
|
|
|
|
## Étape 5 : Compilation de l'application
|
|
|
|
### 5.1 Compiler le frontend et le backend
|
|
|
|
```bash
|
|
cd /var/www/formation-manager-itinova
|
|
pnpm build
|
|
```
|
|
|
|
### 5.2 Vérifier que la compilation a réussi
|
|
|
|
```bash
|
|
ls -la /var/www/formation-manager-itinova/dist/
|
|
```
|
|
|
|
Vous devriez voir un fichier `index.js`.
|
|
|
|
---
|
|
|
|
## Étape 6 : Configuration du service systemd
|
|
|
|
### 6.1 Créer le fichier de service
|
|
|
|
```bash
|
|
sudo nano /etc/systemd/system/formation-manager.service
|
|
```
|
|
|
|
**Contenu du fichier :**
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Formation Manager Itinova
|
|
After=network.target mysql.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=www-data
|
|
WorkingDirectory=/var/www/formation-manager-itinova
|
|
Environment="NODE_ENV=production"
|
|
Environment="HOME=/var/www/formation-manager-itinova"
|
|
Environment="PNPM_HOME=/var/www/formation-manager-itinova/.pnpm"
|
|
EnvironmentFile=/var/www/formation-manager-itinova/.env
|
|
ExecStart=/usr/bin/pnpm start
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
### 6.2 Configurer les permissions
|
|
|
|
```bash
|
|
sudo chown -R www-data:www-data /var/www/formation-manager-itinova
|
|
sudo mkdir -p /var/www/.local/share/pnpm
|
|
sudo chown -R www-data:www-data /var/www/.local
|
|
```
|
|
|
|
### 6.3 Activer et démarrer le service
|
|
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable formation-manager
|
|
sudo systemctl start formation-manager
|
|
```
|
|
|
|
### 6.4 Vérifier le statut
|
|
|
|
```bash
|
|
sudo systemctl status formation-manager
|
|
```
|
|
|
|
### 6.5 Voir les logs
|
|
|
|
```bash
|
|
sudo journalctl -u formation-manager -f
|
|
```
|
|
|
|
---
|
|
|
|
## Étape 7 : Configuration de Nginx (optionnel mais recommandé)
|
|
|
|
### 7.1 Installer Nginx
|
|
|
|
```bash
|
|
sudo apt install -y nginx
|
|
```
|
|
|
|
### 7.2 Créer la configuration du site
|
|
|
|
```bash
|
|
sudo nano /etc/nginx/sites-available/formation-manager
|
|
```
|
|
|
|
**Contenu du fichier :**
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name votre-domaine.com; # Changez par votre domaine
|
|
|
|
# Logs
|
|
access_log /var/log/nginx/formation-manager-access.log;
|
|
error_log /var/log/nginx/formation-manager-error.log;
|
|
|
|
# Proxy vers l'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;
|
|
}
|
|
}
|
|
```
|
|
|
|
### 7.3 Activer le site
|
|
|
|
```bash
|
|
sudo ln -s /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/
|
|
sudo nginx -t
|
|
sudo systemctl restart nginx
|
|
```
|
|
|
|
### 7.4 Configurer le pare-feu
|
|
|
|
```bash
|
|
sudo ufw allow 'Nginx Full'
|
|
sudo ufw allow OpenSSH
|
|
sudo ufw enable
|
|
```
|
|
|
|
---
|
|
|
|
## Étape 8 : Configuration HTTPS avec Let's Encrypt (recommandé)
|
|
|
|
### 8.1 Installer Certbot
|
|
|
|
```bash
|
|
sudo apt install -y certbot python3-certbot-nginx
|
|
```
|
|
|
|
### 8.2 Obtenir un certificat SSL
|
|
|
|
```bash
|
|
sudo certbot --nginx -d votre-domaine.com
|
|
```
|
|
|
|
Suivez les instructions à l'écran.
|
|
|
|
### 8.3 Renouvellement automatique
|
|
|
|
```bash
|
|
sudo systemctl status certbot.timer
|
|
```
|
|
|
|
Le renouvellement est automatique.
|
|
|
|
---
|
|
|
|
## Étape 9 : Créer le premier utilisateur administrateur
|
|
|
|
### 9.1 Se connecter à MySQL
|
|
|
|
```bash
|
|
mysql -u formation_user -p formation_manager
|
|
```
|
|
|
|
### 9.2 Créer un utilisateur admin
|
|
|
|
```sql
|
|
-- Générer un hash bcrypt pour le mot de passe "admin123" (à changer immédiatement)
|
|
-- Hash bcrypt de "admin123" : $2b$10$rKZhVJQX7mEWQxGqF8vQZOQxqxqxqxqxqxqxqxqxqxqxqxqxqxqxq
|
|
|
|
INSERT INTO users (email, password, name, role, emailVerified, isActive, createdAt, updatedAt, lastSignedIn)
|
|
VALUES (
|
|
'admin@itinova.org',
|
|
'$2b$10$N9qo8uLOickgx2ZMRZoMye7FRNv8va91kpMQH6.OfzrcBizxDbvSK', -- Mot de passe: admin123
|
|
'Administrateur',
|
|
'admin',
|
|
TRUE,
|
|
TRUE,
|
|
NOW(),
|
|
NOW(),
|
|
NOW()
|
|
);
|
|
|
|
EXIT;
|
|
```
|
|
|
|
**⚠️ IMPORTANT** : Changez le mot de passe immédiatement après la première connexion !
|
|
|
|
---
|
|
|
|
## Étape 10 : Vérification et tests
|
|
|
|
### 10.1 Accéder à l'application
|
|
|
|
Ouvrez votre navigateur et accédez à :
|
|
- **HTTP** : `http://votre-domaine.com`
|
|
- **HTTPS** : `https://votre-domaine.com`
|
|
|
|
### 10.2 Se connecter
|
|
|
|
- **Email** : `admin@itinova.org`
|
|
- **Mot de passe** : `admin123`
|
|
|
|
### 10.3 Changer le mot de passe
|
|
|
|
1. Connectez-vous
|
|
2. Allez dans "Utilisateurs"
|
|
3. Modifiez votre profil
|
|
4. Changez le mot de passe
|
|
|
|
---
|
|
|
|
## Maintenance
|
|
|
|
### Voir les logs
|
|
|
|
```bash
|
|
sudo journalctl -u formation-manager -f
|
|
```
|
|
|
|
### Redémarrer l'application
|
|
|
|
```bash
|
|
sudo systemctl restart formation-manager
|
|
```
|
|
|
|
### Mettre à jour l'application
|
|
|
|
```bash
|
|
cd /var/www/formation-manager-itinova
|
|
git pull # Si vous utilisez Git
|
|
pnpm install
|
|
pnpm build
|
|
sudo systemctl restart formation-manager
|
|
```
|
|
|
|
### Sauvegarder la base de données
|
|
|
|
```bash
|
|
mysqldump -u formation_user -p formation_manager > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
```
|
|
|
|
### Restaurer la base de données
|
|
|
|
```bash
|
|
mysql -u formation_user -p formation_manager < backup_YYYYMMDD_HHMMSS.sql
|
|
```
|
|
|
|
---
|
|
|
|
## Dépannage
|
|
|
|
### L'application ne démarre pas
|
|
|
|
1. Vérifier les logs :
|
|
```bash
|
|
sudo journalctl -u formation-manager -n 100 --no-pager
|
|
```
|
|
|
|
2. Vérifier que le fichier .env existe et est correct :
|
|
```bash
|
|
cat /var/www/formation-manager-itinova/.env
|
|
```
|
|
|
|
3. Vérifier que la base de données est accessible :
|
|
```bash
|
|
mysql -u formation_user -p formation_manager
|
|
```
|
|
|
|
### Erreur de permissions
|
|
|
|
```bash
|
|
sudo chown -R www-data:www-data /var/www/formation-manager-itinova
|
|
sudo mkdir -p /var/www/.local/share/pnpm
|
|
sudo chown -R www-data:www-data /var/www/.local
|
|
```
|
|
|
|
### Erreur "drizzle-kit: not found"
|
|
|
|
```bash
|
|
cd /var/www/formation-manager-itinova
|
|
pnpm install
|
|
```
|
|
|
|
### Port 3000 déjà utilisé
|
|
|
|
Modifiez le port dans `.env` :
|
|
```env
|
|
PORT=3001
|
|
```
|
|
|
|
Puis redémarrez :
|
|
```bash
|
|
sudo systemctl restart formation-manager
|
|
```
|
|
|
|
---
|
|
|
|
## Sécurité
|
|
|
|
### Recommandations
|
|
|
|
1. **Changez immédiatement le mot de passe admin par défaut**
|
|
2. **Utilisez HTTPS** (Let's Encrypt gratuit)
|
|
3. **Configurez un pare-feu** (ufw)
|
|
4. **Mettez à jour régulièrement** le système et l'application
|
|
5. **Sauvegardez régulièrement** la base de données
|
|
6. **Limitez l'accès SSH** (clés SSH, désactiver root login)
|
|
7. **Surveillez les logs** régulièrement
|
|
|
|
### Sauvegardes automatiques
|
|
|
|
Créez un script de sauvegarde :
|
|
|
|
```bash
|
|
sudo nano /usr/local/bin/backup-formation-manager.sh
|
|
```
|
|
|
|
Contenu :
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
BACKUP_DIR="/var/backups/formation-manager"
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
# Sauvegarder la base de données
|
|
mysqldump -u formation_user -p'VOTRE_MOT_DE_PASSE' formation_manager > $BACKUP_DIR/db_$DATE.sql
|
|
|
|
# Compresser
|
|
gzip $BACKUP_DIR/db_$DATE.sql
|
|
|
|
# Garder seulement les 30 derniers jours
|
|
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +30 -delete
|
|
|
|
echo "Sauvegarde terminée : $BACKUP_DIR/db_$DATE.sql.gz"
|
|
```
|
|
|
|
Rendre exécutable :
|
|
|
|
```bash
|
|
sudo chmod +x /usr/local/bin/backup-formation-manager.sh
|
|
```
|
|
|
|
Ajouter au cron (tous les jours à 2h du matin) :
|
|
|
|
```bash
|
|
sudo crontab -e
|
|
```
|
|
|
|
Ajouter :
|
|
|
|
```
|
|
0 2 * * * /usr/local/bin/backup-formation-manager.sh >> /var/log/backup-formation-manager.log 2>&1
|
|
```
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
Pour toute question ou problème :
|
|
|
|
1. Consultez les logs : `sudo journalctl -u formation-manager -f`
|
|
2. Vérifiez la documentation : `/var/www/formation-manager-itinova/README.md`
|
|
3. Contactez le support technique
|
|
|
|
---
|
|
|
|
## Annexe : Commandes utiles
|
|
|
|
```bash
|
|
# Statut du service
|
|
sudo systemctl status formation-manager
|
|
|
|
# Démarrer le service
|
|
sudo systemctl start formation-manager
|
|
|
|
# Arrêter le service
|
|
sudo systemctl stop formation-manager
|
|
|
|
# Redémarrer le service
|
|
sudo systemctl restart formation-manager
|
|
|
|
# Voir les logs en temps réel
|
|
sudo journalctl -u formation-manager -f
|
|
|
|
# Voir les 100 dernières lignes de logs
|
|
sudo journalctl -u formation-manager -n 100 --no-pager
|
|
|
|
# Tester la connexion à la base de données
|
|
mysql -u formation_user -p formation_manager
|
|
|
|
# Vérifier la configuration Nginx
|
|
sudo nginx -t
|
|
|
|
# Recharger Nginx
|
|
sudo systemctl reload nginx
|
|
|
|
# Vérifier l'utilisation des ressources
|
|
htop
|
|
|
|
# Vérifier l'espace disque
|
|
df -h
|
|
|
|
# Vérifier les processus Node.js
|
|
ps aux | grep node
|
|
```
|
|
|
|
---
|
|
|
|
**Fin du guide de déploiement**
|