#!/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-itinova" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SERVICE_NAME="formation-manager-itinova" 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 ""