#!/bin/bash ############################################################################### # Script de diagnostic - Gestion des Formations Manager Itinova # Vérifie la configuration et l'état de l'application ############################################################################### set -e # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' echo "╔════════════════════════════════════════════════════════════════╗" echo "║ Diagnostic - Formation Manager Itinova ║" echo "╚════════════════════════════════════════════════════════════════╝" echo "" # Vérifier que nous sommes dans le bon répertoire if [ ! -f "package.json" ]; then echo -e "${RED}[ERREUR]${NC} Ce script doit être exécuté depuis la racine du projet" exit 1 fi # Charger les variables d'environnement if [ -f .env ]; then export $(cat .env | grep -v '^#' | xargs) echo -e "${GREEN}[OK]${NC} Fichier .env trouvé" else echo -e "${RED}[ERREUR]${NC} Fichier .env non trouvé" exit 1 fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 1. VÉRIFICATION DES VARIABLES D'ENVIRONNEMENT" echo "═══════════════════════════════════════════════════════════════" echo "" # Vérifier DATABASE_URL if [ -z "$DATABASE_URL" ]; then echo -e "${RED}[ERREUR]${NC} DATABASE_URL n'est pas définie" else echo -e "${GREEN}[OK]${NC} DATABASE_URL est définie" # Masquer le mot de passe MASKED_URL=$(echo $DATABASE_URL | sed 's/:\/\/[^:]*:[^@]*@/:\/\/***:***@/') echo " $MASKED_URL" fi # Vérifier JWT_SECRET if [ -z "$JWT_SECRET" ]; then echo -e "${RED}[ERREUR]${NC} JWT_SECRET n'est pas définie" echo -e "${YELLOW}[INFO]${NC} L'authentification locale ne fonctionnera pas sans JWT_SECRET" else echo -e "${GREEN}[OK]${NC} JWT_SECRET est définie" SECRET_LENGTH=${#JWT_SECRET} if [ $SECRET_LENGTH -lt 32 ]; then echo -e "${YELLOW}[WARN]${NC} JWT_SECRET est trop courte ($SECRET_LENGTH caractères, recommandé: 32+)" else echo -e "${GREEN}[OK]${NC} JWT_SECRET a une longueur suffisante ($SECRET_LENGTH caractères)" fi fi # Vérifier NODE_ENV if [ -z "$NODE_ENV" ]; then echo -e "${YELLOW}[WARN]${NC} NODE_ENV n'est pas définie (défaut: development)" else echo -e "${GREEN}[OK]${NC} NODE_ENV = $NODE_ENV" fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 2. VÉRIFICATION DE LA BASE DE DONNÉES" echo "═══════════════════════════════════════════════════════════════" echo "" # Extraire les informations de connexion DB_USER=$(echo $DATABASE_URL | sed -n 's/.*:\/\/\([^:]*\):.*/\1/p') DB_PASS=$(echo $DATABASE_URL | sed -n 's/.*:\/\/[^:]*:\([^@]*\)@.*/\1/p') DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@\([^:]*\):.*/\1/p') DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*:\([0-9]*\)\/.*/\1/p') DB_NAME=$(echo $DATABASE_URL | sed -n 's/.*\/\([^?]*\).*/\1/p') # Tester la connexion MySQL if command -v mysql &> /dev/null; then if mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -e "USE $DB_NAME;" 2>/dev/null; then echo -e "${GREEN}[OK]${NC} Connexion à la base de données réussie" # Vérifier les tables TABLES=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -e "SHOW TABLES;" 2>/dev/null | tail -n +2) if [ -z "$TABLES" ]; then echo -e "${YELLOW}[WARN]${NC} Aucune table trouvée dans la base de données" echo -e "${YELLOW}[INFO]${NC} Exécutez 'pnpm db:push' pour créer les tables" else echo -e "${GREEN}[OK]${NC} Tables trouvées:" echo "$TABLES" | while read table; do echo " - $table" done # Vérifier la table users if echo "$TABLES" | grep -q "users"; then USER_COUNT=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -e "SELECT COUNT(*) FROM users;" 2>/dev/null | tail -n 1) echo "" echo -e "${GREEN}[OK]${NC} Table 'users' existe" echo " Nombre d'utilisateurs: $USER_COUNT" # Vérifier si adminServFormation existe ADMIN_EXISTS=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -e "SELECT COUNT(*) FROM users WHERE username='adminServFormation';" 2>/dev/null | tail -n 1) if [ "$ADMIN_EXISTS" = "1" ]; then echo -e "${GREEN}[OK]${NC} Utilisateur 'adminServFormation' existe" # Vérifier le mot de passe PASSWORD_HASH=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -e "SELECT password FROM users WHERE username='adminServFormation';" 2>/dev/null | tail -n 1) if [ -z "$PASSWORD_HASH" ] || [ "$PASSWORD_HASH" = "NULL" ]; then echo -e "${RED}[ERREUR]${NC} Le mot de passe de 'adminServFormation' est vide ou NULL" else echo -e "${GREEN}[OK]${NC} Le mot de passe est défini (hash: ${PASSWORD_HASH:0:20}...)" fi else echo -e "${RED}[ERREUR]${NC} Utilisateur 'adminServFormation' n'existe pas" echo -e "${YELLOW}[INFO]${NC} Utilisez le script 'reset-admin.sh' pour le créer" fi else echo -e "${RED}[ERREUR]${NC} Table 'users' n'existe pas" echo -e "${YELLOW}[INFO]${NC} Exécutez 'pnpm db:push' pour créer les tables" fi fi else echo -e "${RED}[ERREUR]${NC} Impossible de se connecter à la base de données" echo -e "${YELLOW}[INFO]${NC} Vérifiez les paramètres de connexion dans .env" fi else echo -e "${YELLOW}[WARN]${NC} MySQL client non installé, impossible de vérifier la base de données" fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 3. VÉRIFICATION DES DÉPENDANCES" echo "═══════════════════════════════════════════════════════════════" echo "" # Vérifier node_modules if [ -d "node_modules" ]; then echo -e "${GREEN}[OK]${NC} Dossier node_modules existe" # Vérifier bcryptjs if [ -d "node_modules/bcryptjs" ]; then echo -e "${GREEN}[OK]${NC} bcryptjs est installé" else echo -e "${RED}[ERREUR]${NC} bcryptjs n'est pas installé" echo -e "${YELLOW}[INFO]${NC} Exécutez 'pnpm install' pour installer les dépendances" fi # Vérifier jsonwebtoken if [ -d "node_modules/jsonwebtoken" ]; then echo -e "${GREEN}[OK]${NC} jsonwebtoken est installé" else echo -e "${RED}[ERREUR]${NC} jsonwebtoken n'est pas installé" echo -e "${YELLOW}[INFO]${NC} Exécutez 'pnpm install' pour installer les dépendances" fi else echo -e "${RED}[ERREUR]${NC} Dossier node_modules n'existe pas" echo -e "${YELLOW}[INFO]${NC} Exécutez 'pnpm install' pour installer les dépendances" fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " 4. VÉRIFICATION DU SERVICE" echo "═══════════════════════════════════════════════════════════════" echo "" # Vérifier si le service systemd existe if command -v systemctl &> /dev/null; then if systemctl list-unit-files | grep -q "formation-manager"; then echo -e "${GREEN}[OK]${NC} Service systemd 'formation-manager' existe" if systemctl is-active --quiet formation-manager; then echo -e "${GREEN}[OK]${NC} Service est actif" else echo -e "${YELLOW}[WARN]${NC} Service n'est pas actif" fi if systemctl is-enabled --quiet formation-manager; then echo -e "${GREEN}[OK]${NC} Service est activé au démarrage" else echo -e "${YELLOW}[WARN]${NC} Service n'est pas activé au démarrage" fi else echo -e "${YELLOW}[INFO]${NC} Service systemd 'formation-manager' n'existe pas" fi fi # Vérifier si l'application répond echo "" if command -v curl &> /dev/null; then HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 2>/dev/null || echo "000") if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then echo -e "${GREEN}[OK]${NC} Application répond (HTTP $HTTP_CODE)" else echo -e "${YELLOW}[WARN]${NC} Application ne répond pas correctement (HTTP $HTTP_CODE)" fi fi echo "" echo "═══════════════════════════════════════════════════════════════" echo " RÉSUMÉ DU DIAGNOSTIC" echo "═══════════════════════════════════════════════════════════════" echo "" if [ -z "$JWT_SECRET" ]; then echo -e "${RED}[ACTION REQUISE]${NC} Définir JWT_SECRET dans .env" echo " Générer avec: openssl rand -base64 32" fi if [ "$ADMIN_EXISTS" != "1" ]; then echo -e "${RED}[ACTION REQUISE]${NC} Créer l'utilisateur adminServFormation" echo " Exécuter: ./reset-admin.sh" fi if [ -z "$TABLES" ]; then echo -e "${RED}[ACTION REQUISE]${NC} Initialiser la base de données" echo " Exécuter: pnpm db:push" fi echo "" echo "Diagnostic terminé."