#!/bin/bash # ============================================================================= # Script de Gestion des Services 4NK Node # ============================================================================= # Date: $(date) # Description: Arrêter, nettoyer et relancer tous les services # ============================================================================= set -e # Arrêter en cas d'erreur # ============================================================================= # CONFIGURATION # ============================================================================= # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Configuration du projet PROJECT_NAME="4NK Node" PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" COMPOSE_FILE="$PROJECT_DIR/docker-compose.yml" # ============================================================================= # FONCTIONS UTILITAIRES # ============================================================================= print_header() { echo -e "${BLUE}=============================================================================${NC}" echo -e "${BLUE}$1${NC}" echo -e "${BLUE}=============================================================================${NC}" } print_step() { echo -e "${CYAN}🔄 $1${NC}" } print_success() { echo -e "${GREEN}✅ $1${NC}" } print_warning() { echo -e "${YELLOW}⚠️ $1${NC}" } print_error() { echo -e "${RED}❌ $1${NC}" } print_info() { echo -e "${PURPLE}ℹ️ $1${NC}" } wait_for_service() { local service_name=$1 local max_attempts=30 local attempt=1 print_step "Attente du service $service_name..." while [ $attempt -le $max_attempts ]; do if docker compose -f "$COMPOSE_FILE" ps "$service_name" | grep -q "Up"; then print_success "Service $service_name est prêt" return 0 fi echo -n "." sleep 2 attempt=$((attempt + 1)) done print_warning "Service $service_name n'est pas prêt après $max_attempts tentatives" return 1 } # ============================================================================= # FONCTIONS PRINCIPALES # ============================================================================= stop_all_services() { print_header "ARRÊT DE TOUS LES SERVICES" if [ -f "$COMPOSE_FILE" ]; then print_step "Arrêt des services Docker Compose..." docker compose -f "$COMPOSE_FILE" down --timeout 30 print_success "Services Docker Compose arrêtés" else print_warning "Fichier docker-compose.yml non trouvé" fi # Arrêt des conteneurs individuels au cas où print_step "Arrêt des conteneurs individuels..." docker stop $(docker ps -q --filter "name=4nk" --filter "name=tor" --filter "name=bitcoin" --filter "name=blindbit" --filter "name=sdk" --filter "name=proxy") 2>/dev/null || true print_success "Conteneurs individuels arrêtés" } cleanup_containers() { print_header "NETTOYAGE DES CONTENEURS" print_step "Suppression des conteneurs arrêtés..." docker container prune -f print_success "Conteneurs arrêtés supprimés" print_step "Suppression des images non utilisées..." docker image prune -f print_success "Images non utilisées supprimées" print_step "Nettoyage des volumes non utilisés..." docker volume prune -f print_success "Volumes non utilisés supprimés" print_step "Nettoyage des réseaux non utilisés..." docker network prune -f print_success "Réseaux non utilisés supprimés" } cleanup_volumes() { print_header "NETTOYAGE COMPLET DES VOLUMES" print_warning "Cette opération supprimera TOUTES les données persistantes !" read -p "Êtes-vous sûr de vouloir continuer ? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then print_step "Suppression des volumes 4NK..." docker volume rm $(docker volume ls -q --filter "name=4nk_node") 2>/dev/null || true print_success "Volumes 4NK supprimés" else print_info "Nettoyage des volumes annulé" fi } start_all_services() { print_header "DÉMARRAGE DE TOUS LES SERVICES" if [ ! -f "$COMPOSE_FILE" ]; then print_error "Fichier docker-compose.yml non trouvé dans $PROJECT_DIR" exit 1 fi print_step "Construction des images Docker..." docker compose -f "$COMPOSE_FILE" build --no-cache print_success "Images construites" print_step "Démarrage de tous les services..." docker compose -f "$COMPOSE_FILE" up -d print_success "Services démarrés" # Attente des services critiques print_step "Attente des services critiques..." wait_for_service "tor" wait_for_service "bitcoin" wait_for_service "blindbit" print_success "Services critiques prêts" } show_status() { print_header "STATUT DES SERVICES" echo "" print_info "Conteneurs en cours d'exécution:" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(4nk|tor|bitcoin|blindbit|sdk|proxy)" || echo "Aucun conteneur 4NK en cours d'exécution" echo "" print_info "Services Docker Compose:" if [ -f "$COMPOSE_FILE" ]; then docker compose -f "$COMPOSE_FILE" ps else print_warning "Fichier docker-compose.yml non trouvé" fi echo "" print_info "Volumes 4NK:" docker volume ls --filter "name=4nk_node" echo "" print_info "Réseaux 4NK:" docker network ls --filter "name=4nk_node" } show_logs() { print_header "LOGS DES SERVICES" if [ -f "$COMPOSE_FILE" ]; then docker compose -f "$COMPOSE_FILE" logs --tail=50 -f else print_error "Fichier docker-compose.yml non trouvé" fi } # ============================================================================= # FONCTION PRINCIPALE # ============================================================================= main() { print_header "SCRIPT DE GESTION DES SERVICES $PROJECT_NAME" print_info "Répertoire de travail: $PROJECT_DIR" print_info "Fichier compose: $COMPOSE_FILE" print_info "Date: $(date)" # Traitement des arguments case "${1:-restart}" in "stop") stop_all_services ;; "clean") stop_all_services cleanup_containers ;; "clean-all") stop_all_services cleanup_containers cleanup_volumes ;; "start") start_all_services ;; "restart") stop_all_services cleanup_containers start_all_services ;; "status") show_status ;; "logs") show_logs ;; "help"|"-h"|"--help") echo "" echo -e "${CYAN}Usage: $0 [COMMANDE]${NC}" echo "" echo -e "${GREEN}Commandes disponibles:${NC}" echo -e " ${GREEN}stop${NC} Arrêter tous les services" echo -e " ${GREEN}clean${NC} Arrêter et nettoyer les conteneurs" echo -e " ${GREEN}clean-all${NC} Arrêter, nettoyer conteneurs et volumes" echo -e " ${GREEN}start${NC} Démarrer tous les services" echo -e " ${GREEN}restart${NC} Arrêter, nettoyer et redémarrer (défaut)" echo -e " ${GREEN}status${NC} Afficher le statut des services" echo -e " ${GREEN}logs${NC} Afficher les logs en temps réel" echo -e " ${GREEN}help${NC} Afficher cette aide" echo "" echo -e "${CYAN}Exemples:${NC}" echo -e " ${GREEN}$0${NC} Redémarrage complet" echo -e " ${GREEN}$0 stop${NC} Arrêter tous les services" echo -e " ${GREEN}$0 status${NC} Vérifier le statut" echo "" exit 0 ;; *) print_error "Commande inconnue: $1" print_info "Utilisez '$0 help' pour voir les commandes disponibles" exit 1 ;; esac print_header "OPÉRATION TERMINÉE" print_success "Gestion des services $PROJECT_NAME terminée !" } # ============================================================================= # VÉRIFICATIONS PRÉALABLES # ============================================================================= # Vérification de Docker if ! command -v docker &> /dev/null; then print_error "Docker n'est pas installé ou n'est pas dans le PATH" exit 1 fi # Vérification que Docker daemon est en cours d'exécution if ! docker info &> /dev/null; then print_error "Docker daemon n'est pas en cours d'exécution" exit 1 fi # Vérification de Docker Compose if ! docker compose version &> /dev/null; then print_error "Docker Compose n'est pas installé ou n'est pas dans le PATH" exit 1 fi # ============================================================================= # EXÉCUTION # ============================================================================= main "$@"