#!/bin/bash # Script de démarrage amélioré pour lecoffre_node # Utilise les healthchecks du docker-compose.yml pour une séquence optimisée # Intègre la validation des dépendances externes set -e # Couleurs pour les logs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Configuration EXTERNAL_SIGNER_HOST="dev3.4nkweb.com" EXTERNAL_SIGNER_PORT="9090" PUBLIC_FRONT_URL="https://dev4.4nkweb.com/lecoffre" PUBLIC_IHM_URL="https://dev4.4nkweb.com" # Fonction de logging log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } log_success() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✅${NC} $1" } log_warning() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠️${NC} $1" } log_error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ❌${NC} $1" } # Fonction de validation des dépendances externes validate_external_dependencies() { log "Validation des dépendances externes..." local all_ok=true # Test du signer distant log "Test de connectivité vers le signer distant ($EXTERNAL_SIGNER_HOST:$EXTERNAL_SIGNER_PORT)..." if timeout 10 bash -c "/dev/null; then log_success "Signer distant accessible" else log_error "Signer distant non accessible" all_ok=false fi # Test des URLs publiques log "Test de connectivité vers les URLs publiques..." if curl -s --connect-timeout 10 --max-time 15 "$PUBLIC_FRONT_URL" >/dev/null 2>&1; then log_success "LeCoffre Front accessible" else log_warning "LeCoffre Front non accessible (peut être normal si pas encore démarré)" fi if curl -s --connect-timeout 10 --max-time 15 "$PUBLIC_IHM_URL" >/dev/null 2>&1; then log_success "IHM Client accessible" else log_warning "IHM Client non accessible (peut être normal si pas encore démarré)" fi return $([ "$all_ok" = true ] && echo 0 || echo 1) } # Fonction pour attendre qu'un service soit prêt wait_for_service() { local service_name=$1 local health_url=$2 local timeout=${3:-300} echo "⏳ Attente de $service_name..." local start_time=$(date +%s) while [ $(($(date +%s) - start_time)) -lt $timeout ]; do if curl -f -s "$health_url" > /dev/null 2>&1; then echo "✅ $service_name est prêt" return 0 fi sleep 5 done echo "❌ Timeout: $service_name n'est pas prêt après ${timeout}s" return 1 } # Fonction pour vérifier l'état du scan check_scan_status() { local sdk_relay_url="http://127.0.0.1:8091" echo "🔍 Vérification de l'état du scan..." local response=$(curl -s "$sdk_relay_url" 2>/dev/null || echo "{}") local scan_complete=$(echo "$response" | grep -o '"scan_complete":[^,]*' | cut -d: -f2 | tr -d ' "') if [ "$scan_complete" = "true" ]; then echo "✅ Scan terminé avec succès" return 0 elif [ "$scan_complete" = "false" ]; then echo "⚠️ Scan en cours, mais service disponible" return 0 else echo "❓ État du scan inconnu" return 1 fi } # Fonction principale de démarrage start_services() { log "🚀 Démarrage de lecoffre_node avec séquence optimisée" # Validation des dépendances externes avant démarrage if ! validate_external_dependencies; then log_error "Dépendances externes non disponibles. Arrêt du démarrage." log "Utilisez './scripts/startup-sequence.sh restart' pour redémarrer après réparation" exit 1 fi # Démarrage simplifié utilisant les healthchecks du docker-compose.yml log "📦 Démarrage de tous les services avec healthchecks..." docker compose up -d log "⏳ Attente que tous les services soient prêts (utilise les healthchecks)..." log " - sdk_relay: 60s start_period + healthcheck" log " - ihm_client: 30s start_period + healthcheck" log " - lecoffre-back: 30s start_period + healthcheck" log " - lecoffre-front: 30s start_period + healthcheck" # Attendre que tous les services soient healthy log "🔍 Vérification de l'état des services..." sleep 10 # Vérifier l'état du scan de sdk_relay check_scan_status # Étape 5: Vérification finale log "🔍 Vérification finale de tous les services..." services=( "tor:9050" "bitcoin:8332" "blindbit:8000" "sdk_storage:8081" "sdk_relay:8091" "sdk_signer:8092" "ihm_client:3003" "lecoffre-back:8080" "lecoffre-front:3004" ) all_ready=true for service in "${services[@]}"; do name=$(echo $service | cut -d: -f1) port=$(echo $service | cut -d: -f2) if curl -f -s "http://127.0.0.1:$port" > /dev/null 2>&1; then log_success "$name est accessible" else log_warning "$name n'est pas accessible" all_ready=false fi done if [ "$all_ready" = true ]; then log_success "Tous les services sont prêts !" log "📊 État des services:" docker compose ps else log_warning "Certains services ne sont pas prêts" log "📋 Logs des services problématiques:" docker compose logs --tail=20 exit 1 fi } # Fonction de redémarrage intelligent restart_services() { log "Redémarrage intelligent des services..." # Arrêter les services qui dépendent d'externes log "Arrêt des services dépendants..." docker stop lecoffre-back lecoffre-front ihm_client 2>/dev/null || true # Attendre que les dépendances externes soient disponibles log "Attente de la disponibilité des dépendances externes..." local max_attempts=30 local attempt=0 while [ $attempt -lt $max_attempts ]; do if validate_external_dependencies; then log_success "Dépendances externes disponibles" break fi attempt=$((attempt + 1)) log "Tentative $attempt/$max_attempts - Attente 10s..." sleep 10 done if [ $attempt -eq $max_attempts ]; then log_error "Dépendances externes non disponibles après $max_attempts tentatives" return 1 fi # Redémarrer les services log "Redémarrage des services..." docker start lecoffre-back lecoffre-front ihm_client # Attendre que les services soient prêts log "Attente de la disponibilité des services..." sleep 15 log_success "Redémarrage terminé !" } # Gestion des arguments case "${1:-start}" in "start") start_services ;; "restart") restart_services ;; "validate") validate_external_dependencies ;; "monitor") log "📊 Démarrage du monitoring continu..." while true; do sleep 60 log "🔄 Vérification périodique..." check_scan_status done ;; *) echo "Usage: $0 [start|restart|validate|monitor]" echo " start - Démarrage complet avec validation (défaut)" echo " restart - Redémarrage intelligent après réparation" echo " validate - Validation des dépendances externes uniquement" echo " monitor - Monitoring continu" exit 1 ;; esac