4NK_node/restart_4nk_node.sh
Debian 5c60af349d
Some checks failed
CI - 4NK_node / Security Tests (push) Failing after 27s
CI - 4NK_node / Documentation Tests (push) Failing after 3s
CI - 4NK_node / Security Audit (push) Successful in 3s
CI - 4NK_node / Release Guard (push) Has been skipped
CI - 4NK_node / Performance Tests (push) Successful in 27s
CI - 4NK_node / Notify (push) Failing after 1s
CI - 4NK_node / Publish Release (push) Has been skipped
CI - 4NK_node / Code Quality (push) Failing after 30s
CI - 4NK_node / Unit Tests (push) Failing after 29s
CI - 4NK_node / Integration Tests (push) Failing after 33s
CI - 4NK_node / Docker Build & Test (push) Failing after 10s
feat(config): centralize restart config; add conf/restart_config.conf; adapt restart script; add skeleton external_nodes.conf; update README
2025-09-04 19:44:15 +00:00

523 lines
16 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 Redémarrage Complet 4NK Node
# =============================================================================
# Date: $(date)
# Motif: Redémarrage propre pour intégrer dev3.4nkweb.com
# =============================================================================
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)"
SCRIPT_DIR="${PROJECT_DIR}"
CONFIG_FILE="$SCRIPT_DIR/conf/restart_config.conf"
if [ -f "$CONFIG_FILE" ]; then
# Import restart configuration from external file
# shellcheck disable=SC1091
# shellcheck source=/home/debian/code/4NK_dev/4NK_node/conf/restart_config.conf
source "$CONFIG_FILE"
fi
# Réseau Docker
NETWORK_NAME="4nk_network"
# Images Docker
TOR_IMAGE="4nk-node-tor:docker-support-v2"
BITCOIN_IMAGE="4nk-node-bitcoin:docker-support-v2"
BLINDBIT_IMAGE="4nk-node-blindbit:docker-support-v2"
RELAY_IMAGE="4nk-node-sdk_relay1:docker-support-v2"
# Volumes
BITCOIN_VOLUME="bitcoin_data"
BLINDBIT_VOLUME="blindbit_data"
RELAY_1_VOLUME="sdk_relay_1_data"
RELAY_2_VOLUME="sdk_relay_2_data"
RELAY_3_VOLUME="sdk_relay_3_data"
# Ports
TOR_PORTS=("9050:9050" "9051:9051")
BITCOIN_PORTS=("38333:38333" "18443:18443" "29000:29000")
BLINDBIT_PORTS=("8000:8000")
RELAY_1_PORTS=("8090:8090" "8091:8091")
RELAY_2_PORTS=("8092:8090" "8093:8091")
RELAY_3_PORTS=("8094:8090" "8095:8091")
# Chemins de configuration
BITCOIN_CONF="$PROJECT_DIR/conf/bitcoin.conf"
BLINDBIT_CONF="$PROJECT_DIR/conf/blindbit.toml"
RELAY_1_CONF="$PROJECT_DIR/conf/sdk_relay1.conf"
RELAY_2_CONF="$PROJECT_DIR/conf/sdk_relay2.conf"
RELAY_3_CONF="$PROJECT_DIR/conf/sdk_relay3.conf"
EXTERNAL_NODES_CONF="$PROJECT_DIR/scripts/sdk_relay/external_nodes.conf"
# Variables d'environnement communes
COMMON_ENV=(
"RUST_LOG=debug,bitcoincore_rpc=trace"
"HOME=/home/bitcoin"
"BITCOIN_COOKIE_PATH=/home/bitcoin/.bitcoin/signet/.cookie"
"ENABLE_SYNC_TEST=1"
)
# Silence potential linter warnings about unused variables from imported config
: "${RELAY_1_VOLUME}"
: "${RELAY_2_VOLUME}"
: "${RELAY_3_VOLUME}"
: "${RELAY_1_PORTS[@]}"
: "${RELAY_2_PORTS[@]}"
: "${RELAY_3_PORTS[@]}"
: "${RELAY_1_CONF}"
: "${RELAY_2_CONF}"
: "${RELAY_3_CONF}"
# =============================================================================
# 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_container() {
local container_name=$1
local max_attempts=${2:-30}
local attempt=1
print_info "Attente du démarrage de $container_name..."
while [ $attempt -le $max_attempts ]; do
if docker ps --format "table {{.Names}}" | grep -q "^$container_name$"; then
if docker ps --format "table {{.Status}}" --filter "name=$container_name" | grep -q "Up"; then
print_success "$container_name est démarré"
return 0
fi
fi
echo -n "."
sleep 2
((attempt++))
done
print_error "Timeout: $container_name n'a pas démarré dans les temps"
return 1
}
check_file_exists() {
local file_path=$1
local description=$2
if [ ! -f "$file_path" ]; then
print_error "Fichier manquant: $description ($file_path)"
return 1
fi
print_success "Fichier trouvé: $description"
return 0
}
build_port_mapping() {
local ports=("$@")
local mapping=""
for port in "${ports[@]}"; do
if [ -n "$mapping" ]; then
mapping="$mapping -p $port"
else
mapping="-p $port"
fi
done
echo "$mapping"
}
build_env_vars() {
local env_vars=""
for env_var in "${COMMON_ENV[@]}"; do
if [ -n "$env_vars" ]; then
env_vars="$env_vars -e $env_var"
else
env_vars="-e $env_var"
fi
done
echo "$env_vars"
}
# =============================================================================
# FONCTIONS PRINCIPALES
# =============================================================================
stop_all_services() {
print_header "ARRÊT DE TOUS LES SERVICES"
print_step "Arrêt de tous les conteneurs"
local _running_ids
_running_ids=$(docker ps -q 2>/dev/null || true)
if [ -n "${_running_ids}" ]; then
IFS=' ' read -r -a _ids_array <<< "${_running_ids}"
docker stop "${_ids_array[@]}" 2>/dev/null || true
fi
print_step "Arrêt de docker-compose"
docker-compose down -v 2>/dev/null || true
print_step "Vérification qu'aucun conteneur ne tourne"
if docker ps --format "table {{.Names}}" | grep -q .; then
print_warning "Des conteneurs sont encore en cours d'exécution"
docker ps
else
print_success "Aucun conteneur en cours d'exécution"
fi
}
cleanup_containers() {
print_header "NETTOYAGE COMPLET"
print_step "Suppression de tous les conteneurs"
local _to_remove
_to_remove=$(docker ps -aq 2>/dev/null || true)
if [ -n "$_to_remove" ]; then
IFS=' ' read -r -a _to_remove_arr <<< "$_to_remove"
local _removed
_removed=$(docker rm -f "${_to_remove_arr[@]}" 2>/dev/null || true)
if [ -n "$_removed" ]; then
print_info "Conteneurs supprimés: $_removed"
else
print_info "Aucun conteneur à supprimer"
fi
else
print_info "Aucun conteneur à supprimer"
fi
print_step "Nettoyage des réseaux"
local removed_networks
removed_networks=$(docker network prune -f 2>/dev/null || true)
if [ -n "$removed_networks" ]; then
print_info "Réseaux supprimés: $removed_networks"
else
print_info "Aucun réseau à supprimer"
fi
}
create_network() {
print_header "CRÉATION DU RÉSEAU"
print_step "Création du réseau Docker: $NETWORK_NAME"
local network_id
network_id=$(docker network create "$NETWORK_NAME" 2>/dev/null || true)
if [ -n "$network_id" ]; then
print_success "Réseau créé: $network_id"
else
print_info "Réseau déjà existant ou erreur"
fi
}
start_tor() {
print_header "DÉMARRAGE DE TOR PROXY"
print_step "Démarrage de Tor Proxy"
local tor_ports
tor_ports=$(build_port_mapping "${TOR_PORTS[@]}")
local tor_container_id
tor_container_id=$(docker run -d \
--name tor-proxy \
--network "$NETWORK_NAME" \
--network-alias tor \
$tor_ports \
"$TOR_IMAGE")
print_success "Tor Proxy démarré: $tor_container_id"
wait_for_container "tor-proxy" 10
}
start_bitcoin() {
print_header "DÉMARRAGE DE BITCOIN CORE"
# Vérification du fichier de configuration
check_file_exists "$BITCOIN_CONF" "Configuration Bitcoin"
print_step "Démarrage de Bitcoin Core"
local bitcoin_ports
bitcoin_ports=$(build_port_mapping "${BITCOIN_PORTS[@]}")
local bitcoin_container_id
bitcoin_container_id=$(docker run -d \
--name bitcoin-signet \
--network "$NETWORK_NAME" \
--network-alias bitcoin \
$bitcoin_ports \
-v "$BITCOIN_VOLUME:/home/bitcoin/.bitcoin" \
-v "$BITCOIN_CONF:/home/bitcoin/bitcoin.conf" \
"$BITCOIN_IMAGE")
print_success "Bitcoin Core démarré: $bitcoin_container_id"
wait_for_container "bitcoin-signet" 15
}
start_blindbit() {
print_header "DÉMARRAGE DE BLINDBIT ORACLE"
# Vérification du fichier de configuration
check_file_exists "$BLINDBIT_CONF" "Configuration Blindbit"
print_step "Démarrage de Blindbit Oracle"
local blindbit_ports
blindbit_ports=$(build_port_mapping "${BLINDBIT_PORTS[@]}")
local blindbit_container_id
blindbit_container_id=$(docker run -d \
--name blindbit-oracle \
--network "$NETWORK_NAME" \
--network-alias blindbit \
$blindbit_ports \
-v "$BLINDBIT_VOLUME:/data" \
-v "$BLINDBIT_CONF:/data/blindbit.toml" \
-v "$BITCOIN_VOLUME:/home/bitcoin/.bitcoin" \
"$BLINDBIT_IMAGE")
print_success "Blindbit Oracle démarré: $blindbit_container_id"
wait_for_container "blindbit-oracle" 15
}
build_relay_image() {
print_header "CONSTRUCTION DE L'IMAGE SDK_RELAY"
print_step "Construction de l'image sdk_relay"
print_info "Cette étape peut prendre plusieurs minutes..."
if docker build -f sdk_relay/Dockerfile -t "$RELAY_IMAGE" ..; then
print_success "Image sdk_relay construite avec succès"
else
print_error "Échec de la construction de l'image sdk_relay"
exit 1
fi
}
start_relay() {
local relay_number=$1
local relay_name="sdk_relay_$relay_number"
local relay_conf_var="RELAY_${relay_number}_CONF"
local relay_conf="${!relay_conf_var}"
local relay_volume_var="RELAY_${relay_number}_VOLUME"
local relay_volume="${!relay_volume_var}"
local relay_ports_var="RELAY_${relay_number}_PORTS[@]"
local relay_ports=("${!relay_ports_var}")
print_header "DÉMARRAGE DE RELAY $relay_number"
# Vérification du fichier de configuration
check_file_exists "$relay_conf" "Configuration Relay $relay_number"
# Vérification du fichier de configuration externe
check_file_exists "$EXTERNAL_NODES_CONF" "Configuration des nœuds externes"
print_step "Démarrage de $relay_name"
local ports_mapping
ports_mapping=$(build_port_mapping "${relay_ports[@]}")
local env_vars
env_vars=$(build_env_vars)
local relay_container_id
relay_container_id=$(docker run -d \
--name "$relay_name" \
--network "$NETWORK_NAME" \
--network-alias "$relay_name" \
$ports_mapping \
-v "$BITCOIN_VOLUME:/home/bitcoin/.bitcoin" \
-v "$BITCOIN_CONF:/home/bitcoin/bitcoin.conf" \
-v "$relay_volume:/home/bitcoin/.4nk" \
-v "$relay_conf:/home/bitcoin/.conf.docker" \
-v "$PROJECT_DIR/sdk_relay/external_nodes.conf:/home/bitcoin/.4nk/external_nodes.conf" \
$env_vars \
"$RELAY_IMAGE" \
/bin/sh -c "cp /home/bitcoin/.conf.docker /home/bitcoin/.conf && cp /home/bitcoin/.bitcoin/signet/.cookie /home/bitcoin/.4nk/bitcoin.cookie && chmod 600 /home/bitcoin/.4nk/bitcoin.cookie && /usr/local/bin/sdk_relay --config .conf")
print_success "$relay_name démarré: $relay_container_id"
wait_for_container "$relay_name" 20
}
start_all_relays() {
print_header "DÉMARRAGE DE TOUS LES RELAYS"
start_relay 1
start_relay 2
start_relay 3
}
verify_final_status() {
print_header "VÉRIFICATION FINALE"
print_step "État de tous les services"
docker ps
print_step "Résumé des services actifs"
echo -e "${GREEN}Services en cours d'exécution:${NC}"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
print_step "Vérification des ports"
local expected_services=("tor-proxy" "bitcoin-signet" "blindbit-oracle" "sdk_relay_1" "sdk_relay_2" "sdk_relay_3")
local running_services=0
for service in "${expected_services[@]}"; do
if docker ps --format "table {{.Names}}" | grep -q "^$service$"; then
print_success "$service: ✅ En cours d'exécution"
((running_services++))
else
print_error "$service: ❌ Non démarré"
fi
done
print_info "Services actifs: $running_services/${#expected_services[@]}"
if [ $running_services -eq ${#expected_services[@]} ]; then
print_success "Tous les services sont opérationnels !"
else
print_warning "Certains services ne sont pas démarrés"
exit 1
fi
}
show_usage() {
echo -e "${BLUE}Usage: $0 [OPTIONS]${NC}"
echo ""
echo -e "${CYAN}Options:${NC}"
echo -e " ${GREEN}-h, --help${NC} Afficher cette aide"
echo -e " ${GREEN}-s, --stop${NC} Arrêter tous les services"
echo -e " ${GREEN}-c, --clean${NC} Nettoyer les conteneurs"
echo -e " ${GREEN}-n, --network${NC} Créer le réseau"
echo -e " ${GREEN}-t, --tor${NC} Démarrer Tor"
echo -e " ${GREEN}-b, --bitcoin${NC} Démarrer Bitcoin"
echo -e " ${GREEN}-l, --blindbit${NC} Démarrer Blindbit"
echo -e " ${GREEN}-r, --relays${NC} Démarrer les relais"
echo -e " ${GREEN}-v, --verify${NC} Vérifier le statut"
echo ""
echo -e "${CYAN}Exemples:${NC}"
echo -e " ${GREEN}$0${NC} Redémarrage complet"
echo -e " ${GREEN}$0 -s${NC} Arrêter tous les services"
echo -e " ${GREEN}$0 -r${NC} Démarrer uniquement les relais"
echo ""
}
# =============================================================================
# FONCTION PRINCIPALE
# =============================================================================
main() {
print_header "SCRIPT DE REDÉMARRAGE COMPLET $PROJECT_NAME"
print_info "Répertoire de travail: $PROJECT_DIR"
print_info "Date: $(date)"
# Traitement des arguments
if [ $# -eq 0 ]; then
# Redémarrage complet par défaut
stop_all_services
cleanup_containers
create_network
start_tor
start_bitcoin
start_blindbit
build_relay_image
start_all_relays
verify_final_status
else
# Traitement des options
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_usage
exit 0
;;
-s|--stop)
stop_all_services
;;
-c|--clean)
cleanup_containers
;;
-n|--network)
create_network
;;
-t|--tor)
start_tor
;;
-b|--bitcoin)
start_bitcoin
;;
-l|--blindbit)
start_blindbit
;;
-r|--relays)
build_relay_image
start_all_relays
;;
-v|--verify)
verify_final_status
;;
*)
print_error "Option inconnue: $1"
show_usage
exit 1
;;
esac
shift
done
fi
print_header "REDÉMARRAGE TERMINÉ"
print_success "L'infrastructure $PROJECT_NAME est maintenant opérationnelle !"
print_info "Services actifs: $(docker ps --format "table {{.Names}}" | wc -l)"
print_info "Ports exposés: $(docker ps --format "table {{.Ports}}" | grep -o '[0-9]*->[0-9]*' | wc -l)"
}
# =============================================================================
# EXÉCUTION
# =============================================================================
# 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
# Exécution du script principal
main "$@"