4NK_node/scripts/manage_services.sh
Debian 49b30a7ef1
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
feat: Ajout du script de gestion des services et documentation
- 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
2025-08-29 15:37:32 +00:00

295 lines
9.0 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"