Checkpoint: Ajout des scripts de mise à jour pour le serveur VPS :

1. **backup-before-update.sh** : Script de sauvegarde automatique
   - Sauvegarde complète des fichiers de l'application
   - Export de la base de données MySQL
   - Sauvegarde du fichier .env
   - Conservation des 10 dernières sauvegardes

2. **update-app.sh** : Script de mise à jour automatique
   - Création d'une sauvegarde de sécurité
   - Arrêt/redémarrage du service
   - Copie des nouveaux fichiers
   - Installation des dépendances
   - Application des migrations de base de données
   - Vérification du bon fonctionnement

3. **create-deployment-package.sh** : Script de création de package
   - Crée une archive .tar.gz prête à transférer
   - Inclut tous les fichiers nécessaires
   - Exclut node_modules, .git, .env

4. **Documentation complète** :
   - GUIDE_MISE_A_JOUR.md : Guide détaillé avec procédures de mise à jour et rollback
   - README.md : Documentation des scripts avec exemples d'utilisation

5. **Package de déploiement créé** :
   - formation-manager-update-20251127_074417.tar.gz (2.6M)
   - Prêt à être transféré sur le serveur VPS
This commit is contained in:
Manus Sandbox
2025-11-27 07:46:29 -05:00
parent 3647443898
commit 2ae8592480
7 changed files with 1110 additions and 0 deletions

View File

