diff --git a/deployment-scripts/GUIDE_MISE_A_JOUR.md b/deployment-scripts/GUIDE_MISE_A_JOUR.md new file mode 100644 index 0000000..e71e490 --- /dev/null +++ b/deployment-scripts/GUIDE_MISE_A_JOUR.md @@ -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 diff --git a/deployment-scripts/README.md b/deployment-scripts/README.md new file mode 100644 index 0000000..fd485f4 --- /dev/null +++ b/deployment-scripts/README.md @@ -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) diff --git a/deployment-scripts/backup-before-update.sh b/deployment-scripts/backup-before-update.sh new file mode 100755 index 0000000..9f3a466 --- /dev/null +++ b/deployment-scripts/backup-before-update.sh @@ -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}" diff --git a/deployment-scripts/create-deployment-package.sh b/deployment-scripts/create-deployment-package.sh new file mode 100755 index 0000000..299d400 --- /dev/null +++ b/deployment-scripts/create-deployment-package.sh @@ -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 "" diff --git a/deployment-scripts/update-app.sh b/deployment-scripts/update-app.sh new file mode 100755 index 0000000..ab86b63 --- /dev/null +++ b/deployment-scripts/update-app.sh @@ -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 "" diff --git a/formation-manager-update-20251127_074417.tar.gz b/formation-manager-update-20251127_074417.tar.gz new file mode 100644 index 0000000..d2871b9 Binary files /dev/null and b/formation-manager-update-20251127_074417.tar.gz differ diff --git a/todo.md b/todo.md index 03af6a5..3acf7eb 100644 --- a/todo.md +++ b/todo.md @@ -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)