#!/bin/bash # Script de déploiement automatique pour Inventory V2 # Usage: ./deploy.sh [backend|frontend|all] set -e # Arrêter en cas d'erreur # Configuration PROJECT_DIR="/home/matt/inventory_v2" BACKEND_DIR="$PROJECT_DIR/inventory_backend" FRONTEND_DIR="$PROJECT_DIR/inventory_frontend" LOG_FILE="/tmp/deploy.log" # Couleurs pour les logs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Fonction de logging log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE" } log_success() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1" | tee -a "$LOG_FILE" } log_warning() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1" | tee -a "$LOG_FILE" } log_error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1" | tee -a "$LOG_FILE" } # Fonction pour déployer le backend deploy_backend() { log "Déploiement du backend..." # Sauvegarde automatique de la base de données avant modification log "Sauvegarde automatique de la base de données..." if command -v pg_dump &> /dev/null; then BACKUP_DIR="/home/matt/backups" DATE=$(date +"%Y%m%d_%H%M%S") BACKUP_FILE="auto_backup_$DATE.sql" # Créer le répertoire de sauvegarde mkdir -p "$BACKUP_DIR" # Sauvegarde de la base de données if pg_dump -h localhost -U inventory_user -d inventory_db > "$BACKUP_DIR/$BACKUP_FILE" 2>/dev/null; then # Compresser la sauvegarde gzip "$BACKUP_DIR/$BACKUP_FILE" log_success "Sauvegarde automatique créée: $BACKUP_DIR/$BACKUP_FILE.gz" # Garder seulement les 10 dernières sauvegardes automatiques cd "$BACKUP_DIR" ls -t auto_backup_*.sql.gz | tail -n +11 | xargs -r rm else log_warning "Impossible de créer la sauvegarde automatique (base de données non accessible)" fi else log_warning "pg_dump non trouvé, sauvegarde automatique impossible" fi cd "$BACKEND_DIR" # Sauvegarder les modifications locales si nécessaire if ! git diff-index --quiet HEAD --; then log_warning "Modifications locales détectées, sauvegarde..." git stash push -m "Auto-sauvegarde avant déploiement $(date)" fi # Pull les dernières modifications log "Récupération des dernières modifications..." git pull origin master # Installer les dépendances si nécessaire if [ ! -d "node_modules" ] || [ "package.json" -nt "node_modules" ]; then log "Installation des dépendances..." npm install fi # Build du projet log "Compilation du projet..." npm run build # Appliquer les migrations Prisma si nécessaire log "Vérification et application des migrations Prisma..." npx prisma migrate deploy # Générer le client Prisma log "Génération du client Prisma..." npx prisma generate # Redémarrer le service backend log "Redémarrage du service backend..." if systemctl is-active --quiet inventory-backend; then sudo systemctl restart inventory-backend log_success "Service backend redémarré" else log_warning "Service backend non trouvé, démarrage manuel requis" fi log_success "Backend déployé avec succès" } # Fonction pour déployer le frontend deploy_frontend() { log "Déploiement du frontend..." cd "$FRONTEND_DIR" # Sauvegarder les modifications locales si nécessaire if ! git diff-index --quiet HEAD --; then log_warning "Modifications locales détectées, sauvegarde..." git stash push -m "Auto-sauvegarde avant déploiement $(date)" fi # Pull les dernières modifications log "Récupération des dernières modifications..." git pull origin master # Installer les dépendances si nécessaire if [ ! -d "node_modules" ] || [ "package.json" -nt "node_modules" ]; then log "Installation des dépendances..." npm install fi # Build du projet log "Compilation du projet..." npm run build # Redémarrer le service frontend log "Redémarrage du service frontend..." if systemctl is-active --quiet inventory-frontend; then sudo systemctl restart inventory-frontend log_success "Service frontend redémarré" else log_warning "Service frontend non trouvé, démarrage manuel requis" fi log_success "Frontend déployé avec succès" } # Fonction pour déployer tout deploy_all() { log "Déploiement complet..." deploy_backend deploy_frontend log_success "Déploiement complet terminé" } # Fonction pour restaurer la base de données restore_database() { log "Restauration de la base de données..." if [ -z "$1" ]; then log_error "Veuillez spécifier le fichier de sauvegarde à restaurer" echo "Usage: $0 restore " echo "Exemple: $0 restore /home/matt/backups/auto_backup_20241230_143022.sql.gz" exit 1 fi BACKUP_FILE="$1" if [ ! -f "$BACKUP_FILE" ]; then log_error "Fichier de sauvegarde non trouvé: $BACKUP_FILE" exit 1 fi # Vérifier si c'est un fichier compressé if [[ "$BACKUP_FILE" == *.gz ]]; then log "Décompression de la sauvegarde..." gunzip -c "$BACKUP_FILE" | psql -h localhost -U inventory_user -d inventory_db else psql -h localhost -U inventory_user -d inventory_db < "$BACKUP_FILE" fi if [ $? -eq 0 ]; then log_success "Base de données restaurée avec succès" else log_error "Erreur lors de la restauration" exit 1 fi } # Fonction pour lister les sauvegardes disponibles list_backups() { log "Sauvegardes disponibles:" BACKUP_DIR="/home/matt/backups" if [ -d "$BACKUP_DIR" ]; then ls -la "$BACKUP_DIR"/*.sql.gz 2>/dev/null | while read -r line; do echo " $line" done else log_warning "Aucune sauvegarde trouvée" fi } # Fonction pour afficher l'aide show_help() { echo "Script de déploiement automatique pour Inventory V2" echo "" echo "Usage: $0 [OPTION]" echo "" echo "Options:" echo " backend Déployer uniquement le backend" echo " frontend Déployer uniquement le frontend" echo " all Déployer backend et frontend (défaut)" echo " restore Restaurer la base de données" echo " backups Lister les sauvegardes disponibles" echo " help Afficher cette aide" echo "" echo "Exemples:" echo " $0 backend" echo " $0 frontend" echo " $0 all" echo " $0 restore /home/matt/backups/auto_backup_20241230_143022.sql.gz" echo " $0 backups" } # Vérification des prérequis check_prerequisites() { log "Vérification des prérequis..." # Vérifier que git est installé if ! command -v git &> /dev/null; then log_error "Git n'est pas installé" exit 1 fi # Vérifier que npm est installé if ! command -v npm &> /dev/null; then log_error "NPM n'est pas installé" exit 1 fi # Vérifier que le répertoire du projet existe if [ ! -d "$PROJECT_DIR" ]; then log_error "Le répertoire du projet n'existe pas: $PROJECT_DIR" exit 1 fi log_success "Prérequis vérifiés" } # Fonction principale main() { log "=== Début du déploiement ===" # Vérifier les prérequis check_prerequisites # Traitement des arguments case "${1:-all}" in "backend") deploy_backend ;; "frontend") deploy_frontend ;; "all") deploy_all ;; "restore") restore_database "$2" ;; "backups") list_backups ;; "help"|"-h"|"--help") show_help exit 0 ;; *) log_error "Option invalide: $1" show_help exit 1 ;; esac log "=== Déploiement terminé ===" } # Exécution du script main "$@"