
Some checks failed
CI - 4NK_node / Code Quality (push) Failing after 50s
CI - 4NK_node / Unit Tests (push) Failing after 36s
CI - 4NK_node / Integration Tests (push) Successful in 34s
CI - 4NK_node / Security Tests (push) Failing after 32s
CI - 4NK_node / Docker Build & Test (push) Failing after 15s
CI - 4NK_node / Documentation Tests (push) Successful in 11s
CI - 4NK_node / Security Audit (push) Successful in 9s
CI - 4NK_node / Release Guard (push) Has been skipped
CI - 4NK_node / Performance Tests (push) Successful in 34s
CI - 4NK_node / Notify (push) Failing after 2s
CI - 4NK_node / Publish Release (push) Has been skipped
- Ajout du script manage_services.sh pour arrêter, nettoyer et redémarrer les services - Documentation complète du script dans docs/scripts/ - Tests unitaires pour le script dans tests/scripts/ - Correction des contextes de build dans docker-compose.yml
295 lines
9.0 KiB
Bash
Executable File
295 lines
9.0 KiB
Bash
Executable File
#!/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 "$@"
|