Checkpoint: Migration OAuth Manus vers authentification locale (80% complété) - Pages login/register créées, backend JWT implémenté, guides de déploiement ajoutés. Reste à corriger les doublons dans db.ts et finaliser AdminUsers.
This commit is contained in:
600
GUIDE_DEPLOIEMENT_LINUX.md
Normal file
600
GUIDE_DEPLOIEMENT_LINUX.md
Normal file
@@ -0,0 +1,600 @@
|
||||
# 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**
|
||||
Reference in New Issue
Block a user