4NK_env/scripts/lecoffre_node/deploy-grafana.sh
LeCoffre Deployment 43a05a2742 clean
2025-09-25 12:19:35 +00:00

266 lines
7.0 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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 "$@"