#!/bin/bash # Script de déploiement centralisé pour Grafana et la stack de monitoring # Usage: ./scripts/deploy-grafana.sh [start|stop|restart|status|logs] set -e COMPOSE_FILE="docker-compose.yml" GRAFANA_ADMIN_PASSWORD="${GRAFANA_ADMIN_PASSWORD:-admin123}" GRAFANA_PORT="${GRAFANA_PORT:-3005}" LOKI_PORT="${LOKI_PORT:-3100}" # 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 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 Docker est en cours d'exécution check_docker() { if ! docker info >/dev/null 2>&1; then log_error "Docker n'est pas en cours d'exécution" exit 1 fi } # Fonction pour vérifier la configuration check_config() { log_info "Vérification de la configuration..." # Vérifier que les fichiers de configuration existent required_files=( "conf/grafana/provisioning/datasources/loki.yml" "conf/grafana/provisioning/dashboards/dashboards.yml" "conf/grafana/dashboards/lecoffre-overview.json" "conf/grafana/dashboards/bitcoin-miner.json" "conf/grafana/dashboards/services-overview.json" "conf/promtail/promtail.yml" "conf/nginx/grafana.conf" ) for file in "${required_files[@]}"; do if [ ! -f "$file" ]; then log_error "Fichier de configuration manquant: $file" exit 1 fi done log_success "Configuration vérifiée" } # Fonction pour démarrer la stack de monitoring start_monitoring() { log_info "Démarrage de la stack de monitoring..." check_docker check_config # Créer les dossiers nécessaires mkdir -p logs/{bitcoin,blindbit,sdk_relaysdk_storagelecoffre-front,ihm_client,tor,miner,nginx} # Démarrer les services de monitoring log_info "Démarrage de Loki..." docker compose up -d loki log_info "Attente que Loki soit prêt..." sleep 10 log_info "Démarrage de Promtail..." docker compose up -d promtail log_info "Démarrage de Grafana..." docker compose up -d grafana log_info "Attente que Grafana soit prêt..." sleep 15 # Vérifier le statut des services check_monitoring_status log_success "Stack de monitoring démarrée avec succès!" echo "" echo "🔗 URLs d'accès:" echo " - Grafana: https://dev4.4nkweb.com/grafana/" echo " - Loki API: https://dev4.4nkweb.com/loki/" echo " - Grafana Local: http://localhost:${GRAFANA_PORT}" echo "" echo "🔐 Identifiants Grafana:" echo " - Utilisateur: admin" echo " - Mot de passe: ${GRAFANA_ADMIN_PASSWORD}" } # Fonction pour arrêter la stack de monitoring stop_monitoring() { log_info "Arrêt de la stack de monitoring..." docker compose stop grafana promtail loki log_success "Stack de monitoring arrêtée" } # Fonction pour redémarrer la stack de monitoring restart_monitoring() { log_info "Redémarrage de la stack de monitoring..." stop_monitoring sleep 5 start_monitoring } # Fonction pour vérifier le statut check_monitoring_status() { log_info "Vérification du statut des services..." services=("loki" "promtail" "grafana") for service in "${services[@]}"; do if docker compose ps "$service" | grep -q "Up"; then log_success "$service: En cours d'exécution" else log_warning "$service: Arrêté ou en erreur" fi done # Vérifier les ports if netstat -tuln 2>/dev/null | grep -q ":${GRAFANA_PORT} "; then log_success "Grafana accessible sur le port ${GRAFANA_PORT}" else log_warning "Grafana non accessible sur le port ${GRAFANA_PORT}" fi if netstat -tuln 2>/dev/null | grep -q ":${LOKI_PORT} "; then log_success "Loki accessible sur le port ${LOKI_PORT}" else log_warning "Loki non accessible sur le port ${LOKI_PORT}" fi } # Fonction pour afficher les logs show_logs() { local service=${1:-"grafana"} log_info "Affichage des logs pour $service..." docker compose logs -f "$service" } # Fonction pour initialiser Grafana init_grafana() { log_info "Initialisation de Grafana..." # Attendre que Grafana soit prêt log_info "Attente que Grafana soit prêt..." timeout=60 while [ $timeout -gt 0 ]; do if curl -s http://localhost:${GRAFANA_PORT}/api/health >/dev/null 2>&1; then log_success "Grafana est prêt!" break fi sleep 2 timeout=$((timeout - 2)) done if [ $timeout -le 0 ]; then log_error "Timeout: Grafana n'est pas prêt après 60 secondes" return 1 fi # Créer un utilisateur admin si nécessaire log_info "Configuration de l'utilisateur admin..." curl -X POST \ -H "Content-Type: application/json" \ -d "{\"user\":\"admin\",\"password\":\"${GRAFANA_ADMIN_PASSWORD}\"}" \ http://admin:admin@localhost:${GRAFANA_PORT}/api/admin/users \ 2>/dev/null || true log_success "Grafana initialisé" } # Fonction pour collecter les logs de tous les services collect_all_logs() { log_info "Collecte des logs de tous les services..." ./scripts/collect-logs.sh log_success "Logs collectés dans le dossier logs/" } # Fonction d'aide show_help() { echo "Usage: $0 [COMMAND]" echo "" echo "Commandes disponibles:" echo " start Démarrer la stack de monitoring (Grafana + Loki + Promtail)" echo " stop Arrêter la stack de monitoring" echo " restart Redémarrer la stack de monitoring" echo " status Vérifier le statut des services" echo " logs Afficher les logs (par défaut: grafana)" echo " init Initialiser Grafana" echo " collect Collecter les logs de tous les services" echo " help Afficher cette aide" echo "" echo "Variables d'environnement:" echo " GRAFANA_ADMIN_PASSWORD Mot de passe admin Grafana (défaut: admin123)" echo " GRAFANA_PORT Port Grafana (défaut: 3000)" echo " LOKI_PORT Port Loki (défaut: 3100)" echo "" echo "Exemples:" echo " $0 start" echo " $0 logs promtail" echo " GRAFANA_ADMIN_PASSWORD=mypass $0 start" } # Fonction principale main() { case "${1:-help}" in start) start_monitoring ;; stop) stop_monitoring ;; restart) restart_monitoring ;; status) check_monitoring_status ;; logs) show_logs "$2" ;; init) init_grafana ;; collect) collect_all_logs ;; help|--help|-h) show_help ;; *) log_error "Commande inconnue: $1" show_help exit 1 ;; esac } # Exécution du script main "$@"