- Amélioration du script startup-sequence.sh avec validation des dépendances externes - Ajout de healthchecks robustes dans docker-compose.yml - Documentation complète des améliorations et procédures - Règles Cursor pour éviter la prolifération de scripts - Validation automatique de dev3.4nkweb.com:9090 avant démarrage - Redémarrage intelligent après réparation des services externes
248 lines
7.3 KiB
Bash
Executable File
248 lines
7.3 KiB
Bash
Executable File
#!/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/tcp/$EXTERNAL_SIGNER_HOST/$EXTERNAL_SIGNER_PORT" 2>/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
|