Files
formation-manager-itinova/create-admin.sh

230 lines
7.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 <<EOF 2>&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 <<EOF 2>&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."