@@ -0,0 +1,298 @@
# Guide de Mise à Jour - Formation Manager Itinova
## 📋 Vue d'ensemble
Ce guide explique comment mettre à jour l'application Formation Manager Itinova sur votre serveur VPS.
## ⚠️ Avant de commencer
### Prérequis
- Accès SSH au serveur VPS
- Droits sudo/root
- L'application doit être déjà installée et fonctionnelle
- Connexion à la base de données MySQL/TiDB
### Informations importantes
- **Temps d'arrêt estimé**: 5-10 minutes
- **Sauvegarde automatique**: Oui (10 dernières sauvegardes conservées)
- **Rollback possible**: Oui (via les sauvegardes)
## 🚀 Méthode 1: Mise à jour automatique (Recommandée)
### Étape 1: Télécharger les fichiers de mise à jour
Téléchargez le package de mise à jour depuis Manus et transférez-le sur votre serveur:
```bash
# Sur votre machine locale
scp formation-manager-update.tar.gz user@votre-serveur:/tmp/
# Ou utilisez SFTP/WinSCP pour transférer le fichier
```
### Étape 2: Extraire le package
```bash
# Se connecter au serveur
ssh user@votre-serveur
# Extraire le package
cd /tmp
tar -xzf formation-manager-update.tar.gz
cd formation-manager-itinova
```
### Étape 3: Rendre les scripts exécutables
```bash
chmod +x deployment-scripts/*.sh
```
### Étape 4: Lancer la mise à jour
```bash
sudo ./deployment-scripts/update-app.sh
```
Le script va automatiquement:
1. ✅ Créer une sauvegarde complète
2. ✅ Arrêter le service
3. ✅ Sauvegarder la configuration (.env)
4. ✅ Copier les nouveaux fichiers
5. ✅ Restaurer la configuration
6. ✅ Installer les dépendances
7. ✅ Appliquer les migrations de base de données
8. ✅ Construire l'application
9. ✅ Redémarrer le service
### Étape 5: Vérifier le bon fonctionnement
```bash
# Vérifier le statut du service
sudo systemctl status formation-manager
# Voir les logs en temps réel
sudo journalctl -u formation-manager -f
# Tester l'application dans le navigateur
# Ouvrir: http://votre-domaine.com
```
## 🔧 Méthode 2: Mise à jour manuelle
Si vous préférez contrôler chaque étape:
### 1. Créer une sauvegarde
```bash
sudo ./deployment-scripts/backup-before-update.sh
```
### 2. Arrêter le service
```bash
sudo systemctl stop formation-manager
```
### 3. Sauvegarder la configuration
```bash
sudo cp /var/www/formation-manager/.env /tmp/.env.backup
```
### 4. Copier les nouveaux fichiers
```bash
cd /var/www/formation-manager
sudo find . -mindepth 1 -maxdepth 1 ! -name '.env' ! -name 'node_modules' -exec rm -rf {} +
sudo cp -r /tmp/formation-manager-itinova/* .
```
### 5. Restaurer la configuration
```bash
sudo cp /tmp/.env.backup /var/www/formation-manager/.env
```
### 6. Installer les dépendances
```bash
cd /var/www/formation-manager
sudo pnpm install --prod
```
### 7. Appliquer les migrations
```bash
sudo pnpm db:push
```
### 8. Redémarrer le service
```bash
sudo systemctl start formation-manager
sudo systemctl status formation-manager
```
## 🔄 Restauration d'une sauvegarde (Rollback)
Si la mise à jour pose problème, vous pouvez restaurer une sauvegarde:
### 1. Lister les sauvegardes disponibles
```bash
ls -lh /var/backups/formation-manager/
```
### 2. Choisir une sauvegarde
```bash
# Exemple: backup_20240119_143022
BACKUP_DIR="/var/backups/formation-manager/backup_20240119_143022"
```
### 3. Arrêter le service
```bash
sudo systemctl stop formation-manager
```
### 4. Restaurer les fichiers
```bash
cd /var/www/formation-manager
sudo rm -rf *
sudo tar -xzf $BACKUP_DIR/app_files.tar.gz -C .
```
### 5. Restaurer la configuration
```bash
sudo cp $BACKUP_DIR/.env.backup /var/www/formation-manager/.env
```
### 6. Restaurer la base de données (optionnel)
```bash
# Extraire le dump SQL
gunzip -c $BACKUP_DIR/database.sql.gz > /tmp/restore.sql
# Restaurer dans MySQL
mysql -h HOST -u USER -p DATABASE < /tmp/restore.sql
# Nettoyer
rm /tmp/restore.sql
```
### 7. Redémarrer le service
```bash
sudo systemctl start formation-manager
sudo systemctl status formation-manager
```
## 📝 Nouveautés de cette version
### Corrections de bugs
-**Décalage horaire**: Les heures s'affichent maintenant correctement dans le formulaire d'édition des séquences (9h00 reste 9h00)
-**Menu navigation**: Ajout du menu latéral sur la page Import Excel
### Améliorations
-**Réorganisation**: Menu "Import Excel" déplacé dans la section Configuration pour une meilleure organisation
### Migrations de base de données
Aucune migration majeure dans cette version. Le script `pnpm db:push` synchronisera automatiquement le schéma.
## 🆘 Résolution de problèmes
### Le service ne démarre pas
```bash
# Voir les logs d'erreur
sudo journalctl -u formation-manager -n 100 --no-pager
# Vérifier les permissions
sudo chown -R www-data:www-data /var/www/formation-manager
sudo chmod -R 755 /var/www/formation-manager
sudo chmod 600 /var/www/formation-manager/.env
```
### Erreur de connexion à la base de données
```bash
# Vérifier le fichier .env
sudo cat /var/www/formation-manager/.env | grep DATABASE_URL
# Tester la connexion MySQL
mysql -h HOST -u USER -p -e "SELECT 1;"
```
### Port déjà utilisé
```bash
# Voir quel processus utilise le port 3000
sudo lsof -i :3000
# Tuer le processus si nécessaire
sudo kill -9 PID
```
### Problème de permissions
```bash
# Réinitialiser les permissions
cd /var/www/formation-manager
sudo chown -R www-data:www-data .
sudo chmod -R 755 .
sudo chmod 600 .env
```
## 📞 Support
En cas de problème:
1. **Vérifier les logs**: `sudo journalctl -u formation-manager -f`
2. **Consulter la documentation**: Voir les guides dans `/var/www/formation-manager/deployment-package/`
3. **Restaurer une sauvegarde**: Suivre la procédure de rollback ci-dessus
## ✅ Checklist post-mise à jour
- [ ] Le service est démarré: `sudo systemctl status formation-manager`
- [ ] L'application est accessible dans le navigateur
- [ ] La connexion fonctionne (test avec un utilisateur admin)
- [ ] Les séquences s'affichent correctement
- [ ] Le formulaire d'édition affiche les bonnes heures
- [ ] Le menu Import Excel est dans la section Configuration
- [ ] Les emails de confirmation fonctionnent (test d'inscription)
## 📊 Commandes utiles
```bash
# Voir les logs en temps réel
sudo journalctl -u formation-manager -f
# Redémarrer le service
sudo systemctl restart formation-manager
# Voir le statut
sudo systemctl status formation-manager
# Voir les dernières erreurs
sudo journalctl -u formation-manager -p err -n 50
# Espace disque
df -h
# Utilisation mémoire
free -h
# Processus Node.js
ps aux | grep node
```
---
**Date de création**: $(date +%Y-%m-%d)
**Version**: 36474438

View File

@@ -0,0 +1,344 @@
# Scripts de Déploiement - Formation Manager Itinova
## 📁 Contenu du répertoire
Ce répertoire contient tous les scripts nécessaires pour mettre à jour l'application sur votre serveur VPS.
### Scripts disponibles
| Script | Description | Usage |
|--------|-------------|-------|
| `backup-before-update.sh` | Crée une sauvegarde complète avant mise à jour | `sudo ./backup-before-update.sh` |
| `update-app.sh` | Met à jour automatiquement l'application | `sudo ./update-app.sh` |
| `create-deployment-package.sh` | Crée un package de déploiement | `./create-deployment-package.sh` |
### Documentation
| Fichier | Description |
|---------|-------------|
| `GUIDE_MISE_A_JOUR.md` | Guide complet de mise à jour avec instructions détaillées |
| `README.md` | Ce fichier |
## 🚀 Utilisation rapide
### Pour mettre à jour l'application sur le serveur
```bash
# 1. Rendre les scripts exécutables (une seule fois)
chmod +x *.sh
# 2. Lancer la mise à jour automatique
sudo ./update-app.sh
```
### Pour créer un package de déploiement
```bash
# Créer un package prêt à transférer
./create-deployment-package.sh
# Le package sera créé dans le répertoire parent
# Nom: formation-manager-update-YYYYMMDD_HHMMSS.tar.gz
```
## 📋 Workflow de mise à jour complet
### 1. Préparation (sur votre machine locale)
```bash
# Créer le package de déploiement
cd formation-manager-itinova/deployment-scripts
./create-deployment-package.sh
# Transférer sur le serveur
scp ../formation-manager-update-*.tar.gz user@serveur:/tmp/
```
### 2. Installation (sur le serveur)
```bash
# Se connecter au serveur
ssh user@serveur
# Extraire le package
cd /tmp
tar -xzf formation-manager-update-*.tar.gz
cd formation-manager-itinova
# Rendre les scripts exécutables
chmod +x deployment-scripts/*.sh
# Lancer la mise à jour
sudo ./deployment-scripts/update-app.sh
```
### 3. Vérification
```bash
# Vérifier le statut
sudo systemctl status formation-manager
# Voir les logs
sudo journalctl -u formation-manager -f
# Tester dans le navigateur
# Ouvrir: http://votre-domaine.com
```
## 🔧 Détails des scripts
### backup-before-update.sh
**Fonction**: Crée une sauvegarde complète de l'application et de la base de données
**Ce qu'il fait**:
- Sauvegarde tous les fichiers de l'application dans une archive .tar.gz
- Sauvegarde le fichier .env
- Exporte la base de données MySQL en SQL compressé
- Crée un fichier d'information sur la sauvegarde
- Conserve les 10 dernières sauvegardes (supprime les plus anciennes)
**Emplacement des sauvegardes**: `/var/backups/formation-manager/`
**Exemple d'utilisation**:
```bash
sudo ./backup-before-update.sh
```
**Sortie**:
```
=== Sauvegarde avant mise à jour ===
Date: 2024-01-19 14:30:22
Répertoire application: /var/www/formation-manager
Répertoire sauvegarde: /var/backups/formation-manager
Création du répertoire de sauvegarde...
Sauvegarde des fichiers de l'application...
✓ Fichiers de l'application sauvegardés
...
=== Sauvegarde terminée avec succès ===
Emplacement: /var/backups/formation-manager/backup_20240119_143022
Taille: 45M
```
### update-app.sh
**Fonction**: Met à jour automatiquement l'application sur le serveur
**Ce qu'il fait**:
1. Crée une sauvegarde de sécurité
2. Arrête le service
3. Sauvegarde la configuration (.env)
4. Copie les nouveaux fichiers
5. Restaure la configuration
6. Installe les dépendances (pnpm install)
7. Applique les migrations de base de données (pnpm db:push)
8. Construit l'application
9. Configure les permissions
10. Redémarre le service
11. Vérifie le bon fonctionnement
**Prérequis**:
- Exécuter avec sudo/root
- L'application doit être installée dans `/var/www/formation-manager`
- Le service doit s'appeler `formation-manager`
**Exemple d'utilisation**:
```bash
sudo ./update-app.sh
```
**Sortie**:
```
╔════════════════════════════════════════════════════════════╗
║ Mise à jour Formation Manager Itinova ║
╚════════════════════════════════════════════════════════════╝
Date: 2024-01-19 14:35:10
Répertoire: /var/www/formation-manager
Voulez-vous continuer avec la mise à jour ? [y/N]: y
▶ Étape 1/8: Création d'une sauvegarde de sécurité
────────────────────────────────────────────────────────────
...
╔════════════════════════════════════════════════════════════╗
║ Mise à jour terminée avec succès ! ║
╚════════════════════════════════════════════════════════════╝
```
### create-deployment-package.sh
**Fonction**: Crée un package de déploiement prêt à transférer
**Ce qu'il fait**:
- Copie tous les fichiers nécessaires (sauf node_modules, .git, .env)
- Inclut les scripts de déploiement
- Crée un fichier README_DEPLOIEMENT.txt avec les instructions
- Crée une archive .tar.gz compressée
**Exemple d'utilisation**:
```bash
./create-deployment-package.sh
```
**Sortie**:
```
╔════════════════════════════════════════════════════════════╗
║ Création du package de déploiement ║
╚════════════════════════════════════════════════════════════╝
Nettoyage du répertoire temporaire...
Création du répertoire temporaire...
Copie des fichiers du projet...
✓ Fichiers copiés
Création du fichier README...
✓ README créé
Création de l'archive...
╔════════════════════════════════════════════════════════════╗
║ Package créé avec succès ! ║
╚════════════════════════════════════════════════════════════╝
Fichier: formation-manager-update-20240119_143522.tar.gz
Emplacement: /home/ubuntu/formation-manager-itinova/formation-manager-update-20240119_143522.tar.gz
Taille: 2.3M
Prochaines étapes:
1. Transférer le package sur le serveur:
scp formation-manager-update-20240119_143522.tar.gz user@serveur:/tmp/
2. Suivre les instructions dans README_DEPLOIEMENT.txt
```
## 🔄 Restauration d'une sauvegarde
Si vous devez restaurer une sauvegarde après une mise à jour problématique:
```bash
# 1. Lister les sauvegardes
ls -lh /var/backups/formation-manager/
# 2. Arrêter le service
sudo systemctl stop formation-manager
# 3. Restaurer les fichiers
cd /var/www/formation-manager
sudo rm -rf *
sudo tar -xzf /var/backups/formation-manager/backup_YYYYMMDD_HHMMSS/app_files.tar.gz -C .
# 4. Restaurer .env
sudo cp /var/backups/formation-manager/backup_YYYYMMDD_HHMMSS/.env.backup .env
# 5. Restaurer la base de données (si nécessaire)
gunzip -c /var/backups/formation-manager/backup_YYYYMMDD_HHMMSS/database.sql.gz | mysql -h HOST -u USER -p DATABASE
# 6. Redémarrer
sudo systemctl start formation-manager
```
## 📝 Configuration
### Chemins par défaut
Les scripts utilisent ces chemins par défaut:
```bash
APP_DIR="/var/www/formation-manager" # Répertoire de l'application
BACKUP_DIR="/var/backups/formation-manager" # Répertoire des sauvegardes
SERVICE_NAME="formation-manager" # Nom du service systemd
```
### Personnalisation
Pour modifier ces chemins, éditez les variables au début de chaque script:
```bash
# Ouvrir le script
nano update-app.sh
# Modifier les variables
APP_DIR="/votre/chemin/personnalisé"
BACKUP_DIR="/votre/chemin/sauvegardes"
SERVICE_NAME="votre-service"
```
## ⚠️ Notes importantes
### Permissions
- Les scripts de mise à jour doivent être exécutés avec `sudo`
- Les scripts de création de package peuvent être exécutés en utilisateur normal
- Après mise à jour, les fichiers appartiennent à `www-data:www-data`
### Sauvegardes
- Les sauvegardes sont conservées dans `/var/backups/formation-manager/`
- Seules les 10 dernières sauvegardes sont conservées
- Chaque sauvegarde inclut: fichiers + .env + base de données
- Pensez à sauvegarder régulièrement les sauvegardes importantes ailleurs
### Base de données
- Les migrations sont appliquées automatiquement avec `pnpm db:push`
- La base de données est sauvegardée avant chaque mise à jour
- En cas de problème, restaurez la base depuis la sauvegarde
### Temps d'arrêt
- Le service est arrêté pendant la mise à jour (5-10 minutes)
- Planifiez la mise à jour pendant une période de faible activité
- Prévenez les utilisateurs à l'avance
## 🆘 Dépannage
### Le script ne s'exécute pas
```bash
# Vérifier les permissions
ls -l *.sh
# Rendre exécutable
chmod +x *.sh
```
### Erreur "Permission denied"
```bash
# Exécuter avec sudo
sudo ./update-app.sh
```
### Le service ne redémarre pas
```bash
# Voir les logs
sudo journalctl -u formation-manager -n 100
# Vérifier la configuration
sudo systemctl status formation-manager
# Vérifier les permissions
sudo chown -R www-data:www-data /var/www/formation-manager
```
### Erreur de base de données
```bash
# Vérifier la connexion
mysql -h HOST -u USER -p -e "SELECT 1;"
# Vérifier le fichier .env
cat /var/www/formation-manager/.env | grep DATABASE_URL
```
## 📞 Support
Pour plus d'informations, consultez:
- **Guide complet**: `GUIDE_MISE_A_JOUR.md`
- **Documentation de déploiement**: `../deployment-package/`
---
**Version**: 36474438
**Dernière mise à jour**: $(date +%Y-%m-%d)

View File

@@ -0,0 +1,132 @@
#!/bin/bash
###############################################################################
# Script de sauvegarde avant mise à jour
# Formation Manager Itinova
#
# Ce script crée une sauvegarde complète de l'application et de la base de données
# avant d'effectuer une mise à jour
###############################################################################
set -e # Arrêter en cas d'erreur
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration
APP_DIR="/var/www/formation-manager"
BACKUP_DIR="/var/backups/formation-manager"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${TIMESTAMP}"
echo -e "${GREEN}=== Sauvegarde avant mise à jour ===${NC}"
echo "Date: $(date)"
echo "Répertoire application: $APP_DIR"
echo "Répertoire sauvegarde: $BACKUP_DIR"
echo ""
# Créer le répertoire de sauvegarde s'il n'existe pas
echo -e "${YELLOW}Création du répertoire de sauvegarde...${NC}"
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"
# 1. Sauvegarder les fichiers de l'application
echo -e "${YELLOW}Sauvegarde des fichiers de l'application...${NC}"
if [ -d "$APP_DIR" ]; then
tar -czf "$BACKUP_DIR/$BACKUP_NAME/app_files.tar.gz" -C "$APP_DIR" .
echo -e "${GREEN}✓ Fichiers de l'application sauvegardés${NC}"
else
echo -e "${RED}✗ Répertoire application introuvable: $APP_DIR${NC}"
exit 1
fi
# 2. Sauvegarder le fichier .env
echo -e "${YELLOW}Sauvegarde du fichier .env...${NC}"
if [ -f "$APP_DIR/.env" ]; then
cp "$APP_DIR/.env" "$BACKUP_DIR/$BACKUP_NAME/.env.backup"
echo -e "${GREEN}✓ Fichier .env sauvegardé${NC}"
else
echo -e "${YELLOW}⚠ Fichier .env introuvable (peut être normal)${NC}"
fi
# 3. Sauvegarder la base de données MySQL
echo -e "${YELLOW}Sauvegarde de la base de données...${NC}"
# Lire les informations de connexion depuis .env
if [ -f "$APP_DIR/.env" ]; then
# Extraire l'URL de la base de données
DB_URL=$(grep "^DATABASE_URL=" "$APP_DIR/.env" | cut -d '=' -f2- | tr -d '"' | tr -d "'")
if [ -n "$DB_URL" ]; then
# Parser l'URL de connexion MySQL
# Format: mysql://user:password@host:port/database
DB_USER=$(echo $DB_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p')
DB_PASS=$(echo $DB_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p')
DB_HOST=$(echo $DB_URL | sed -n 's/.*@\([^:\/]*\).*/\1/p')
DB_NAME=$(echo $DB_URL | sed -n 's/.*\/\([^?]*\).*/\1/p')
DB_PORT=$(echo $DB_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p')
# Port par défaut si non spécifié
if [ -z "$DB_PORT" ]; then
DB_PORT="3306"
fi
echo "Base de données: $DB_NAME sur $DB_HOST:$DB_PORT"
# Exporter la base de données
mysqldump -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/$BACKUP_NAME/database.sql"
# Compresser le dump SQL
gzip "$BACKUP_DIR/$BACKUP_NAME/database.sql"
echo -e "${GREEN}✓ Base de données sauvegardée${NC}"
else
echo -e "${YELLOW}⚠ DATABASE_URL non trouvée dans .env${NC}"
fi
else
echo -e "${YELLOW}⚠ Impossible de sauvegarder la base de données (fichier .env introuvable)${NC}"
fi
# 4. Créer un fichier d'information sur la sauvegarde
echo -e "${YELLOW}Création du fichier d'information...${NC}"
cat > "$BACKUP_DIR/$BACKUP_NAME/backup_info.txt" << EOF
Sauvegarde Formation Manager Itinova
====================================
Date de création: $(date)
Timestamp: $TIMESTAMP
Répertoire source: $APP_DIR
Contenu de la sauvegarde:
- app_files.tar.gz: Tous les fichiers de l'application
- .env.backup: Fichier de configuration (si présent)
- database.sql.gz: Dump de la base de données MySQL (si disponible)
Pour restaurer cette sauvegarde:
1. Arrêter le service: sudo systemctl stop formation-manager
2. Extraire les fichiers: tar -xzf app_files.tar.gz -C $APP_DIR
3. Restaurer .env: cp .env.backup $APP_DIR/.env
4. Restaurer la base: gunzip -c database.sql.gz | mysql -u USER -p DATABASE
5. Redémarrer: sudo systemctl start formation-manager
EOF
echo -e "${GREEN}✓ Fichier d'information créé${NC}"
# 5. Calculer la taille de la sauvegarde
BACKUP_SIZE=$(du -sh "$BACKUP_DIR/$BACKUP_NAME" | cut -f1)
echo ""
echo -e "${GREEN}=== Sauvegarde terminée avec succès ===${NC}"
echo "Emplacement: $BACKUP_DIR/$BACKUP_NAME"
echo "Taille: $BACKUP_SIZE"
echo ""
# 6. Nettoyer les anciennes sauvegardes (garder les 10 dernières)
echo -e "${YELLOW}Nettoyage des anciennes sauvegardes...${NC}"
cd "$BACKUP_DIR"
ls -t | tail -n +11 | xargs -r rm -rf
echo -e "${GREEN}✓ Anciennes sauvegardes nettoyées (conservation des 10 dernières)${NC}"
echo ""
echo -e "${GREEN}Sauvegarde prête pour la mise à jour !${NC}"

View File

@@ -0,0 +1,151 @@
#!/bin/bash
###############################################################################
# Script de création du package de déploiement
# Formation Manager Itinova
#
# Ce script crée une archive complète prête à être transférée sur le serveur
###############################################################################
set -e # Arrêter en cas d'erreur
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PACKAGE_NAME="formation-manager-update-$(date +%Y%m%d_%H%M%S).tar.gz"
TEMP_DIR="/tmp/formation-manager-package"
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Création du package de déploiement ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
# Nettoyer le répertoire temporaire s'il existe
if [ -d "$TEMP_DIR" ]; then
echo -e "${YELLOW}Nettoyage du répertoire temporaire...${NC}"
rm -rf "$TEMP_DIR"
fi
# Créer le répertoire temporaire
echo -e "${YELLOW}Création du répertoire temporaire...${NC}"
mkdir -p "$TEMP_DIR"
# Copier les fichiers du projet
echo -e "${YELLOW}Copie des fichiers du projet...${NC}"
cd "$PROJECT_DIR"
# Copier tous les fichiers sauf les exclusions
cp -r . "$TEMP_DIR/"
# Supprimer les répertoires/fichiers à exclure
cd "$TEMP_DIR"
rm -rf node_modules .git .env .env.local dist build .next coverage .vscode .idea
find . -name '*.log' -delete
find . -name '.DS_Store' -delete
cd "$PROJECT_DIR"
echo -e "${GREEN}✓ Fichiers copiés${NC}"
# Créer un fichier README pour le package
echo -e "${YELLOW}Création du fichier README...${NC}"
cat > "$TEMP_DIR/README_DEPLOIEMENT.txt" << 'EOF'
╔════════════════════════════════════════════════════════════╗
║ Package de Mise à Jour - Formation Manager Itinova ║
╚════════════════════════════════════════════════════════════╝
CONTENU DU PACKAGE
==================
1. deployment-scripts/
- update-app.sh: Script de mise à jour automatique
- backup-before-update.sh: Script de sauvegarde
- GUIDE_MISE_A_JOUR.md: Guide complet de mise à jour
2. Fichiers de l'application
- Tous les fichiers source nécessaires
- Configuration package.json
- Schéma de base de données
INSTALLATION RAPIDE
===================
1. Transférer ce package sur le serveur:
scp formation-manager-update-*.tar.gz user@serveur:/tmp/
2. Se connecter au serveur:
ssh user@serveur
3. Extraire le package:
cd /tmp
tar -xzf formation-manager-update-*.tar.gz
cd formation-manager-itinova
4. Rendre les scripts exécutables:
chmod +x deployment-scripts/*.sh
5. Lancer la mise à jour:
sudo ./deployment-scripts/update-app.sh
IMPORTANT
=========
- Le script créera automatiquement une sauvegarde avant la mise à jour
- Le service sera arrêté pendant 5-10 minutes
- La configuration (.env) sera préservée
- Les migrations de base de données seront appliquées automatiquement
DOCUMENTATION
=============
Consultez le guide complet dans:
deployment-scripts/GUIDE_MISE_A_JOUR.md
SUPPORT
=======
En cas de problème:
1. Vérifier les logs: sudo journalctl -u formation-manager -f
2. Consulter le guide de dépannage dans GUIDE_MISE_A_JOUR.md
3. Restaurer une sauvegarde si nécessaire
Version: 36474438
Date: $(date)
EOF
echo -e "${GREEN}✓ README créé${NC}"
# Créer l'archive
echo -e "${YELLOW}Création de l'archive...${NC}"
cd /tmp
tar -czf "$PACKAGE_NAME" formation-manager-package/
# Déplacer l'archive dans le répertoire du projet
mv "$PACKAGE_NAME" "$PROJECT_DIR/"
# Nettoyer
rm -rf "$TEMP_DIR"
# Calculer la taille
PACKAGE_SIZE=$(du -sh "$PROJECT_DIR/$PACKAGE_NAME" | cut -f1)
echo ""
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}${GREEN}Package créé avec succès !${BLUE}${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}Fichier:${NC} $PACKAGE_NAME"
echo -e "${GREEN}Emplacement:${NC} $PROJECT_DIR/$PACKAGE_NAME"
echo -e "${GREEN}Taille:${NC} $PACKAGE_SIZE"
echo ""
echo -e "${YELLOW}Prochaines étapes:${NC}"
echo "1. Transférer le package sur le serveur:"
echo " ${BLUE}scp $PACKAGE_NAME user@serveur:/tmp/${NC}"
echo ""
echo "2. Suivre les instructions dans README_DEPLOIEMENT.txt"
echo ""

178
deployment-scripts/update-app.sh Executable file
View File

@@ -0,0 +1,178 @@
#!/bin/bash
###############################################################################
# Script de mise à jour automatique
# Formation Manager Itinova
#
# Ce script met à jour l'application sur le serveur VPS
###############################################################################
set -e # Arrêter en cas d'erreur
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
APP_DIR="/var/www/formation-manager"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICE_NAME="formation-manager"
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Mise à jour Formation Manager Itinova ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo "Date: $(date)"
echo "Répertoire: $APP_DIR"
echo ""
# Vérifier que le script est exécuté en tant que root ou avec sudo
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}✗ Ce script doit être exécuté en tant que root ou avec sudo${NC}"
exit 1
fi
# Fonction pour afficher une étape
step() {
echo ""
echo -e "${BLUE}$1${NC}"
echo "────────────────────────────────────────────────────────────"
}
# Fonction pour confirmer
confirm() {
read -p "$(echo -e ${YELLOW}$1 [y/N]: ${NC})" -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${RED}Mise à jour annulée${NC}"
exit 1
fi
}
# 1. Confirmation
confirm "Voulez-vous continuer avec la mise à jour ?"
# 2. Créer une sauvegarde
step "Étape 1/8: Création d'une sauvegarde de sécurité"
if [ -f "$SCRIPT_DIR/backup-before-update.sh" ]; then
bash "$SCRIPT_DIR/backup-before-update.sh"
else
echo -e "${YELLOW}⚠ Script de sauvegarde introuvable, sauvegarde manuelle recommandée${NC}"
confirm "Continuer sans sauvegarde automatique ?"
fi
# 3. Arrêter le service
step "Étape 2/8: Arrêt du service"
if systemctl is-active --quiet $SERVICE_NAME; then
systemctl stop $SERVICE_NAME
echo -e "${GREEN}✓ Service arrêté${NC}"
else
echo -e "${YELLOW}⚠ Service déjà arrêté${NC}"
fi
# 4. Sauvegarder le fichier .env
step "Étape 3/8: Sauvegarde de la configuration"
if [ -f "$APP_DIR/.env" ]; then
cp "$APP_DIR/.env" "/tmp/.env.backup"
echo -e "${GREEN}✓ Configuration sauvegardée dans /tmp/.env.backup${NC}"
else
echo -e "${YELLOW}⚠ Fichier .env introuvable${NC}"
fi
# 5. Copier les nouveaux fichiers
step "Étape 4/8: Copie des nouveaux fichiers"
if [ -d "$SCRIPT_DIR/../" ]; then
# Supprimer les anciens fichiers (sauf .env et node_modules)
cd "$APP_DIR"
find . -mindepth 1 -maxdepth 1 ! -name '.env' ! -name 'node_modules' ! -name '.git' -exec rm -rf {} +
# Copier les nouveaux fichiers
cp -r "$SCRIPT_DIR/../"* "$APP_DIR/"
cp -r "$SCRIPT_DIR/../".* "$APP_DIR/" 2>/dev/null || true
echo -e "${GREEN}✓ Nouveaux fichiers copiés${NC}"
else
echo -e "${RED}✗ Répertoire source introuvable${NC}"
exit 1
fi
# 6. Restaurer le fichier .env
step "Étape 5/8: Restauration de la configuration"
if [ -f "/tmp/.env.backup" ]; then
cp "/tmp/.env.backup" "$APP_DIR/.env"
rm "/tmp/.env.backup"
echo -e "${GREEN}✓ Configuration restaurée${NC}"
else
echo -e "${YELLOW}⚠ Pas de configuration à restaurer${NC}"
fi
# 7. Installer les dépendances
step "Étape 6/8: Installation des dépendances"
cd "$APP_DIR"
# Vérifier si pnpm est installé
if ! command -v pnpm &> /dev/null; then
echo -e "${YELLOW}Installation de pnpm...${NC}"
npm install -g pnpm
fi
echo "Installation des dépendances..."
pnpm install --prod
echo -e "${GREEN}✓ Dépendances installées${NC}"
# 8. Appliquer les migrations de base de données
step "Étape 7/8: Application des migrations de base de données"
echo "Synchronisation du schéma de base de données..."
pnpm db:push
echo -e "${GREEN}✓ Migrations appliquées${NC}"
# 9. Construire l'application
step "Étape 8/8: Construction de l'application"
echo "Construction du client..."
cd "$APP_DIR"
pnpm run build 2>/dev/null || echo -e "${YELLOW}⚠ Pas de build client nécessaire${NC}"
echo -e "${GREEN}✓ Application construite${NC}"
# 10. Définir les permissions correctes
echo ""
echo -e "${YELLOW}Configuration des permissions...${NC}"
chown -R www-data:www-data "$APP_DIR"
chmod -R 755 "$APP_DIR"
chmod 600 "$APP_DIR/.env" 2>/dev/null || true
echo -e "${GREEN}✓ Permissions configurées${NC}"
# 11. Redémarrer le service
echo ""
echo -e "${YELLOW}Redémarrage du service...${NC}"
systemctl start $SERVICE_NAME
sleep 3
# Vérifier que le service a bien démarré
if systemctl is-active --quiet $SERVICE_NAME; then
echo -e "${GREEN}✓ Service démarré avec succès${NC}"
else
echo -e "${RED}✗ Erreur lors du démarrage du service${NC}"
echo "Vérifier les logs avec: sudo journalctl -u $SERVICE_NAME -n 50"
exit 1
fi
# 12. Vérifier le statut
echo ""
systemctl status $SERVICE_NAME --no-pager
# Résumé final
echo ""
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}${GREEN}Mise à jour terminée avec succès !${BLUE}${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${GREEN}L'application est maintenant à jour et en cours d'exécution.${NC}"
echo ""
echo "Commandes utiles:"
echo " • Voir les logs: sudo journalctl -u $SERVICE_NAME -f"
echo " • Redémarrer: sudo systemctl restart $SERVICE_NAME"
echo " • Statut: sudo systemctl status $SERVICE_NAME"
echo ""

Binary file not shown.

View File

@@ -707,3 +707,10 @@
- [x] Déplacer "Import Excel" du bloc GESTION vers le bloc CONFIGURATION
- [x] Vérifier l'affichage dans le menu de navigation
## Scripts de mise à jour VPS
- [x] Créer le script de mise à jour automatique (update-app.sh)
- [x] Créer le script de sauvegarde avant mise à jour (backup-before-update.sh)
- [x] Créer la documentation de mise à jour (GUIDE_MISE_A_JOUR.md)
- [x] Créer le package de déploiement complet (formation-manager-update-*.tar.gz)