2025-12-03 21:56:50 +00:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# 🚀 VEZA DEVELOPMENT ENVIRONMENT SETUP
|
|
|
|
|
|
# Script de configuration complète de l'environnement de développement
|
|
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
|
|
# Couleurs pour les messages
|
|
|
|
|
|
RED='\033[0;31m'
|
|
|
|
|
|
GREEN='\033[0;32m'
|
|
|
|
|
|
YELLOW='\033[1;33m'
|
|
|
|
|
|
BLUE='\033[0;34m'
|
|
|
|
|
|
NC='\033[0m' # No Color
|
|
|
|
|
|
|
|
|
|
|
|
# Fonction pour afficher les messages
|
|
|
|
|
|
log_info() {
|
|
|
|
|
|
echo -e "${BLUE}ℹ️ $1${NC}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
log_success() {
|
|
|
|
|
|
echo -e "${GREEN}✅ $1${NC}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
log_warning() {
|
|
|
|
|
|
echo -e "${YELLOW}⚠️ $1${NC}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
log_error() {
|
|
|
|
|
|
echo -e "${RED}❌ $1${NC}"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Fonction pour vérifier si une commande existe
|
|
|
|
|
|
command_exists() {
|
|
|
|
|
|
command -v "$1" >/dev/null 2>&1
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Fonction pour installer une dépendance si elle n'existe pas
|
|
|
|
|
|
install_if_missing() {
|
|
|
|
|
|
local cmd=$1
|
|
|
|
|
|
local install_cmd=$2
|
|
|
|
|
|
|
|
|
|
|
|
if ! command_exists "$cmd"; then
|
|
|
|
|
|
log_warning "$cmd n'est pas installé. Installation..."
|
|
|
|
|
|
eval "$install_cmd"
|
|
|
|
|
|
log_success "$cmd installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "$cmd est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Header
|
|
|
|
|
|
echo -e "${BLUE}"
|
|
|
|
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
|
|
|
|
echo "║ VEZA DEVELOPMENT SETUP ║"
|
|
|
|
|
|
echo "║ Configuration de l'environnement ║"
|
|
|
|
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
|
|
|
|
|
echo -e "${NC}"
|
|
|
|
|
|
|
|
|
|
|
|
# 1. Vérification des prérequis système
|
|
|
|
|
|
log_info "Vérification des prérequis système..."
|
|
|
|
|
|
|
|
|
|
|
|
# Vérifier le système d'exploitation
|
|
|
|
|
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
|
|
|
|
OS="linux"
|
|
|
|
|
|
log_success "Système Linux détecté"
|
|
|
|
|
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
|
|
|
|
OS="macos"
|
|
|
|
|
|
log_success "Système macOS détecté"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_error "Système d'exploitation non supporté: $OSTYPE"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 2. Installation des dépendances de base
|
|
|
|
|
|
log_info "Installation des dépendances de base..."
|
|
|
|
|
|
|
|
|
|
|
|
# Git
|
|
|
|
|
|
install_if_missing "git" "sudo apt-get update && sudo apt-get install -y git"
|
|
|
|
|
|
|
|
|
|
|
|
# Curl
|
|
|
|
|
|
install_if_missing "curl" "sudo apt-get install -y curl"
|
|
|
|
|
|
|
|
|
|
|
|
# Wget
|
|
|
|
|
|
install_if_missing "wget" "sudo apt-get install -y wget"
|
|
|
|
|
|
|
|
|
|
|
|
# 3. Installation de Docker
|
|
|
|
|
|
log_info "Installation de Docker..."
|
|
|
|
|
|
if ! command_exists "docker"; then
|
|
|
|
|
|
log_warning "Docker n'est pas installé. Installation..."
|
|
|
|
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
|
|
|
|
sudo sh get-docker.sh
|
|
|
|
|
|
sudo usermod -aG docker $USER
|
|
|
|
|
|
rm get-docker.sh
|
|
|
|
|
|
log_success "Docker installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Docker est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 4. Installation de Docker Compose
|
|
|
|
|
|
log_info "Installation de Docker Compose..."
|
|
|
|
|
|
if ! command_exists "docker-compose"; then
|
|
|
|
|
|
log_warning "Docker Compose n'est pas installé. Installation..."
|
|
|
|
|
|
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
|
|
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
|
|
log_success "Docker Compose installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Docker Compose est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 5. Installation de Go
|
|
|
|
|
|
log_info "Installation de Go..."
|
|
|
|
|
|
if ! command_exists "go"; then
|
|
|
|
|
|
log_warning "Go n'est pas installé. Installation..."
|
|
|
|
|
|
GO_VERSION="1.23.0"
|
|
|
|
|
|
wget "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
|
|
|
|
|
|
sudo rm -rf /usr/local/go
|
|
|
|
|
|
sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
|
|
|
|
|
|
rm "go${GO_VERSION}.linux-amd64.tar.gz"
|
|
|
|
|
|
|
|
|
|
|
|
# Ajouter Go au PATH
|
|
|
|
|
|
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
|
|
|
|
|
|
export PATH=$PATH:/usr/local/go/bin
|
|
|
|
|
|
log_success "Go installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Go est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 6. Installation de Rust
|
|
|
|
|
|
log_info "Installation de Rust..."
|
|
|
|
|
|
if ! command_exists "cargo"; then
|
|
|
|
|
|
log_warning "Rust n'est pas installé. Installation..."
|
|
|
|
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
|
|
|
|
|
source ~/.cargo/env
|
|
|
|
|
|
log_success "Rust installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Rust est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 7. Installation de Node.js
|
|
|
|
|
|
log_info "Installation de Node.js..."
|
|
|
|
|
|
if ! command_exists "node"; then
|
|
|
|
|
|
log_warning "Node.js n'est pas installé. Installation..."
|
|
|
|
|
|
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
|
|
|
|
|
sudo apt-get install -y nodejs
|
|
|
|
|
|
log_success "Node.js installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Node.js est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 8. Installation de PostgreSQL
|
|
|
|
|
|
log_info "Installation de PostgreSQL..."
|
|
|
|
|
|
if ! command_exists "psql"; then
|
|
|
|
|
|
log_warning "PostgreSQL n'est pas installé. Installation..."
|
|
|
|
|
|
sudo apt-get update
|
|
|
|
|
|
sudo apt-get install -y postgresql postgresql-contrib
|
|
|
|
|
|
sudo systemctl start postgresql
|
|
|
|
|
|
sudo systemctl enable postgresql
|
|
|
|
|
|
log_success "PostgreSQL installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "PostgreSQL est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 9. Installation de Redis
|
|
|
|
|
|
log_info "Installation de Redis..."
|
|
|
|
|
|
if ! command_exists "redis-server"; then
|
|
|
|
|
|
log_warning "Redis n'est pas installé. Installation..."
|
2025-12-13 02:34:34 +00:00
|
|
|
|
sudo dnf install -y redis-server
|
2025-12-03 21:56:50 +00:00
|
|
|
|
sudo systemctl start redis-server
|
|
|
|
|
|
sudo systemctl enable redis-server
|
|
|
|
|
|
log_success "Redis installé avec succès"
|
|
|
|
|
|
else
|
|
|
|
|
|
log_success "Redis est déjà installé"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 10. Installation des outils de développement
|
|
|
|
|
|
log_info "Installation des outils de développement..."
|
|
|
|
|
|
|
|
|
|
|
|
# kubectl
|
|
|
|
|
|
install_if_missing "kubectl" "curl -LO 'https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl' && sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl"
|
|
|
|
|
|
|
|
|
|
|
|
# helm
|
|
|
|
|
|
install_if_missing "helm" "curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash"
|
|
|
|
|
|
|
|
|
|
|
|
# terraform
|
|
|
|
|
|
install_if_missing "terraform" "wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg && echo 'deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main' | sudo tee /etc/apt/sources.list.d/hashicorp.list && sudo apt update && sudo apt install terraform"
|
|
|
|
|
|
|
|
|
|
|
|
# 11. Configuration des services
|
|
|
|
|
|
log_info "Configuration des services..."
|
|
|
|
|
|
|
|
|
|
|
|
# Configuration PostgreSQL
|
|
|
|
|
|
sudo -u postgres psql -c "CREATE DATABASE veza_dev;" 2>/dev/null || log_warning "Base de données veza_dev existe déjà"
|
|
|
|
|
|
sudo -u postgres psql -c "CREATE USER veza_user WITH PASSWORD 'veza_password';" 2>/dev/null || log_warning "Utilisateur veza_user existe déjà"
|
|
|
|
|
|
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE veza_dev TO veza_user;" 2>/dev/null || log_warning "Privilèges déjà accordés"
|
|
|
|
|
|
|
|
|
|
|
|
# Configuration Redis
|
|
|
|
|
|
sudo systemctl restart redis-server
|
|
|
|
|
|
|
|
|
|
|
|
# 12. Création des fichiers de configuration
|
|
|
|
|
|
log_info "Création des fichiers de configuration..."
|
|
|
|
|
|
|
|
|
|
|
|
# Fichier .env pour le développement
|
|
|
|
|
|
cat > .env.dev << 'ENVEOF'
|
|
|
|
|
|
# Configuration de développement Veza
|
|
|
|
|
|
NODE_ENV=development
|
|
|
|
|
|
DEBUG=true
|
|
|
|
|
|
|
|
|
|
|
|
# Base de données
|
|
|
|
|
|
DB_HOST=localhost
|
|
|
|
|
|
DB_PORT=5432
|
|
|
|
|
|
DB_NAME=veza_dev
|
|
|
|
|
|
DB_USER=veza_user
|
|
|
|
|
|
DB_PASSWORD=veza_password
|
|
|
|
|
|
DB_SSL_MODE=disable
|
|
|
|
|
|
|
|
|
|
|
|
# Redis
|
|
|
|
|
|
REDIS_HOST=localhost
|
|
|
|
|
|
REDIS_PORT=6379
|
|
|
|
|
|
REDIS_PASSWORD=
|
|
|
|
|
|
|
|
|
|
|
|
# Services
|
|
|
|
|
|
BACKEND_PORT=8080
|
|
|
|
|
|
CHAT_PORT=3001
|
|
|
|
|
|
STREAM_PORT=8000
|
|
|
|
|
|
FRONTEND_PORT=3000
|
|
|
|
|
|
|
|
|
|
|
|
# JWT
|
|
|
|
|
|
JWT_SECRET=dev_jwt_secret_key_change_in_production
|
|
|
|
|
|
JWT_EXPIRES_IN=24h
|
|
|
|
|
|
|
|
|
|
|
|
# OAuth (pour le développement)
|
|
|
|
|
|
GOOGLE_CLIENT_ID=your_google_client_id
|
|
|
|
|
|
GOOGLE_CLIENT_SECRET=your_google_client_secret
|
|
|
|
|
|
GITHUB_CLIENT_ID=your_github_client_id
|
|
|
|
|
|
GITHUB_CLIENT_SECRET=your_github_client_secret
|
|
|
|
|
|
|
|
|
|
|
|
# Monitoring
|
|
|
|
|
|
PROMETHEUS_PORT=9090
|
|
|
|
|
|
GRAFANA_PORT=3001
|
|
|
|
|
|
JAEGER_PORT=16686
|
|
|
|
|
|
ENVEOF
|
|
|
|
|
|
|
|
|
|
|
|
log_success "Fichier .env.dev créé"
|
|
|
|
|
|
|
|
|
|
|
|
# 13. Installation des dépendances des projets
|
|
|
|
|
|
log_info "Installation des dépendances des projets..."
|
|
|
|
|
|
|
|
|
|
|
|
# Backend API
|
|
|
|
|
|
if [ -d "veza-backend-api" ]; then
|
|
|
|
|
|
log_info "Installation des dépendances Backend API..."
|
|
|
|
|
|
cd veza-backend-api
|
|
|
|
|
|
go mod download
|
|
|
|
|
|
go mod tidy
|
|
|
|
|
|
cd ..
|
|
|
|
|
|
log_success "Dépendances Backend API installées"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Chat Server
|
|
|
|
|
|
if [ -d "veza-chat-server" ]; then
|
|
|
|
|
|
log_info "Installation des dépendances Chat Server..."
|
|
|
|
|
|
cd veza-chat-server
|
|
|
|
|
|
cargo build
|
|
|
|
|
|
cd ..
|
|
|
|
|
|
log_success "Dépendances Chat Server installées"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Stream Server
|
|
|
|
|
|
if [ -d "veza-stream-server" ]; then
|
|
|
|
|
|
log_info "Installation des dépendances Stream Server..."
|
|
|
|
|
|
cd veza-stream-server
|
|
|
|
|
|
cargo build
|
|
|
|
|
|
cd ..
|
|
|
|
|
|
log_success "Dépendances Stream Server installées"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Frontend
|
|
|
|
|
|
if [ -d "veza-frontend" ]; then
|
|
|
|
|
|
log_info "Installation des dépendances Frontend..."
|
|
|
|
|
|
cd veza-frontend
|
|
|
|
|
|
npm install
|
|
|
|
|
|
cd ..
|
|
|
|
|
|
log_success "Dépendances Frontend installées"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Mobile
|
|
|
|
|
|
if [ -d "veza-mobile" ]; then
|
|
|
|
|
|
log_info "Installation des dépendances Mobile..."
|
|
|
|
|
|
cd veza-mobile
|
|
|
|
|
|
npm install
|
|
|
|
|
|
cd ..
|
|
|
|
|
|
log_success "Dépendances Mobile installées"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# 14. Création des scripts utiles
|
|
|
|
|
|
log_info "Création des scripts utiles..."
|
|
|
|
|
|
|
|
|
|
|
|
# Script de démarrage de tous les services
|
|
|
|
|
|
cat > start-all-services.sh << 'SCRIPTEOF'
|
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# Script de démarrage de tous les services Veza
|
|
|
|
|
|
|
|
|
|
|
|
echo "🚀 Démarrage de tous les services Veza..."
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer PostgreSQL
|
|
|
|
|
|
sudo systemctl start postgresql
|
|
|
|
|
|
echo "✅ PostgreSQL démarré"
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer Redis
|
|
|
|
|
|
sudo systemctl start redis-server
|
|
|
|
|
|
echo "✅ Redis démarré"
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer Backend API
|
|
|
|
|
|
cd veza-backend-api
|
2026-02-15 13:39:40 +00:00
|
|
|
|
go run cmd/api/main.go &
|
2025-12-03 21:56:50 +00:00
|
|
|
|
BACKEND_PID=$!
|
|
|
|
|
|
echo "✅ Backend API démarré (PID: $BACKEND_PID)"
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer Chat Server
|
|
|
|
|
|
cd ../veza-chat-server
|
|
|
|
|
|
cargo run &
|
|
|
|
|
|
CHAT_PID=$!
|
|
|
|
|
|
echo "✅ Chat Server démarré (PID: $CHAT_PID)"
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer Stream Server
|
|
|
|
|
|
cd ../veza-stream-server
|
|
|
|
|
|
cargo run &
|
|
|
|
|
|
STREAM_PID=$!
|
|
|
|
|
|
echo "✅ Stream Server démarré (PID: $STREAM_PID)"
|
|
|
|
|
|
|
|
|
|
|
|
# Démarrer Frontend
|
|
|
|
|
|
cd ../veza-frontend
|
|
|
|
|
|
npm run dev &
|
|
|
|
|
|
FRONTEND_PID=$!
|
|
|
|
|
|
echo "✅ Frontend démarré (PID: $FRONTEND_PID)"
|
|
|
|
|
|
|
|
|
|
|
|
echo "🎉 Tous les services sont démarrés!"
|
|
|
|
|
|
echo "Backend API: http://localhost:8080"
|
|
|
|
|
|
echo "Chat Server: http://localhost:3001"
|
|
|
|
|
|
echo "Stream Server: http://localhost:8000"
|
|
|
|
|
|
echo "Frontend: http://localhost:3000"
|
|
|
|
|
|
|
|
|
|
|
|
# Sauvegarder les PIDs
|
|
|
|
|
|
echo $BACKEND_PID > logs/backend.pid
|
|
|
|
|
|
echo $CHAT_PID > logs/chat-server.pid
|
|
|
|
|
|
echo $STREAM_PID > logs/stream-server.pid
|
|
|
|
|
|
echo $FRONTEND_PID > logs/frontend.pid
|
|
|
|
|
|
SCRIPTEOF
|
|
|
|
|
|
|
|
|
|
|
|
chmod +x start-all-services.sh
|
|
|
|
|
|
log_success "Script start-all-services.sh créé"
|
|
|
|
|
|
|
|
|
|
|
|
# Script d'arrêt de tous les services
|
|
|
|
|
|
cat > stop-all-services.sh << 'SCRIPTEOF'
|
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# Script d'arrêt de tous les services Veza
|
|
|
|
|
|
|
|
|
|
|
|
echo "🛑 Arrêt de tous les services Veza..."
|
|
|
|
|
|
|
|
|
|
|
|
# Arrêter les services via leurs PIDs
|
|
|
|
|
|
if [ -f "logs/backend.pid" ]; then
|
|
|
|
|
|
kill $(cat logs/backend.pid) 2>/dev/null || true
|
|
|
|
|
|
echo "✅ Backend API arrêté"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ -f "logs/chat-server.pid" ]; then
|
|
|
|
|
|
kill $(cat logs/chat-server.pid) 2>/dev/null || true
|
|
|
|
|
|
echo "✅ Chat Server arrêté"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ -f "logs/stream-server.pid" ]; then
|
|
|
|
|
|
kill $(cat logs/stream-server.pid) 2>/dev/null || true
|
|
|
|
|
|
echo "✅ Stream Server arrêté"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ -f "logs/frontend.pid" ]; then
|
|
|
|
|
|
kill $(cat logs/frontend.pid) 2>/dev/null || true
|
|
|
|
|
|
echo "✅ Frontend arrêté"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "🎉 Tous les services sont arrêtés!"
|
|
|
|
|
|
SCRIPTEOF
|
|
|
|
|
|
|
|
|
|
|
|
chmod +x stop-all-services.sh
|
|
|
|
|
|
log_success "Script stop-all-services.sh créé"
|
|
|
|
|
|
|
|
|
|
|
|
# 15. Création du répertoire logs
|
|
|
|
|
|
mkdir -p logs
|
|
|
|
|
|
log_success "Répertoire logs créé"
|
|
|
|
|
|
|
|
|
|
|
|
# 16. Finalisation
|
|
|
|
|
|
log_success "Configuration de l'environnement terminée!"
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "${GREEN}"
|
|
|
|
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
|
|
|
|
echo "║ SETUP TERMINÉ AVEC SUCCÈS ║"
|
|
|
|
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
|
|
|
|
|
echo -e "${NC}"
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "${BLUE}📋 Prochaines étapes:${NC}"
|
|
|
|
|
|
echo "1. Redémarrez votre terminal ou exécutez: source ~/.bashrc"
|
|
|
|
|
|
echo "2. Exécutez: ./start-all-services.sh pour démarrer tous les services"
|
|
|
|
|
|
echo "3. Visitez http://localhost:3000 pour accéder au frontend"
|
|
|
|
|
|
echo "4. Consultez DEVELOPMENT_STRATEGY.md pour la stratégie de développement"
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "${YELLOW}⚠️ Note: Vous devrez peut-être redémarrer votre session pour que tous les PATH soient mis à jour.${NC}"
|