#!/bin/bash ############################################################################### # Script de création de l'utilisateur administrateur (version simplifiée) # Utilise un hash bcrypt pré-calculé pour éviter les dépendances Node.js ############################################################################### set -e # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' echo "╔════════════════════════════════════════════════════════════════╗" echo "║ Création de l'utilisateur administrateur ║" echo "╚════════════════════════════════════════════════════════════════╝" echo "" # Vérifier que le fichier .env existe if [ ! -f ".env" ]; then echo -e "${RED}[ERREUR]${NC} Fichier .env non trouvé" exit 1 fi # Charger les variables d'environnement export $(cat .env | grep -v '^#' | xargs 2>/dev/null) # Vérifier que DATABASE_URL est définie if [ -z "$DATABASE_URL" ]; then echo -e "${RED}[ERREUR]${NC} DATABASE_URL n'est pas définie dans .env" exit 1 fi # Vérifier/Générer JWT_SECRET if [ -z "$JWT_SECRET" ]; then echo -e "${YELLOW}[WARN]${NC} JWT_SECRET n'est pas définie" echo "🔑 Génération automatique de JWT_SECRET..." NEW_JWT_SECRET=$(openssl rand -base64 32) echo "JWT_SECRET=$NEW_JWT_SECRET" >> .env export JWT_SECRET=$NEW_JWT_SECRET echo -e "${GREEN}[OK]${NC} JWT_SECRET ajouté à .env" echo "" fi # Extraire les informations de connexion de DATABASE_URL 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') # Afficher les informations (masquer le mot de passe) echo "📋 Configuration de la base de données:" echo " Hôte: $DB_HOST:$DB_PORT" echo " Base: $DB_NAME" echo " Utilisateur: $DB_USER" echo "" # Vérifier MySQL if ! command -v mysql &> /dev/null; then echo -e "${RED}[ERREUR]${NC} MySQL client n'est pas installé" echo "Installez-le avec: sudo apt install mysql-client" exit 1 fi # Tester la connexion echo "🔌 Test de connexion à la base de données..." if ! mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -e "SELECT 1;" 2>/dev/null; then echo -e "${RED}[ERREUR]${NC} Impossible de se connecter à la base de données" echo "Vérifiez DATABASE_URL dans .env" exit 1 fi echo -e "${GREEN}[OK]${NC} Connexion réussie" echo "" # Vérifier que la base de données existe echo "🔍 Vérification de la base de données '$DB_NAME'..." if ! mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -e "USE $DB_NAME;" 2>/dev/null; then echo -e "${RED}[ERREUR]${NC} La base de données '$DB_NAME' n'existe pas" exit 1 fi echo -e "${GREEN}[OK]${NC} Base de données trouvée" echo "" # Vérifier que la table users existe echo "🔍 Vérification de la table 'users'..." TABLE_EXISTS=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -se "SHOW TABLES LIKE 'users';" 2>/dev/null) if [ -z "$TABLE_EXISTS" ]; then echo -e "${RED}[ERREUR]${NC} La table 'users' n'existe pas" echo "Exécutez d'abord: pnpm db:push" exit 1 fi echo -e "${GREEN}[OK]${NC} Table 'users' trouvée" echo "" # Informations de l'utilisateur USERNAME="adminServFormation" PASSWORD="Itinova69!" EMAIL="admin@formation.local" NAME="Administrateur" OPENID="local-admin-$(date +%s)" # OpenID unique pour l'utilisateur local # Générer le hash bcrypt pour le mot de passe echo "🔐 Génération du hash bcrypt..." # Vérifier que bcryptjs est installé if [ ! -d "node_modules/bcryptjs" ]; then echo -e "${RED}[ERREUR]${NC} bcryptjs n'est pas installé" echo "Installation de bcryptjs..." pnpm install bcryptjs fi # Générer le hash avec Node.js PASSWORD_HASH=$(node -p "require('bcryptjs').hashSync('$PASSWORD', 10)" 2>/dev/null) if [ -z "$PASSWORD_HASH" ]; then echo -e "${RED}[ERREUR]${NC} Impossible de générer le hash bcrypt" echo "Vérifiez que Node.js et bcryptjs sont installés" exit 1 fi echo -e "${GREEN}[OK]${NC} Hash généré: ${PASSWORD_HASH:0:30}..." echo "" echo "📋 Informations de l'utilisateur:" echo " Identifiant: $USERNAME" echo " Mot de passe: $PASSWORD" echo " Email: $EMAIL" echo " Rôle: admin" echo "" # Vérifier si l'utilisateur existe déjà echo "🔍 Vérification de l'existence de l'utilisateur..." USER_COUNT=$(mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -se "SELECT COUNT(*) FROM users WHERE username='$USERNAME';" 2>/dev/null) if [ "$USER_COUNT" = "1" ]; then echo -e "${YELLOW}[INFO]${NC} L'utilisateur existe déjà" echo "" read -p "Voulez-vous réinitialiser le mot de passe? (y/N) " -n 1 -r echo "" if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo "Opération annulée" exit 0 fi echo "🔄 Réinitialisation du mot de passe..." mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME <&1 UPDATE users SET password = '$PASSWORD_HASH', email = '$EMAIL', name = '$NAME', role = 'admin', isActive = 1, loginMethod = 'local', updatedAt = NOW() WHERE username = '$USERNAME'; EOF if [ $? -eq 0 ]; then echo -e "${GREEN}[OK]${NC} Mot de passe réinitialisé" else echo -e "${RED}[ERREUR]${NC} Échec de la réinitialisation" exit 1 fi else echo -e "${YELLOW}[INFO]${NC} L'utilisateur n'existe pas" echo "➕ Création de l'utilisateur..." # Créer l'utilisateur avec affichage des erreurs mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME <&1 INSERT INTO users (openId, username, password, email, name, role, isActive, loginMethod, createdAt, updatedAt) VALUES ( '$OPENID', '$USERNAME', '$PASSWORD_HASH', '$EMAIL', '$NAME', 'admin', 1, 'local', NOW(), NOW() ); EOF if [ $? -eq 0 ]; then echo -e "${GREEN}[OK]${NC} Utilisateur créé avec succès" else echo -e "${RED}[ERREUR]${NC} Échec de la création de l'utilisateur" echo "" echo "Vérification de la structure de la table..." mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS -D $DB_NAME -e "DESCRIBE users;" 2>&1 exit 1 fi fi echo "" echo "╔════════════════════════════════════════════════════════════════╗" echo "║ Opération terminée avec succès! ║" echo "╚════════════════════════════════════════════════════════════════╝" echo "" echo "🔑 Identifiants de connexion:" echo " Identifiant: $USERNAME" echo " Mot de passe: $PASSWORD" echo "" echo "⚠️ IMPORTANT: Changez le mot de passe après la première connexion" echo "" # Vérifier et redémarrer le service si disponible if command -v systemctl &> /dev/null; then if systemctl list-unit-files | grep -q "formation-manager"; then echo "🔄 Redémarrage du service formation-manager..." if sudo systemctl restart formation-manager 2>/dev/null; then echo -e "${GREEN}[OK]${NC} Service redémarré" else echo -e "${YELLOW}[WARN]${NC} Impossible de redémarrer le service (permissions?)" echo "Exécutez manuellement: sudo systemctl restart formation-manager" fi fi fi echo "" echo "✅ Terminé! Vous pouvez maintenant vous connecter."