lecoffre_node/scripts/startup-sequence.sh
Nicolas Cantu 17a8b54f1e Amélioration du démarrage et déploiement
- 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
2025-09-20 10:33:06 +00:00

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