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:
178
deployment-scripts/update-app.sh
Executable file
178
deployment-scripts/update-app.sh
Executable 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 ""
|
||||
Reference in New Issue
Block a user