#!/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-itinova" BACKUP_DIR="/var/backups/formation-manager-itinova" 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}"